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

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

【问题讨论】:

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

标签: python sqlalchemy


【解决方案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 的答案,解决所有争议!)!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 2014-05-06
  • 2010-12-19
  • 2014-05-28
  • 1970-01-01
  • 2016-07-11
  • 2011-09-21
相关资源
最近更新 更多