Python SQLAlchemy声明性具体自动加载表继承
我已有一个数据库,希望使用SQLAlchemy访问它。因为数据库结构是由另一段代码(实际上是Django ORM)管理的,我不想重复我自己描述的每个表结构,我使用的是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 +
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