sqlalchemy文档资料翻译(六)

[程序]sqlalchemy文档资料翻译(六) -- 创建联系

现在我们开始考虑处理另一份表。我们系统中的用户们也可以存储任意数量的关联到其用户名的电子邮件地址。这意味着一个基本的一对多的映射,从 users_table 到一个用于电子邮件地址的一张名为 addresses 新表。通过 declarative,我们使用映射类 Address 来定义该表

>>> from sqlalchemy import ForeignKey
>>> from sqlalchemy.orm import relationship, backref
>>> class Address(Base):
...     __tablename__ = 'addresses'
...     id = Column(Integer, primary_key=True)
...     email_address = Column(String, nullable=False)
...     user_id = Column(Integer, ForeignKey('users.id'))
...
...     user = relationship(User, backref=backref('addresses', order_by=id))
...
...     def __init__(self, email_address):
...         self.email_address = email_address
...
...     def __repr__(self):
...         return "<Address('%s')>" % self.email_address

上述类介绍了一种用于引用 users 表的外键约束。对于 SQLAlchemy 来说在数据库级定义了两张表之间的联系。User 和 Address 之间的关系通过使用 relationship() 方法来分别定义,通过该方法可以将 user 属性放置到 Address 类中,也可以将一组 addresses 集合放置到 User 类中。这种关系又被称为一种双向关系。由于外键的作用,从 Address 到 User 是一种多对一的关系,而从 User 到 Address 则是一种一对多的关系。SQLAlchemy 会在外键的基础上自动识别上述关系。

注意:

relationship() 方法曾被叫做 relation() 方法,该名称适用于0.6beta2之前的版本,包括0.5和0.4系列版本。SQLAlchemy 0.6beta2 之后才启用 relationship() 。在可预见的将来,relation() 将一直保留以保证兼容性。

relationship() 方法非常的灵活,在 User 类中也可以非常容易的使用:

class User(Base):
    # ....
    addresses = relationship(Address, order_by=Address.id, backref="user")

我们也可以不用指定逆指向,此时只在一个类中指定 relationship()。也可以通过定义两个独立的 relationship() 来表示相互联系,此种方式通常在一对多和多对一的情况下是安全的,在多对多的情况下并不安全。

使用 declarative 扩展,relationship() 为我们提供一种使用字符串来获得目标类变量的选择,在此例中目标类还没有被定义。这只会在和 declarative 协同时有效:

class User(Base):
    ....
    addresses = relationship("Address", order_by="Address.id", backref="user")

在没有使用 declarative 的情况下,我们通常在目标类及 Table 已经定义好后才会定义我们的 mapper(),此时该表达式就么有必要了。

我们还是会需要在数据库中创建 addresses 表,因此我们还需要在 metadata 中发起新的 CREATE 操作,该操作会自动掠过已经创建的表:

>>> metadata.create_all(engine)

PRAGMA table_info("users")
()
PRAGMA table_info("addresses")
()
CREATE TABLE addresses (
    id INTEGER NOT NULL,
    email_address VARCHAR NOT NULL,
    user_id INTEGER,
    PRIMARY KEY (id),
     FOREIGN KEY(user_id) REFERENCES users (id)
)
()
COMMIT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值