sqlalchemy封装自用

本文深入探讨了SQLAlchemy在Python中的应用,包括创建数据库引擎、表定义、对象关系映射及封装技巧,同时提供了Oracle数据库特定的字段类型和环境配置。

前言

  • 网上的文章抄来抄去,本文也是😅
  • 之前用pymysql很爽,因为简单
  • 用cx_Oracle操作数据库,bug蛮多,尤其在公司Oracle命名不规范的情况下
  • 只好改用sqlalchemy,bug少了,但是代码丑了不少,找接口的过程也是呕心沥血
  • 下面是sqlalchemy的一些个人总结,包含一些藏得比较深的接口
    (alchemy 🔉 /ˈælkəmi/ 📖 n. 点金术;魔力)

ORM

  • 对象关系映射(Object Relational Mapping):
    对象,是指 面向对象编程语言 中的对象
    关系,是指 关系数据库模型
    映射,是对 面向对象编程语言中的对象 和 关系数据库模型中的数据 建立关系

  • 例如:
    用一个Python的Student类,去对应数据库中的一张student表
    类中的属性 对应 表中的列
    一个Student对象 对应 student表中的一行数据
    Student对象的add()方法 对应 数据库的insert语句

  • 优点:
    ORM框架能自动生成SQL语句,提高了开发效率,让程序员可以专注于业务代码上
    提高代码移植性

  • 缺点
    执行效率低于直接写SQL
    不适用于复杂的查询

sqlalchemy

SQL Alchemy是Python的一款ORM框架,可将 对象操作 转换成 SQL

# 创建连接引擎,这个engine是lazy模式,直到第一次被使用才真实创建
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/z?charset=utf8')

# 设计 表的基类
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String, Integer
Base = declarative_base()
class Student(Base):
    __tablename__ = 'student'  # 表名
    sid = Column(String(20), primary_key=True, comment='学号')  # 表字段
    age = Column(Integer, comment='年龄')  # 表字段
    __table_args__ = {
   
   'comment': '学生信息表'}  # 表注释
# 执行建表操作(继承Base的所有表)
Base.metadata.create_all(bind=engine)

# 创建ORM
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)  # 创建ORM基类
session = Session()  # 创建ORM对象
# 添加数据
tb_obj = Student(sid='a6', age=1)  # 创建表对象
session.add(tb_obj)  # 添加到ORM对象
session.commit()  # 提交
# 查询、修改
result = session.query(Student).filter_by(sid='a6').first()  # 查询
print(result)
result.age = 2  # 修改
session.commit()  # 提交
# 关闭ORM对象
session.close()

封装思想(3 parts)

  • 1️⃣ 创建连接引擎,这个engine是lazy模式,直到第一次被使用才真实创建
  • 这个engine可直接执行sql语句,其execute还包含commit操作,返回对象具有fetchall、fetchone等方法
from sqlalchemy import create_engine
# 创建引擎
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/z?charset=utf8')
# 执行sql
engine.execute('create table if not EXISTS t1(sid int PRIMARY KEY auto_increment,name char(32));')  # 建表
engine.execute('insert into t1 values(%(sid)s,%(name)s);', name='egon2', sid=2)  # 插入
engine.execute('insert into t1 values(%(sid)s,%(name)s);', name='egon7', sid=7)  # 插入
cur = engine.execute('select * from t1')  # 查询
print(cur.fetchone(), cur.fetchall())
print(type(cur), dir(cur))
engine.execute('drop table t1;')  # 删表
  • 2️⃣ 类 -> 表
from sqlalchemy import Column, String, Integer
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()  # 表的基类

class Student(Base):
    __tablename__ = 'student'
    sid = Column(String(20), primary_key=True)
    age = Column(Integer)

def create_tables(bind=engine):
    Base.metadata.create_all(bind=bind)  # 执行建表操作(继承Base的所有表)

def drop_tables(bind=engine):
    Base.metadata.drop_all(bind=bind)  # 执行删表操作(继承Base的所有表)
  • 3️⃣ 对象 -> 表中的记录
  • 4️⃣ sqlalchemy.orm.sessionmaker进行增删查改操作
class ORM:
    def __init__(self
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值