如何使用 sqlalchemy 表达式语言/sqlalchemy 核心连接来自两个不同数据库的表?
How to join tables from two different databases using sqlalchemy expression language / sqlalchemy core?
我正在使用 MySql。但是,我能够找到使用 sqlalchemy orm 但不使用表达式 language.So 来执行此操作的方法,我专门寻找基于核心/表达式语言的解决方案。数据库位于同一台服务器上
我的连接是这样的:
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()
但是,当我尝试连接来自不同数据库的表时,它显然会抛出错误,因为该连接属于其中一个数据库。而且我没有尝试任何其他方法,因为我找不到解决这个问题的方法。
提出问题的另一种方式(也许)是 'how to connect to multiple databases using a single connection in sqlalchemy core'.
仅将 中的解决方案应用于核心,您可以创建一个连接到您的服务器的单个 Engine
对象,但不会默认为一个或另一个数据库:
engine = create_engine("mysql+mysqldb://root:user@*******/")
然后使用单个 MetaData
实例反映每个模式的内容:
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']
您也可以使用其中一个数据库作为 "default" 并将其传递到 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()
我正在使用 MySql。但是,我能够找到使用 sqlalchemy orm 但不使用表达式 language.So 来执行此操作的方法,我专门寻找基于核心/表达式语言的解决方案。数据库位于同一台服务器上
我的连接是这样的:
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()
但是,当我尝试连接来自不同数据库的表时,它显然会抛出错误,因为该连接属于其中一个数据库。而且我没有尝试任何其他方法,因为我找不到解决这个问题的方法。 提出问题的另一种方式(也许)是 'how to connect to multiple databases using a single connection in sqlalchemy core'.
仅将 Engine
对象,但不会默认为一个或另一个数据库:
engine = create_engine("mysql+mysqldb://root:user@*******/")
然后使用单个 MetaData
实例反映每个模式的内容:
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']
您也可以使用其中一个数据库作为 "default" 并将其传递到 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()