Je tente d'utiliser SqlAlchemy (0.5.8) pour interfacer de manière déclarative avec une base de données héritée en utilisant la réflexion. Mon code de test ressemble à ceci :
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)
Maintenant, lorsque j'essaie d'exécuter une requête en utilisant la jointure entre ces deux tables (définie par une contrainte de clé étrangère dans le schéma oracle sous-jacent) :
print session.query(EXPRESSION).join(PURIFICATION)
... pas de chance :
sqlalchemy.exc.ArgumentError: Impossible de trouver des relations de clé étrangère entre 'EXPRESSION' et 'PURIFICATION'
Cependant :
>>> EXPRESSION.epiconstruct_pkey.property.columns
[Column(u'epiconstruct_pkey', OracleNumeric(precision=10, scale=2, asdecimal=True,
length=None), ForeignKey(u'construct.pkey'), table=, nullable=False)]
>>> CONSTRUCT.pkey.property.columns
[Column(u'pkey', OracleNumeric(precision=38, scale=0, asdecimal=True, length=None),
table=, primary_key=True, nullable=False)]
Ce qui indique clairement que la réflexion a détecté la clé étrangère.
Où est-ce que je me trompe ?