【问题标题】:Multiple join paths in SQLAlchemySQLAlchemy 中的多个连接路径
【发布时间】:2018-03-08 15:34:51
【问题描述】:

我尝试测试 SQLAlchemy 文档中有关处理多个连接路径的代码示例。但是,在我创建了一个客户对象之后,两个关系属性都为无。我想知道如何正确处理多个连接路径?我是否也需要在 Address 类中创建关系?我什么时候需要使用 back_populates?

Handling Multiple Join Paths

from sqlalchemy import create_engine
from sqlalchemy import Integer, ForeignKey, String, Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

Base = declarative_base()

class Customer(Base):
    __tablename__ = 'customer'
    id = Column(Integer, primary_key=True)
    name = Column(String)

    billing_address_id = Column(Integer, ForeignKey("address.id"))
    shipping_address_id = Column(Integer, ForeignKey("address.id"))

    billing_address = relationship("Address", foreign_keys=[billing_address_id])
    shipping_address = relationship("Address", foreign_keys=[shipping_address_id])

class Address(Base):
    __tablename__ = 'address'
    id = Column(Integer, primary_key=True)
    street = Column(String)
    city = Column(String)
    state = Column(String)
    zip = Column(String)

engine = create_engine('sqlite:///Testing.db')

Base.metadata.create_all(engine)

a1 = Address(street="a street", city="a city", state="A", zip="12345")
a2 = Address(street="b street", city="b city", state="B", zip="1233")
c1 = Customer(name="Jack")
print(c1.billing_address)

【问题讨论】:

    标签: python orm sqlalchemy


    【解决方案1】:

    Address 中的关系不是必需的,如果您不需要它们。 back_populates= 用于将 2 个关系显式链接在一起,或者正如文档所说,"establish “bidirectional” behavior between each other"

    您的客户和地址未链接的原因是您从不链接它们。在施工期间将地址传递给客户或在之后设置它们:

    c1 = Customer(name="Jack", billing_address=a1)
    c1.shipping_address = a2
    

    现在,当您将c1 添加到会话并提交时,SQLAlchemy 将处理以正确顺序插入a1a2c1,以便它可以填写c1 的外键属性.发生这种情况是因为默认情况下 relationship() 启用了 save-update 级联,这也将关联对象放置到会话中。

    【讨论】:

    • 我们可以这样分配关系吗?当我这样做时,我收到一个错误:“sqlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) 错误绑定参数 1 - 可能是不受支持的类型。[SQL: 'INSERT INTO customer (name, billing_address_id, shipping_address_id) VALUES (?, ? , ?)']".
    • 您是直接将待关联对象分配给外键属性,不是吗?使用关系属性
    • 哦,对不起,我的错,没有注意到这一点。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 2015-01-06
    • 2021-09-23
    • 2020-07-31
    • 2021-04-03
    相关资源
    最近更新 更多