【问题标题】:SQLAlchemy Metadata Relationship with Multiple Foreign Keys具有多个外键的 SQLAlchemy 元数据关系
【发布时间】:2017-08-23 16:45:06
【问题描述】:

我是 SQLAlchemy 的新手,正在尝试为现有数据库设置 ORM。我正在使用元数据设置表并自己指定外键。表设置如下所示:

class User(Base):
    __table__ = Table('users', metadata, 
                      Column('user_id', Integer, primary_key=True), 
                      autoload=True)

class Transaction(Base):
    __table__ = Table('transaction', metadata,
                      Column('transaction_id', Integer, primary_key=True), 
                      Column('seller_id', Integer, ForeignKey('users.user_id')),
                      Column('buyer_id', Integer, ForeignKey('users.user_id')),
                      autoload=True)
    seller = relationship('User', foreign_keys=[seller_id])
    buyer = relationship('User', foreign_keys=[buyer_id])

这不运行,出现错误:

NameError: name 'seller_id' is not defined

知道有什么问题吗?

【问题讨论】:

    标签: python database orm sqlalchemy


    【解决方案1】:

    要了解您收到错误的原因,您应该刷新对 Python 中 class construction 的理解:

    当输入一个类定义时,会创建一个新的命名空间,并将其用作局部范围——因此,对局部变量的所有赋值都会进入这个新的命名空间。特别是,函数定义在这里绑定了新函数的名称。

    在您的示例中,您没有分配给seller_id 会引入名称,因此在类构造期间尝试使用该名称会引发NameError。在类构造期间,您在当前命名空间中可用的是您分配的__table__。事实上,这个确切的用例记录在"Using a Hybrid Approach with __table__"

    请注意,当使用__table__ 方法时,该对象可以立即在类声明主体中作为纯Table 使用,因为Python 类只是另一个语法块。

    换句话说,通过绑定到名称__table__Table 对象访问列:

    class Transaction(Base):
        __table__ = Table('transaction', metadata,
                          Column('transaction_id', Integer, primary_key=True), 
                          Column('seller_id', Integer, ForeignKey('users.user_id')),
                          Column('buyer_id', Integer, ForeignKey('users.user_id')),
                          autoload=True)
        seller = relationship('User', foreign_keys=[__table__.c.seller_id])
        buyer = relationship('User', foreign_keys=[__table__.c.buyer_id])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-10
      • 2020-12-30
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多