【问题标题】:How to optimize multiple calls to SQL when working with Python/Pandas?使用 Python/Pandas 时如何优化对 SQL 的多次调用?
【发布时间】:2020-03-05 19:42:03
【问题描述】:

我有一种情况,我试图从 SQL 导入一个表,将它与来自 pandas 的另一个数据帧连接,然后将连接的数据帧返回给 SQL。但是,我多次重复执行相同的过程。

例如,如果我有一些数据框,例如

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

对于 df1,然后我将使用 PyODBC 创建对 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 连接起来,然后使用sqlalchemy 将其返回给SQL

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 中的正确表匹配。

【问题讨论】:

    标签: python sql-server pandas dataframe


    【解决方案1】:

    因为,您在您拥有的每个数据框中附加新信息。

    
    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 以了解更多自定义设置。

    【讨论】:

    • 我没有使用if_exists='append的原因是如果程序意外运行多次,它不会创建不必要的记录。我并没有在我的示例中真正包含所有这些,因为我认为它与我的特定问题无关。我对他如何最好地循环遍历每个数据帧和 SQL 表,以便df1Table1df2Table2 等连接的事情感到困惑
    【解决方案2】:

    对于循环,您可以创建一个控制表,其中包含您感兴趣的表的名称,然后在列表中读取这些名称:

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

    然后你就可以遍历列表了:

        for item in table_names:
           df = do_something\concate\append()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多