Как объединить таблицы из двух разных баз данных, используя язык выражений sqlalchemy / ядро ​​sqlalchemy? - PullRequest
0 голосов
/ 02 июля 2018

Я использую 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».

1 Ответ

0 голосов
/ 02 июля 2018

Применяя решение из здесь только к 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']

Вы также можете использовать одну из баз данных в качестве «по умолчанию» и передать ее в 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()
...