Мой вопрос касается лучших практик ETL и того, как сделать вещи немного проще / эффективнее.
У меня есть данные, которые я извлекаю из API, которые затем преобразуются. Назовем это df_upc и предположим, что это фрейм данных Pandas для UPC, и я опущу предыдущий процесс преобразования из-за отсутствия релевантности. Эти данные отправляются в SQL Server с помощью метода Pandas to_sql: создание / обновление таблицы, а затем оператор Select в SQL присоединяется к таблице и некоторым другим данным для получения текущих уровней запасов. Таблица SQL Server, содержащая уровни инвентаризации, содержит миллионы SKU.
Мне не нравится создавать / обновлять таблицу каждый раз, когда я хочу присоединить некоторые данные с сервера к моему локальному файлу, и мне нужен лучший способ их чтения. Я пробовал запрашивать данные без соединения, но затем он загружает все миллионы строк, прежде чем присоединиться к ним в Python, и в итоге работает очень медленно. Ищете способ сделать это в скрипте Python, чтобы он мог оставаться автоматизированным. На данный момент процесс работает нормально, я просто чувствую, что есть способ получше. Спасибо за любую помощь / предложения!
import sqlalchemy, pandas as pd
from sqlalchemy import create_engine
engine1 = sqlalchemy.create_engine('mssql+pyodbc://@SERVER/DATABASE?trusted_connection=yes&driver=SQL+Server')
engine2 = sqlalchemy.create_engine('mssql+pyodbc://@SAME_SERVER/ANOTHER_DATABASE?trusted_connection=yes&driver=SQL+Server')
df_upc.to_sql('myTable', engine1, if_exists='replace', index=False)
#query has been stripped down for this example
query = pd.read_sql_query(
'''SELECT s.qty, s.upc, m.sku
FROM StyleInventory s
INNER JOIN marketing.dbo.myTable m on s.upc = m.upc;''', engine2)
df_joined = pd.DataFrame(query)
df_joined.to_excel("joined.xlsx", index=False)
Соответствующий ответ здесь. В этом примере для ОБНОВЛЕНИЯ используется TVP, но SP мог так же легко выполнить SELECT. — person BHOC schedule 19.05.2021
Насколько велик myTable
(строки и столбцы)? — person BHOC schedule 19.05.2021
Этот вопрос / ответ или Используйте временная таблица с SQLAlchemy может дать вам альтернативное решение с использованием CTE — person BHOC schedule 19.05.2021
@van, около 4000 строк, часто только UPC и, возможно, столбец SKU. — person BHOC schedule 19.05.2021
Я понимаю. Я бы все равно посмотрел на первую ссылку в моем комментарии выше, используя конструкцию VALUES
. Какую СУБД вы используете? — person BHOC schedule 19.05.2021
@van это SQL Server. После дальнейшего рассмотрения лучшим вариантом будет временная таблица. Но как мне отправить данные на SQL Server из Pandas Dataframe, а затем выполнить соединения во временной таблице? — person BHOC schedule 25.05.2021