【问题标题】:How to insert column from dataframe into SQL Server with pyodbc?如何使用 pyodbc 将数据框中的列插入 SQL Server?
【发布时间】:2019-12-27 04:46:25
【问题描述】:

我正在尝试将数据从 CSV(或 DataFrame)插入 MS SQL Server。 表已经创建好了,我使用 pyodbc 在 SQL 中创建了列。

我正在尝试使用 DataFrame 中的一列填充表中的第一列,但出现此错误:

错误: ('07002', '[07002] [Microsoft][ODBC SQL Server Driver]COUNT 字段不正确或语法错误 (0) (SQLExecDirectW)')

我尝试添加不同的列以查看该特定列是否存在问题,但我得到了相同的错误。 (列中没有空值。)

conn = pyodbc.connect("Driver={SQL Server};" 
                      "Server=natsqldevap2ncr\ins2;"
                      "Database=ECDWDEV;"
                      "Trusted_Connection=yes;")

for i in df.iloc[:,0]:
    insert_query1 =  """INSERT INTO TABLE_NAME(COLUMN_NAME) 
                   VALUES 
                   (?)"""

    cursor = conn.cursor()
    result = cursor.execute(insert_query1)
    conn.commit()

期望列 (df.iloc[:,0]) 中的所有值都插入到 SQL 表“TABLE_NAME”的“COLUMN_NAME”列中。

得到:

错误: ('07002', '[07002] [Microsoft][ODBC SQL Server Driver]COUNT 字段不正确或语法错误 (0) (SQLExecDirectW)')

【问题讨论】:

  • 将数据从 PYODBC 推送到 SQL 是一个非常糟糕的主意。我会完全找到另一个解决方案。例如保存 CSV 并手动上传,或一些来自 Python 的高效批量上传方法。
  • 您没有对i 执行任何操作,您只是在运行insert_query1 的次数与df 中的行数一样多。你打算这样做吗?
  • @FatihAkici 为什么这是个坏主意?哪种批量上传方式更好?
  • @it's-yer-boy-chet 理想情况下我会一次性加载整个专栏,最好的方法是什么?

标签: python sql pandas pyodbc


【解决方案1】:

您收到该错误消息是因为您尝试使用参数化查询,但您没有将参数 values 传递给 execute 方法。

此外,您无需通过在显式 for 循环中调用 execute 来逐行插入。您可以改用executemany

# test data
df = pd.DataFrame(
    [(1, 'Josh', 10000), (2, 'Michael', 5000), (3, 'Sara', 8000)],
    columns=['id', 'name', 'salary'])
#
crsr = cnxn.cursor()
crsr.fast_executemany = True
sql = "INSERT INTO Table_1 (id) VALUES (?)"
# extract column and convert to list of single-value tuples
data = [(x,) for x in df['id']]
crsr.executemany(sql, data)
cnxn.commit()

【讨论】:

  • 我收到一个错误“IntegrityError: ('23000', "[23000] [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot insert the value NULL into column"。仅供参考,没有数据中的 NULLS。“id”是 SQL 中列的名称吗?在数据框中?
  • “'id' 是 SQL 中列的名称吗?在数据框中?” - 在上面的示例代码中,是的,通常我们会尝试让两端的列名相同,但这并不是绝对必要的。至于空值,列中一定有映射到 SQL NULL 的东西,也许是 NaNminimal reproducible example 会很有帮助。
猜你喜欢
  • 2021-03-29
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2012-12-29
  • 2015-06-20
相关资源
最近更新 更多