在 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 使用ForeignKeys 来推断one-to-many 关系的many 侧。 阅读解释bidirectional 关系的Linking Relationships with Backref 部分。相关摘录:

...其实backref关键字只是一个常用的快捷方式 第二个关系到地址映射,包括 在双方建立一个事件监听器,这将反映 两个方向的属性操作。 ...

【讨论】:

谢谢,范。当您说两者在语义上相同时……您是说两者都可以工作,这取决于我的喜好?

以上是关于在 SQLAlchemy 中,这两种模型有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

这两种说法有啥区别? [复制]

这两种在 JavaScript 中定义函数的方式有啥区别? [复制]

这两种符号有啥区别?

这两种寻址方式有啥区别[关闭]

这两种方法有啥区别?

这两种方法有啥区别?是啥让第二个比第一个更好?