发布: 2.0.36 当前版本 | 发布日期: 2024 年 10 月 15 日
SQLAlchemy 2.0 文档
examples.generic_associations.table_per_related 的源代码
"""Illustrates a generic association which persists association
objects within individual tables, each one generated to persist
those objects on behalf of a particular parent class.
This configuration has the advantage that each type of parent
maintains its "Address" rows separately, so that collection
size for one type of parent will have no impact on other types
of parent. Navigation between parent and "Address" is simple,
direct, and bidirectional.
This recipe is the most efficient (speed wise and storage wise)
and simple of all of them.
The creation of many related tables may seem at first like an issue
but there really isn't any - the management and targeting of these tables
is completely automated.
"""
from sqlalchemy import Column
from sqlalchemy import create_engine
from sqlalchemy import ForeignKey
from sqlalchemy import Integer
from sqlalchemy import String
from sqlalchemy.ext.declarative import as_declarative
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.orm import relationship
from sqlalchemy.orm import Session
@as_declarative()
class Base:
"""Base class which provides automated table name
and surrogate primary key column.
"""
@declared_attr
def __tablename__(cls):
return cls.__name__.lower()
id = Column(Integer, primary_key=True)
class Address:
"""Define columns that will be present in each
'Address' table.
This is a declarative mixin, so additional mapped
attributes beyond simple columns specified here
should be set up using @declared_attr.
"""
street = Column(String)
city = Column(String)
zip = Column(String)
def __repr__(self):
return "%s(street=%r, city=%r, zip=%r)" % (
self.__class__.__name__,
self.street,
self.city,
self.zip,
)
class HasAddresses:
"""HasAddresses mixin, creates a new Address class
for each parent.
"""
@declared_attr
def addresses(cls):
cls.Address = type(
"%sAddress" % cls.__name__,
(Address, Base),
dict(
__tablename__="%s_address" % cls.__tablename__,
parent_id=Column(
Integer, ForeignKey("%s.id" % cls.__tablename__)
),
parent=relationship(cls),
),
)
return relationship(cls.Address)
class Customer(HasAddresses, Base):
name = Column(String)
class Supplier(HasAddresses, Base):
company_name = Column(String)
engine = create_engine("sqlite://", echo=True)
Base.metadata.create_all(engine)
session = Session(engine)
session.add_all(
[
Customer(
name="customer 1",
addresses=[
Customer.Address(
street="123 anywhere street", city="New York", zip="10110"
),
Customer.Address(
street="40 main street", city="San Francisco", zip="95732"
),
],
),
Supplier(
company_name="Ace Hammers",
addresses=[
Supplier.Address(
street="2569 west elm", city="Detroit", zip="56785"
)
],
),
]
)
session.commit()
for customer in session.query(Customer):
for address in customer.addresses:
print(address)
print(address.parent)
© 版权所有 2007-2024,SQLAlchemy 作者和贡献者。
flambé! 龙和 炼金术士 图像设计由 Rotem Yaari 创建并慷慨捐赠。
使用 Sphinx 7.2.6 创建。文档最后生成时间: 2024 年 11 月 8 日星期五 上午 08:41:19 EST