📜  SQLAlchemy ORM-声明映射

📅  最后修改于: 2020-11-27 07:42:19             🧑  作者: Mango


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()

声明基类后,就可以定义任何数量的映射类。以下代码定义了客户的类。它包含要映射到的表以及其中的列的名称和数据类型。

class Customers(Base):
   __tablename__ = 'customers'
   
   id = Column(Integer, primary_key = True)
   name = Column(String)
   address = Column(String)
   email = Column(String)

声明式中的类必须具有__tablename__属性,并且至少有一个Column是主键的一部分。声明式将所有Column对象替换为称为描述符的特殊Python访问器。此过程称为检测,它提供了在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,它将在其中显示具有上述结构的客户表。

客户表