簡體   English   中英

如何插入Z3A43B4F88325D94022C0EFA9C2FA2FA2FA2FAZ Z6A8064B5DF4794555555555555555555555555555057DZ將多個行插入Z3A4325D940222C0EFA9C2FA2FA2FAPAZ FAS

[英]How to insert multiple rows of a pandas dataframe into Azure Synapse SQL DW using pyodbc?

我正在使用 pyodbc 與 Azure Synapse SQL DW 建立連接。 連接已成功建立。 但是,在將 pandas dataframe 插入數據庫時,當我嘗試將多行作為值插入時出現錯誤。 但是,如果我一一插入行,它就會起作用。 將多行作為用於 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”。 所以,是的,我可以循環並一一插入,但是當涉及到更大尺寸的數據幀時,它會花費很多時間

當我嘗試將所有行一起插入時,下面的代碼不起作用 import pandas as pd import 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 Synapse SQL 不支持通過值構造函數進行多行插入。 一種解決方法是鏈接“選擇(值列表)聯合所有”。 您的偽 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)}

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 dataframe 保存到 blob 存儲中,然后使用執行方法觸發復制命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM