gpt4 book ai didi

azure - 如何使用 pyodbc 将 pandas 数据帧的多行插入到 Azure Synapse SQL DW 中?

转载 作者:行者123 更新时间:2023-12-03 02:39:59 24 4
gpt4 key购买 nike

我正在使用 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”。所以,是的,我可以循环遍历并一一插入,但是当涉及较大尺寸的数据帧时,需要花费大量时间

当我尝试将所有行插入在一起时,下面的代码不起作用 将 pandas 导入为 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]Parse error at line: 1, column: 74: Incorrect syntax near ','. (103010) (SQLExecDirectW)")

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

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

最佳答案

这是因为 Azure Synapse SQL 不支持通过值构造函数进行多行插入。一种解决方法是链接“select(值列表)union all”。您的伪 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 - 如何使用 pyodbc 将 pandas 数据帧的多行插入到 Azure Synapse SQL DW 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61640122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com