SQLAlchemy ORM – 声明映射
SQLAlchemy ORM – 声明映射
SQLAlchemy 的对象关系映射器 API 的主要目标是促进将用户定义的 Python 类与数据库表以及这些类的对象与其对应表中的行相关联。对象和行的状态变化相互同步匹配。SQLAlchemy 能够根据用户定义的类及其定义的关系来表达数据库查询。
ORM 构建在 SQL 表达式语言之上。它是一种高级和抽象的使用模式。实际上,ORM 是表达式语言的应用用法。
尽管可以专门使用对象关系映射器构建成功的应用程序,但有时使用 ORM 构建的应用程序可能会在需要特定数据库交互的情况下直接使用表达式语言。
声明映射
首先,调用 create_engine() 函数设置一个引擎对象,该对象随后用于执行 SQL 操作。该函数有两个参数,一个是数据库的名称,另一个是当设置为 True 时将生成活动日志的 echo 参数。如果它不存在,将创建数据库。在以下示例中,创建了一个 SQLite 数据库。
from sqlalchemy import create_engine engine = create_engine('sqlite:///sales.db', echo = True)
当调用 Engine.execute() 或 Engine.connect() 等方法时,引擎会建立到数据库的真实 DBAPI 连接。然后用于发出不直接使用引擎的 SQLORM;相反,它由 ORM 在幕后使用。
在 ORM 的情况下,配置过程首先描述数据库表,然后定义将映射到这些表的类。在 SQLAlchemy 中,这两个任务是一起执行的。这是通过使用声明式系统完成的;创建的类包括用于描述它们映射到的实际数据库表的指令。
基类在声明式系统中存储类和映射表的目录。这称为声明性基类。在通常导入的模块中通常只有一个此基础的实例。declarative_base() 函数用于创建基类。该函数在 sqlalchemy.ext.declarative 模块中定义。
from sqlalchemy.ext.declarative import declarative_base Base = declarative_base()
一旦声明了基类,就可以根据它定义任意数量的映射类。以下代码定义了一个 Customer 的类。它包含要映射到的表,以及其中列的名称和数据类型。
class Customers(Base): __tablename__ = 'customers' id = Column(Integer, primary_key = True) name = Column(String) address = Column(String) email = Column(String)
Declarative 中的类必须具有__tablename__属性,并且至少有一个Column作为主键的一部分。声明性用称为描述符的特殊 Python 访问器替换所有Column对象。这个过程被称为检测,它提供了在 SQL 上下文中引用表的方法,并支持从数据库中持久化和加载列的值。
这个映射类就像一个普通的 Python 类一样,具有符合要求的属性和方法。
声明式系统中关于类的信息,称为表元数据。SQLAlchemy 使用 Table 对象来表示由 Declarative 创建的特定表的此信息。Table对象按照规范创建,通过构造Mapper对象与类关联。这个映射器对象不是直接使用的,而是在内部用作映射类和表之间的接口。
每个 Table 对象都是称为 MetaData 的更大集合的成员,并且可以使用声明性基类的.metadata属性访问该对象。所述MetaData.create_all()方法是,在我们的发动机传递的数据库连接的源极。对于尚未创建的所有表,它会向数据库发出 CREATE TABLE 语句。
Base.metadata.create_all(engine)
创建数据库和表以及映射 Python 类的完整脚本如下 –
from sqlalchemy import Column, Integer, String from sqlalchemy import create_engine engine = create_engine('sqlite:///sales.db', echo = True) from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Customers(Base): __tablename__ = 'customers' id = Column(Integer, primary_key=True) name = Column(String) address = Column(String) email = Column(String) Base.metadata.create_all(engine)
执行时,Python 控制台将在执行 SQL 表达式后回显 –
CREATE TABLE customers ( id INTEGER NOT NULL, name VARCHAR, address VARCHAR, email VARCHAR, PRIMARY KEY (id) )
如果我们使用 SQLiteStudio 图形工具打开 Sales.db,它会以上述结构显示其中的客户表。