作为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")
我一直在使用第二种方法定义我的模型,到目前为止,它似乎运行良好。但是我不确定这是否是建立关系的正确方法。你知道吗
两者有什么区别?你知道吗
这些模型中的每一个对于生成的数据库表和列都是相同的。区别在于如何使用^{} 指令,该指令使ORM能够与这些表之间的外键关系进行交互。我应该注意到,如果您不需要/不希望ORM在与表之间的这些关系交互时提供额外的帮助,那么您根本不需要创建这些关系属性。你知道吗
在第一个示例中,您正在为
Invoice
创建一个customer
属性,该属性使您能够访问与特定发票关联的任何和所有客户。例如,可以打印与特定发票关联的每个客户id。你知道吗在第二个示例中,您正在为
Customer
创建一个invoice
属性,该属性允许您访问与特定客户关联的发票数据。例如,您可以打印客户的发票id(如果您在Customer
中有其他Invoice
列尚未被外键引用,那么这将更有用)。你知道吗如果您希望访问关系两侧的这些属性,以便能够以上述两种方式(除其他外)使用ORM,则可以使用
back_populates
或backref
参数来连接这两个关系。您可以在Linking Relationships with Backref了解有关这些选项的更多信息。你知道吗相关问题 更多 >
编程相关推荐