【问题标题】:How to insert multiple rows of a pandas dataframe into Azure Synapse SQL DW using pyodbc?如何使用 pyodbc 将多行 pandas 数据帧插入 Azure Synapse SQL DW?
【发布时间】:2020-08-21 16:57:10
【问题描述】:

我正在使用 pyodbc 与 Azure Synapse SQL DW 建立连接。连接已成功建立。但是,在将 pandas 数据框插入数据库时​​,当我尝试将多行作为值插入时出现错误。但是,如果我一一插入行,它就会起作用。在 AWS Redshift 和 MS SQL 中将多行作为值插入在一起可以正常工作,但在 Azure Synapse SQL DW 中失败。我认为 Azure Synapse SQL 是 T-SQL 而不是 MS-SQL。尽管如此,我也找不到任何相关文档。

我有一个名为“df”的 pandas df,如下所示:

student_id  admission_date
    1          2019-12-12
    2          2018-12-08
    3          2018-06-30
    4          2017-05-30
    5          2020-03-11

下面的代码可以正常工作

import pandas as pd
import pyodbc
#conn object below is the pyodbc 'connect' object

    batch_size = 1
    i = 0
    chunk = df[i:i+batch_size]
    conn.autocommit = True
    sql = 'insert INTO {} values {}'.format('myTable', ','.join(
        str(e) for e in zip(chunk.student_id.values, chunk.admission_date.values.astype(str))))
    print(sql)
    cursor = conn.cursor()
    cursor.execute(sql)

如您所见,它仅插入 1 行“df”。所以,是的,我可以循环并一个一个地插入,但是当涉及到更大尺寸的数据帧时,它会花费很多时间

当我尝试将所有行插入在一起时,下面的代码不起作用 将熊猫导入为 pd 导入pyodbc

batch_size = 5
i = 0
chunk = df[i:i+batch_size]
conn.autocommit = True
sql = 'insert INTO {} values {}'.format('myTable', ','.join(
        str(e) for e in zip(chunk.student_id.values, chunk.admission_date.values.astype(str))))
print(sql)
cursor = conn.cursor()
cursor.execute(sql)

我在下面得到这个错误:

ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]解析错误 行:1,列:74:“,”附近的语法不正确。 (103010) (SQLExecDirectW)")

这是 2 行失败的示例 SQL 查询:

insert INTO myTable values (1, '2009-12-12'),(2, '2018-12-12')

【问题讨论】:

    标签: azure pyodbc azure-sql-data-warehouse azure-synapse


    【解决方案1】:

    这是因为 Azure Synapse SQL 不支持通过 values 构造函数进行多行插入。 一种解决方法是链接“选择(值列表)联合所有”。您的伪 SQL 应该如下所示:

    insert INTO {table}
    select {chunk.student_id.values}, {chunk.admission_date.values.astype(str)} union all
    ...
    select {chunk.student_id.values}, {chunk.admission_date.values.astype(str)}
    

    【讨论】:

      【解决方案2】:

      Azure Synapse Analytics 中的 COPY 语句是在 Synapse SQL 池中加载数据的更好方法。

      COPY INTO test_parquet
      FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/*.parquet'
      WITH (
          FILE_FORMAT = myFileFormat,
          CREDENTIAL=(IDENTITY= 'Shared Access Signature', SECRET='<Your_SAS_Token>')
      )
      

      您可以将 pandas 数据帧保存到 blob 存储中,然后使用 execute 方法触发复制命令。

      【讨论】:

        猜你喜欢
        • 2021-08-26
        • 2023-04-04
        • 2019-10-11
        • 2021-04-01
        • 1970-01-01
        • 2021-11-20
        • 2021-07-13
        • 2020-06-10
        • 2021-03-18
        相关资源
        最近更新 更多