在 SQLAlchemy 中,这两种模型有啥区别?
Posted
技术标签:
【中文标题】在 SQLAlchemy 中,这两种模型有啥区别?【英文标题】:In SQLAlchemy, what is the difference between these two models?在 SQLAlchemy 中,这两种模型有什么区别? 【发布时间】:2011-11-27 04:38:21 【问题描述】:#models1.py
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String)
addresses = relationship("Address", backref="user")
class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
email = Column(String)
user_id = Column(Integer, ForeignKey('user.id'))
#models2.py
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String)
class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
email = Column(String)
user_id = Column(Integer, ForeignKey('user.id'))
addresses = relationship("Address", backref="user")
如您所知,唯一的区别是“关系”被置于不同的位置。我很困惑,因为在 SQLAlchemy 文档中,它将它放在两个不同的地方。首先是here,然后是here。
“关系”的正确位置是什么?它甚至是必需的吗?如果我把它排除在外怎么办?
【问题讨论】:
如果关系定义了一对一的关系,那么两者是相同的。在两者之后,你最终得到了两个相互引用的类。 【参考方案1】:两者在语义上是相同的。SA
使用ForeignKey
s 来推断one-to-many
关系的many
侧。
阅读解释bidirectional
关系的Linking Relationships with Backref 部分。相关摘录:
...其实backref关键字只是一个常用的快捷方式 第二个关系到地址映射,包括 在双方建立一个事件监听器,这将反映 两个方向的属性操作。 ...
【讨论】:
谢谢,范。当您说两者在语义上相同时……您是说两者都可以工作,这取决于我的喜好?以上是关于在 SQLAlchemy 中,这两种模型有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章