Как оптимизировать несколько вызовов до SQL при работе с Python / Pandas? - PullRequest
1 голос
/ 05 марта 2020

У меня возникает ситуация, когда я пытаюсь импортировать таблицу из SQL, объединить ее с другим фреймом данных из pandas, а затем вернуть объединенный фрейм данных обратно в SQL. Тем не менее, я делаю этот процесс несколько раз.

Например, если у меня есть несколько фреймов данных, таких как

df1 = some data
df2 = other data
df3 = more data
etc.

Для df1, я бы затем использовал PyODB C, чтобы создать запрос к SQL и сохранить таблицу как фрейм данных.

sql_conn = pyodbc.connect(connection_to_database)
query = 'SELECT * FROM [Database].[Schema].[Table1]'
sql_data = pd.read_sql(query, sql_conn)

На этом этапе я бы взял sql_data, сделал то, что мне нужно, затем конкатенировал его с df1 и выплюнул обратно к SQL, используя sqlalchemy

data = pd.concat([sql_data, df1)
data.to_sql('Table1', if_exists='replace')

Все это прекрасно работает, но мой вопрос возникает, когда мне нужно повторить этот процесс более элегантным способом. Я могу просто жестко закодировать его, выполнив что-то вроде

query = 'SELECT * FROM [Database].[Schema].[Table2]'
sql_data = pd.read_sql(query, sql_conn)
data = pd.concat([sql_data, df2)
data.to_sql('Table2', if_exists='replace')

query = 'SELECT * FROM [Database].[Schema].[Table3]'
sql_data = pd.read_sql(query, sql_conn)
data = pd.concat([sql_data, df3)
data.to_sql('Table3', if_exists='replace')

etc..

Однако это, очевидно, не идеальное решение. Если бы я поместил это в цикл / функцию, я больше всего зациклен на том, как установить соответствующие имена таблиц для каждой таблицы и правильно перебрать каждый фрейм данных, чтобы он соответствовал правильной таблице из SQL.

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Для зацикливания вы можете создать контрольную таблицу, которая содержит имена интересующих вас таблиц, а затем прочитать эти имена в списке:

tables_list = etl.fromdb(landing_conn, "SELECT TABLE_NAME FROM db.tables_list")
table_names = etl.values(tables_list, 'TABLE_NAME')

, а затем вы можете l oop через список:

    for item in table_names:
       df = do_something\concate\append()
0 голосов
/ 05 марта 2020

С тех пор вы только добавляете новую информацию к каждому фрейму данных , который у вас есть.


dflist = [df1, df2, df3, ...]

# Collect all data we want to add
DataToAdd = pd.concat(dflist, axis=0, sort=False)

# sql_conn => the sqlalchemy connection object
# Send this data to sql
DataToAdd.to_sql('[Database].[Schema].[Table3]', con=sql_conn, if_exists='append')

Посмотрите на pandas .DataFrame. to_ sql для дальнейшей настройки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...