Python 是广受欢迎的脚本语言,SQLAlchemy 是 Python 的数据库访问组件,它可以用 SQL Builder 和 ORM 两种方式访问数据库,SQL Builder 较 ORM 性能优越,ORM 在 访问关联数据 / 修改数据 上较 SQL Builder 便捷,可按场景需求选用。对逻辑问题,用 SQL 和 Python 都可解决,但本着尽量简化 SQL 操作的原则,本文仅介绍了 SQLAlchemy 的常用操作,适用于大部分编程场景。
准备数据
假设已创建以下表
1 | -- posts |
数据库连接
连接 mysql 数据库
1 | import sqlalchemy as sa |
查看 sqlalchemy 版本
1 | sa.__version__ |
SQL 方式访问数据库
定义数据库表 Model
此 Model 可用于 SQL Builder
1 | dbMeta = sa.MetaData(bind=dbEngine) # type: MetaData |
创建连接
1 | dbconn = dbEngine.connect() |
查询
1 | stmt = sa.sql.select([TPost]) \ |
查询,直接用 SQL
1 | r = dbconn.execute(sa.text('SELECT * FROM posts WHERE id=:id'), id=7) |
插入
1 | r = dbconn.execute(TPost.insert(), [{'title': 'new title', 'content':'new content'}, {'title': 'new title2', 'content':'new content2'}]) |
修改
1 | stmt = TPost.update().values(title='new title', content='new content').where(TPost.c.id == 1) |
删除
1 | dbconn.execute(TPost.delete().where(TPost.c.id == 1)) |
ORM 方式访问数据库
定义 ORM Model
定义数据库表的 ORM Model,可用于 ORM 操作
1 | from sqlalchemy.ext.declarative import declarative_base |
注意:其中 delete-orphan
让 Post
被删除时,不关联更新 Comment
。参见官方文档 级联操作
创建 Session
session 管理查询状态并封装了 ORM,ORM 是一种在编程时比 SQL 更便捷的数据库操作方式,对数据库的增删操作尤其方便,但效率远不及 SQL 方式 session 需用 session maker 创建
1 | # 得到 Session Maker |
注意:每个 session 实例对其他实例对数据库的更改并不知情,如果需要得到最新数据,最简单的办法是创建新的 session
查询
1 | posts = dbsess.query(OPost.id, OPost.title, OPost.created_at, OPost) \ |
查询,直接用 SQL 子句
1 | dbsess.query(OPost).filter(sa.text("created_at<:created_at and title like :title")) \ |
查询,直接用 SQL
1 | dbsess.query(OPost).from_statement( \ |
查询,统计
1 | dbsess.query(OPost).filter(OPost.title.like("%a%")).count() |
插入
1 | post = OPost(title='hello world', content='to be or not to be? it\'s a problem.') |
插入多行
1 | dbsess.add_all([ |
修改
1 | post = dbsess.query(OPost).filter(OPost.id == 1).first() |
删除
1 | post = dbsess.query(OPost).filter(OPost.id == 1).first() |