SQLAlchemy: plusieurs bases de données (sur le même server) dans une seule session?

Je cours MS SQL Server et essaye d'effectuer un JOIN entre deux tables situées dans différentes bases de données (sur le même server). Si je me connecte au server en utilisant pyodbc (sans spécifier de database), le SQL brut suivant fonctionne correctement.

 SELECT * FROM DatabaseA.dbo.tableA tblA INNER JOIN DatabaseB.dbo.tableB tblB ON tblA.id = tblB.id 

Malheureusement, je n'arrive pas à faire fonctionner l'analogique avec SQLAlchemy. J'ai vu ce sujet abordé dans quelques endroits:

  • Existe-t-il un moyen d'effectuer une jointure entre plusieurs sessions dans sqlalchemy?
  • Joindre la database croisée dans sqlalchemy
  • Comment me connecter à plusieurs bases de données sur le même server SQL avec sqlalchemy?
  • Comment puis-je utiliser plusieurs bases de données dans la même requête dans Cherrypy et SQLAlchemy?

La plupart recommandnt d'utiliser différents moteurs / sessions, mais j'ai absolument besoin d'effectuer des jointures entre les bases de données, donc je ne pense pas que cette approche sera utile. Une autre suggestion typique consiste à utiliser le paramètre schema , mais cela ne semble pas fonctionner pour moi. Par exemple, ce qui suit ne fonctionne pas.

 engine = create_engine('mssql+pyodbc://...') #Does not specify database metadataA = MetaData(bind=engine, schema='DatabaseA.dbo', reflect=True) tableA = Table('tableA', metadataA, autoload=True) metadataB = MetaData(bind=engine, schema='DatabaseB.dbo', reflect=True) tableB = Table('tableB', metadataB, autoload=True) 

J'ai aussi essayé varients où schema='DatabaseA' et schema='dbo' . Dans tous les cas, SQLAlchemy lance un NoSuchTableError pour les deux tables A et B. Des idées?

Je suis capable d'exécuter un test comme celui-ci ici, reflétant deux bases de données distantes, et ça fonctionne bien.

  1. A l'aide d'un SQLAlchemy récent (0.8.3 recommandé au less)?

  2. allumer "echo = 'debug'" – quels arrays trouve-t-il?

  3. après le tout refléter, qu'est-ce qui est présent dans metadataA.tables metadataB.tables?

  4. est le boîtier ici exactement ce qui est sur SQL Server? (par exemple, tableA). L'utilisation d'un nom sensible à la casse le fera être cité.

Si vous pouvez créer un synonyme dans l'une des bases de données, vous pouvez garder votre requête locale à cette seule database.

 USE DatabaseB; GO CREATE SYNONYM dbo.DbA_TblA FOR DatabaseA.dbo.tableA; GO 

Votre requête devient alors:

 SELECT * FROM dbo.DbA_TblA tblA INNER JOIN dbo.tableB tblB ON tblA.id = tblB.id