前言
- 网上的文章抄来抄去,本文也是😅
- 之前用
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

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

被折叠的 条评论
为什么被折叠?



