[英]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.