SQLAlchemy与多个外键的元数据关系

时间:2017-03-30 00:14:37

标签: python database orm sqlalchemy

我是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

知道什么是错的吗?

1 个答案:

答案 0 :(得分:0)

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

  

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

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

  

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

换句话说,通过绑定到名称Table的{​​{1}}对象访问列:

__table__