Python 如何使用sqlalchemy表达式语言/sqlalchemy核心连接来自两个不同数据库的表?

Python 如何使用sqlalchemy表达式语言/sqlalchemy核心连接来自两个不同数据库的表?,python,mysql,sqlalchemy,cross-database,Python,Mysql,Sqlalchemy,Cross Database,我正在使用MySql。然而,我能够找到使用sqlalchemy orm而不是使用表达式语言来实现这一点的方法。因此,我特别寻找基于核心/表达式语言的解决方案。数据库位于同一台服务器上 我的连接是这样的: connection = engine.connect().execution_options( schema_translate_map = {current_database_schema: new_database_schema}) engine_1=create_engine("mysq

我正在使用MySql。然而,我能够找到使用sqlalchemy orm而不是使用表达式语言来实现这一点的方法。因此,我特别寻找基于核心/表达式语言的解决方案。数据库位于同一台服务器上

我的连接是这样的:

connection = engine.connect().execution_options(
schema_translate_map = {current_database_schema: new_database_schema})
engine_1=create_engine("mysql+mysqldb://root:user@*******/DB_1")
engine_2=create_engine("mysql+mysqldb://root:user@*******/DB_2",pool_size=5)

metadata_1=MetaData(engine_1)
metadata_2=MetaData(engine_2)

metadata.reflect(bind=engine_1)
metadata.reflect(bind=engine_2)

table_1=metadata_1.tables['table_1']
table_2=metadata_2.tables['table_2']
query=select([table_1.c.name,table_2.c.name]).select_from(join(table_2,table_1.c.id==table_2.c.id,'left')

result=connection.execute(query).fetchall()
但是,当我尝试连接来自不同数据库的表时,它显然会抛出一个错误,因为连接属于其中一个数据库。我没有尝试过任何其他方法,因为我找不到解决这个问题的方法。
提出问题的另一种方法(也许)是“如何使用sqlalchemy core中的单个连接连接到多个数据库”。

仅将解决方案从应用到core您可以创建一个连接到服务器的单个
引擎
对象,但不会默认连接到一个或另一个数据库:

engine = create_engine("mysql+mysqldb://root:user@*******/")
然后使用单个
元数据
实例反映每个模式的内容:

metadata = MetaData(engine)
metadata.reflect(schema='DB_1')
metadata.reflect(schema='DB_2')

# Note: use the fully qualified names as keys
table_1 = metadata.tables['DB_1.table_1']
table_2 = metadata.tables['DB_2.table_2']
您还可以使用其中一个数据库作为“默认”并将其传递到URL中。在这种情况下,您将像往常一样从该数据库反射表,并且仅在反射另一个数据库时传递
schema=
关键字参数

使用创建的引擎执行查询:

query = select([table_1.c.name, table_2.c.name]).\
    select_from(outerjoin(table1, table_2, table_1.c.id == table_2.c.id))

with engine.begin() as connection:
    result = connection.execute(query).fetchall()

这一解决方案似乎不起作用。使用metadata.Hi访问表时引发键错误。这一切都很新鲜。我可以问一下,在反映元数据和构建查询之间,您是否遗漏了任何步骤?为什么不使用
Base=automap\u Base(metadata=metadata)
Base.prepare()