基本用途¶

参见

本节描述关于声明性系统如何与SQLAlchemy ORM交互的详细信息。有关类映射的一般介绍,请参见 对象关系教程 以及 映射器配置 .

SQLAlchemy对象关系配置包括 Tablemapper() 和类对象以定义映射类。 declarative 允许在类声明中同时表示这三个变量。尽可能直接使用常规的SQLAlchemy模式和ORM构造,这样“经典”ORM用法和声明性ORM之间的配置就保持高度相似。

举个简单的例子:

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class SomeClass(Base):
    __tablename__ = 'some_table'
    id = Column(Integer, primary_key=True)
    name =  Column(String(50))

上面, declarative_base() Callable返回一个新的基类,所有映射类都应从该基类继承。类定义完成后,新的 Tablemapper() 将被生成。

生成的表和映射器可以通过 __table____mapper__ 上的属性 SomeClass 班级:

# access the mapped Table
SomeClass.__table__

# access the Mapper
SomeClass.__mapper__

定义属性

在上一个示例中, Column 对象将自动命名为其所分配的属性的名称。

要使用不同于其映射属性的名称显式命名列,只需为该列指定一个名称。下面,列“some_table_id”映射到的“id”属性 SomeClass ,但在SQL中将表示为“some_table_id”::

class SomeClass(Base):
    __tablename__ = 'some_table'
    id = Column("some_table_id", Integer, primary_key=True)

属性可以在构造后添加到类中,并将添加到基础中 Tablemapper() 适当定义:

SomeClass.data = Column('data', Unicode)
SomeClass.related = relationship(RelatedInfo)

使用声明性构造的类可以与显式映射的类自由交互 mapper() .

建议所有表共享同一基础,尽管不是必需的 MetaData 对象,以便配置字符串 ForeignKey 参考可以毫无问题地解决。

访问元数据

这个 declarative_base() 基类包含 MetaData 新定义的对象 Table 对象被收集。此对象用于直接访问 MetaData -具体操作。例如,为所有表发出CREATE语句:

engine = create_engine('sqlite://')
Base.metadata.create_all(engine)

declarative_base() 也可以接收预先存在的 MetaData 对象,它允许声明性设置与已经存在的 Table 对象::

mymetadata = MetaData()
Base = declarative_base(metadata=mymetadata)

类构造函数

作为一项便利功能, declarative_base() 为接受关键字参数的类设置默认构造函数,并将其分配给命名属性:

e = Engineer(primary_language='python')

映射器配置

声明性使用 mapper() 在内部创建到声明表的映射时。可供选择的 mapper() 直接通过 __mapper_args__ 类属性。一如既往,引用本地映射列的参数可以直接从类声明中引用它们:

from datetime import datetime

class Widget(Base):
    __tablename__ = 'widgets'

    id = Column(Integer, primary_key=True)
    timestamp = Column(DateTime, nullable=False)

    __mapper_args__ = {
                    'version_id_col': timestamp,
                    'version_id_generator': lambda v:datetime.now()
                }

定义SQL表达式

作为映射属性的SQL表达式 有关将属性声明性映射到SQL表达式的示例。