我试图使用SqlAlchemy(0.5.8)以声明方式和使用反射来与遗留数据库进行交互.我的测试代码如下所示:
from sqlalchemy import *
from sqlalchemy.orm import create_session
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
engine = create_engine('oracle://schemaname:pwd@SID')
meta = MetaData(bind=engine)
class CONSTRUCT(Base):
__table__ = Table('CONSTRUCT', meta, autoload=True)
class EXPRESSION(Base):
__table__ = Table('EXPRESSION', meta, autoload=True)
session = create_session(bind=engine)
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试使用这两个表之间的连接(由底层oracle架构中的外键约束定义)运行查询时:
print session.query(EXPRESSION).join(PURIFICATION)
Run Code Online (Sandbox Code Playgroud)
......没有快乐:
sqlalchemy.exc.ArgumentError: Can't find any foreign key relationships between 'EXPRESSION' and 'PURIFICATION'
Run Code Online (Sandbox Code Playgroud)
然而:
>>> EXPRESSION.epiconstruct_pkey.property.columns
[Column(u'epiconstruct_pkey', OracleNumeric(precision=10, scale=2, asdecimal=True,
length=None), ForeignKey(u'construct.pkey'), table=<EXPRESSION>, nullable=False)]
>>> CONSTRUCT.pkey.property.columns
[Column(u'pkey', OracleNumeric(precision=38, scale=0, asdecimal=True, length=None),
table=<CONSTRUCT>, primary_key=True, nullable=False)]
Run Code Online (Sandbox Code Playgroud)
这清楚地表明反射拾取了外键.
我哪里错了?