SQLAlchemy ORM - 声明映射


SQLAlchemy 的对象关系映射器 API 的主要目标是促进将用户定义的 Python 类与数据库表相关联,以及将这些类的对象与相应表中的行相关联。对象和行的状态变化是同步匹配的。SQLAlchemy 能够根据用户定义的类及其定义的关系来表达数据库查询。

ORM 构建在 SQL 表达式语言之上。它是一种高级且抽象的使用模式。事实上,ORM是表达语言的一种应用。

虽然成功的应用程序可以专门使用对象关系映射器构建,但有时使用 ORM 构建的应用程序可以在需要特定数据库交互的地方直接使用表达式语言。

声明映射

首先,调用create_engine()函数来设置一个引擎对象,该对象随后用于执行SQL操作。该函数有两个参数,一个是数据库名称,另一个是 echo 参数,当设置为 True 时将生成活动日志。如果不存在,将创建数据库。在以下示例中,创建了一个 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)

声明式中的类必须具有__tablename__属性,并且至少有一个作为主键一部分的。声明式用称为描述符的特殊 Python 访问器替换所有Column对象。此过程称为检测,它提供了在 SQL 上下文中引用表的方法,并支持持久保存和加载数据库中的列值。

这个映射类就像普通的 Python 类一样,具有根据要求的属性和方法。

声明式系统中有关类的信息称为表元数据。SQLAlchemy 使用 Table 对象来表示由声明式创建的特定表的此信息。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,它会显示其中具有上述结构的客户表。

客户表