如何使用 SQLAlchemy 声明性语法指定关系?

Posted

技术标签:

【中文标题】如何使用 SQLAlchemy 声明性语法指定关系?【英文标题】:How to specify relations using SQLAlchemy declarative syntax? 【发布时间】:2010-09-20 00:10:38 【问题描述】:

我找不到任何关于如何指定关系的适当文档 使用 SQLAlchemy 的声明性语法。它不受支持吗?也就是说,我应该使用“传统”语法吗? 我正在寻找一种在更高级别指定关系的方法,避免与外键等混淆。我只想声明“addresses = OneToMany(Address)”并让框架处理细节。我知道Elixir 可以做到这一点,但我想知道“普通”SQLA 是否也可以做到。 感谢您的帮助!

【问题讨论】:

“也就是说,我应该使用“传统”语法吗?”请详细说明。 好吧,我正在寻找一种在更高级别指定关系的方法,因此避免弄乱外键等。我只想声明“addresses = OneToMany(Address)”并让框架处理细节。我知道 Elixir 可以做到这一点,但我想知道“普通”SQLA 是否也能做到。 @Joril:请您用您的 cmets 更新问题吗? 【参考方案1】:

假设您指的是the declarative plugin,我要说的所有内容都附有示例:

class User(Base):
    __tablename__ = 'users'

    id = Column('id', Integer, primary_key=True)
    addresses = relation("Address", backref="user")

class Address(Base):
    __tablename__ = 'addresses'

    id = Column('id', Integer, primary_key=True)
    user_id = Column('user_id', Integer, ForeignKey('users.id'))

【讨论】:

所以,没有办法避免手动创建外键、联结表等.. :((当然除了使用 Elixir)谢谢! 不,关系函数可以做任何你可以用 SQLA 做的事情。可能比长生不老药更强大。【参考方案2】:

查看Declarative docs 的“配置关系”部分。不像“OneToMany”那么高,但比完全指定关系要好。

class Address(Base):
    __tablename__ = 'addresses'

    id = Column(Integer, primary_key=True)
    email = Column(String(50))
    user_id = Column(Integer, ForeignKey('users.id'))

【讨论】:

感谢更新链接 :) 但是.. 很抱歉,我看不出与 Ali A 所说的不同.. ^^;鉴于该地址类,您仍然必须在用户内部指定一个“地址=关系(...)”。我错过了什么吗? ^^; 啊,我想我误解了你的问题!是的,要同时获得它,那么我认为你必须做那么多的规范。如果您想要更权威的答案,请在 SA 列表中询问(Mike Bayer 的答案,解决所有争议!)!

以上是关于如何使用 SQLAlchemy 声明性语法指定关系?的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy 如何使用声明性映射一对一关系的单列

使用 SQLAlchemy 的声明性语法时访问表实例的最佳方式

使用 sqlalchemy 的声明性 ORM 扩展时的多列索引

如何使用额外的方法扩展 SQLAlchemy 绑定声明性模型?

SQLAlchemy 通过关联对象声明性多对多自联接

如何使用 SQLAlchemy Postgres ORM 的声明性基础动态创建具有列名和字典约束的表?