SQLAlchemy关联之间的不同之处

2024-04-19 18:39:23 发布

您现在位置:Python中文网/ 问答频道 /正文

作为SQLAlchemy和SQL的新手,SQLAlchemy中的关系让我感到困惑。你知道吗

这是一组SQLAlchemy模型定义(基于One-To-Many in the official docs

class Invoice(Base):
    __tablename__ = 'invoices'
    id = Column(Integer, primary_key=True)
    customer = relationship("Customer")

class Customer(Base):
    __tablename__ = 'customers'
    id = Column(Integer, primary_key=True)
    invoice_id = Column(Integer, ForeignKey('invoices.id'))

与相同

class Invoice(Base):
    __tablename__ = 'invoices'
    id = Column(Integer, primary_key=True)

class Customer(Base):
    __tablename__ = 'customers'
    id = Column(Integer, primary_key=True)
    invoice_id = Column(Integer, ForeignKey('invoices.id'))
    invoice = relationship("Invoice")

我一直在使用第二种方法定义我的模型,到目前为止,它似乎运行良好。但是我不确定这是否是建立关系的正确方法。你知道吗

两者有什么区别?你知道吗


Tags: keyidtruebasesqlalchemy关系columninvoice
1条回答
网友
1楼 · 发布于 2024-04-19 18:39:23

这些模型中的每一个对于生成的数据库表和列都是相同的。区别在于如何使用^{}指令,该指令使ORM能够与这些表之间的外键关系进行交互。我应该注意到,如果您不需要/不希望ORM在与表之间的这些关系交互时提供额外的帮助,那么您根本不需要创建这些关系属性。你知道吗

在第一个示例中,您正在为Invoice创建一个customer属性,该属性使您能够访问与特定发票关联的任何和所有客户。例如,可以打印与特定发票关联的每个客户id。你知道吗

invoice = session.query(Invoice).filter(Invoice.id == 1).first()
for c in invoice.customer:
    print(c.id)

在第二个示例中,您正在为Customer创建一个invoice属性,该属性允许您访问与特定客户关联的发票数据。例如,您可以打印客户的发票id(如果您在Customer中有其他Invoice列尚未被外键引用,那么这将更有用)。你知道吗

customer = session.query(Customer).filter(Customer.id == 1).first()
print(customer.invoice.id)

如果您希望访问关系两侧的这些属性,以便能够以上述两种方式(除其他外)使用ORM,则可以使用back_populatesbackref参数来连接这两个关系。您可以在Linking Relationships with Backref了解有关这些选项的更多信息。你知道吗

class Invoice(Base):
    __tablename__ = 'invoices'
    id = Column(Integer, primary_key=True)
    customers = relationship("Customer", back_populates="invoice")

class Customer(Base):
    __tablename__ = 'customers'
    id = Column(Integer, primary_key=True)
    invoice_id = Column(Integer, ForeignKey('invoices.id'))
    invoice = relationship("Invoice", back_populates="customers") 

相关问题 更多 >