Подключение Python к нескольким серверам с разными диалектами SQL? - PullRequest
0 голосов
/ 17 декабря 2018

Вопрос : Как выполнить запросы SQL через Python для получения данных с нескольких серверов, которые могут иметь разные диалекты SQL (например, когда один серверный диалект использует TOP X, а другой SAMPLE X)?

В настоящее время у меня есть некоторый код, который позволяет мне выполнять запросы к каждому серверу отдельно (что недостаточно):

    import pyodbc
    import pandas as pd
    cnxn = pyodbc.connect('DSN=dsn_name;UID=username;PWD=password')
    query = str("""
                SELECT * 
                FROM sqlserver1.tableA 
                """)
    df = pd.read_sql(query, cnxn)

Цель : я хотел бы объединить данные с другого сервера, в основном я хотел бы иметь SQL-запрос на Python, который выглядит примерно так - обработка различных диалектов SQL:

        query = str("""
                    SELECT * 
                    FROM sqlserver1.tableA as sq
                    INNER JOIN teradataserver2.tableB as tera
                            ON sq.id = tera.id
                    """)

.. PS Я попробовал обходной путь, подобный этому:

        import pyodbc
        import pandas as pd
        cnxnServer1 = pyodbc.connect('DSN=dsn_name1;UID=username;PWD=password')
        cnxnServer2 = pyodbc.connect('DSN=dsn_name2;UID=username;PWD=password')

        queryServer1 = str("""
                    SELECT * 
                    FROM sqlserver1.tableA 
                    """)
        queryServer2 = str("""
                    SELECT * 
                    FROM teradataserver2.tableB 
                    """)

.. и затем использовал слияние панд.Но это слишком неэффективно .

Примечание : я запускаю Python 3.7

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Если вы не хотите (или не можете) связываться с конфигурациями сервера (например, для создания связанного сервера), то вы можете сделать что-то с SQL-языком выражения SQLAlchemy для создания операторовкоторые интерпретируются с использованием диалекта объекта SQLAlchemy engine.

Например,

from sqlalchemy import create_engine, Table, MetaData
from sqlalchemy.sql import select

cnxn_url = 'mssql+pyodbc://@SQLmyDb'
engine = create_engine(cnxn_url)
metadata = MetaData()
my_table = Table('my_table', metadata, autoload=True, autoload_with=engine)
stmt = select([my_table.c.id, my_table.c.txt])\
    .select_from(my_table)\
    .order_by(my_table.c.id)\
    .limit(2)
print(engine.execute(stmt).fetchall())

отправит инструкцию T-SQL на SQL Server и вернет результаты.

Если мы просто изменим URL-адрес соединения на

cnxn_url = 'mysql+pymysql://root:whatever@localhost/mydb'

, тогда SQLAlchemy отправит соответствующий оператор MySQL на сервер MySQL.

Однако этого может быть недостаточно, если вы действительнохотите объединить одну таблицу в database_A с другой таблицей в database_B.В этом случае вы будете рассматривать извлечение данных из различных таблиц в общую среду, такую ​​как pandas DataFrames или таблицы в базе данных SQLite в памяти.

0 голосов
/ 17 декабря 2018

Вы можете добавить связанный сервер в SQL Server для доступа к teradataserver2 из sqlserver1.Следующий запрос можно использовать в контексте подключения к sqlserver1 (проверьте синтаксис имени для teradataserver2)

SELECT * 
FROM tableA as sq
     INNER JOIN [teradataserver2].mydb.dbo.tableB as tera
         ON sq.id = tera.id
...