SQLAlchemy对象关系配置包括 Table
, mapper()
和类对象以定义映射类。 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返回一个新的基类,所有映射类都应从该基类继承。类定义完成后,新的 Table
和 mapper()
将被生成。
生成的表和映射器可以通过 __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)
属性可以在构造后添加到类中,并将添加到基础中 Table
和 mapper()
适当定义:
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表达式的示例。