关于 ORMS 的简介
- SQLAlchemy 是最流行的开源库,用于从 Python 处理关系数据库。
- 它是一种 ORM 库,又名 对象关系映射 库,它提供了一个接口,用于使用 面向对象的编程 与数据库进行交互。
存在于其他语言中的其他 ORM 库包括:用于 NodeJS 应用程序的 Sequelize 和 javascript 库 Bookshelf.js ,在 Ruby on Rails 中使用 的 ruby 库 ActiveRecord 和 用于在 PHP 上编写的应用程序的 CakePHP ,以及许多其他此类 ORM。
关于 ORM 的注释:它们是“最佳实践”吗?
使用 ORM 与数据库交互只是 众多 有效方法之一,您可以通过这些方法向 Web 应用程序添加额外的抽象层,以便更轻松地与数据库交互。您可以使用其他类型的查询构建器库,它们介于直接与数据库对话(使用像 pyscopg2 这样的数据库驱动程序库)和使用 ORM 之间。ORM 被认为是您可以添加到 Web 应用程序以进行数据库管理的最高抽象级别。Query Builder 库位于中间的某个位置。关于 ORM 是否在所有情况下都是最佳实践方法,有很多不同的意见, 例如一些人认为:“为什么应该避免使用 ORM” .
值得庆幸的是,SQLAlchemy 恰好在数据库驱动程序和 ORM 之间提供了您喜欢的多个抽象级别,因此您可以根据自己的喜好自定义 Web 应用程序的开发。
SQLAlchemy ORM 库:
-
基于 函数的查询构造 :允许通过 Python 函数和表达式构建 SQL 子句。
-
避免编写原始 SQL 。它生成 SQL 和 Python 代码供您访问表,从而减少与数据库相关的开销,就您需要编写的与模型交互的整体代码量而言。
-
此外,您 可以避免在每次调用时都向数据库发送 SQL 。SQLAlchemy ORM 库具有 自动缓存 、缓存集合和对象之间的引用,一旦最初加载。
SQLAlchemy 与 psycopg2
- SQLAlchemy 生成 SQL 语句
- psycopg2 直接 向数据库 发送 SQL 语句。
- SQLAlchemy 依赖于 psycopg2或其他数据库驱动程序在后台与数据库通信。
SQLALchemy 允许您遍历所有 3 个抽象层以与您的数据库进行交互。
- 如果没有 SQLAlchemy,我们只能使用 DBAPI 来建立连接和执行 SQL 语句。简单,但随着复杂性的增加不可扩展。
- SQLAlchemy 提供了多个抽象层和方便的工具来与数据库交互。
- SQLAlchemy 可以停留在ORM层面
- 可以深入数据库操作,在表达式级别运行特定于数据库的自定义 SQL 代码。
- 可以编写原始 SQL 以在需要时在引擎级别执行。在这种情况下可以更简单地使用
psycopg2
SQLAlchemy 抽象层
-
Dialect
Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:
MySQL-Python mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname> pymysql mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>] MySQL-Connector mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname> cx_Oracle oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
关于中文的处理:
sqlalchemy设置编码字符集一定要在数据库访问的URL上增加charset=utf8,否则数据库的连接就不是utf8的编码格式
eng = create_engine('mysql://root:root@localhost:3306/test2?charset=utf8',echo=True)
-
Connection Pool 连接池
- 处理断开的连接
- 避免对数据库进行非常多的小调用
- 避免为每次数据更改打开和关闭连接
-
引擎 the engine
- 您可以选择如何与数据库交互的 3 个主要层中的第一个。
- 是与数据库交互的最低层。与使用 psycopg2 非常相似,直接管理连接。
- SQLAlchemy 中的引擎指的是:它本身、方言和连接池一起工作以与我们的数据库接口。
- 当我们创建 SQLAlchemy 引擎时,连接池会自动创建。
表格与类的映射关系:
表格 ——> 类
表记录 ——> 对象
列 ——> 属性
SQLAlchemy备忘录: