Python SQLAlchemy声明性具体自动加载表继承

Python SQLAlchemy声明性具体自动加载表继承,python,inheritance,sqlalchemy,autoload,concrete,Python,Inheritance,Sqlalchemy,Autoload,Concrete,我已有一个数据库,希望使用SQLAlchemy访问它。因为数据库结构是由另一段代码(实际上是Django ORM)管理的,我不想重复我自己描述的每个表结构,我使用的是autoloadintrospection。我被一个简单的具体表继承所困扰 Payment FooPayment + id (PK) <----FK------+ payment_ptr_id (PK) + user_id + foo + amount +

我已有一个数据库,希望使用SQLAlchemy访问它。因为数据库结构是由另一段代码(实际上是Django ORM)管理的,我不想重复我自己描述的每个表结构,我使用的是
autoload
introspection。我被一个简单的具体表继承所困扰

Payment                FooPayment
  + id (PK) <----FK------+ payment_ptr_id (PK)
  + user_id              + foo
  + amount
  + date
实际的表有额外的列,但这与问题完全无关,因此为了尽量减少代码,我将所有内容简化为核心

问题是,当我运行此命令时:

payment = session.query(FooPayment).filter(Payment.amount >= 200.0).first()
print payment.date
生成的SQL毫无意义(请注意缺少连接条件):

当我试图访问
payment.date
时,我得到以下错误:
Concrete Mapper | FooPayment | payments | u foo没有在实例级别实现属性u'date'。

我尝试将隐式外键引用
id=Column('payment\u ptr\u id',Integer,ForeignKey('payments\u payment.id'),primary\u key=True)
添加到
foodayment
,但没有成功。尝试
print session.query(Payment).first()

如何对
FooPayment
执行简单查询,并从结果实例中访问
Payment
的值

我正在使用SQLAlchemy 0.5.3、PostgreSQL 8.3、psycopg2和Python 2.5.2。
谢谢您的建议。

您的表结构与联合表继承中使用的类似,但它们肯定不对应于具体的表继承,即父类的所有字段都在子类的表中重复。现在,您有一个子类,它的字段比父类少,并且有一个对父类实例的引用。切换到联合表继承(并在您的条件下使用
FooPayment.amount
),或者放弃继承,转而使用简单聚合(参考)


按其他模型中的字段筛选不会自动添加联接条件。虽然很明显,对于您的示例,联接中应该使用什么条件,但通常无法确定此类条件。这就是为什么您必须定义引用付款的关系属性并使用其
has()
方法以获得适当的连接条件。

谢谢!我肯定在不同的继承类型之间弄错了。只需删除
{'concrete':True}
即可使其连接到继承,并且工作得非常好。感谢您的解释。
payment = session.query(FooPayment).filter(Payment.amount >= 200.0).first()
print payment.date
SELECT payments_foo.payment_ptr_id AS payments_foo_payment_ptr_id,
       ... /* More `payments_foo' columns and NO columns from `payments' */
    FROM payments_foo, payments
    WHERE payments.amount >= 200.0 LIMIT 1 OFFSET 0