使用 pymssql 将数据插入 SQL Server 表

Kri*_*lal 5 python sql-server pymssql pandas

我正在尝试将数据框写入 SQL Server 表。我的代码:

conn = pymssql.connect(host="Dev02", database="DEVDb")
cur = conn.cursor()
query = "INSERT INTO dbo.SCORE_TABLE VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
cur.executemany(query, df_sql)
conn.commit()
cur.close()
conn.close()
Run Code Online (Sandbox Code Playgroud)

的尺寸df_sql(5860, 20)在所述数据帧的列即数目是相同的列在SQL Server表中的数字。我仍然收到以下错误:

ValueError:sql 中的占位符多于可用的参数

更新如下

根据评论之一,我尝试使用turbodbc如下:

conn = turbodbc.connect(driver="{SQL Server}", server="Dev02", Database="DEVDb")
conn.use_async_io = True
cur = conn.cursor()
query = "INSERT INTO dbo.STG_CONTACTABILITY_SCORE VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
cur.executemany(query, df_sql.values)
cur.commit()
cur.close()
conn.close()
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ValueError:包含多个元素的数组的真值不明确。使用 a.any() 或 a.all()

我不明白。这里有什么问题。我明白了df_sql.values,我没有发现任何问题。

ndarray 的第一行如下:

[nan 'DUSTIN HOPKINS' 'SOUTHEAST MISSOURI STATE UNIVERSITY' 13.0
  '5736512217' None None 'Monday' '8:00AM' '9:00AM' 'Summer' None None None
  None '2017-12-22 10:39:30.626331' 'Completed' None '1-11KUFFZ'
  'Central Time Zone']
Run Code Online (Sandbox Code Playgroud)

vir*_*vid 7

我认为您只需要指定每个列名称,并且不要忘记表必须具有 id 字段来收取数据框索引:

conn = pymssql.connect(host="Dev02", database="DEVDb")
cur = conn.cursor()
query = """INSERT INTO dbo.SCORE_TABLE(index, column1, column2, ..., column20)
            VALUES (?, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, 
            %s, %s, %s, %s, %s, %s)"""
cur.executemany(query, df_sql)
conn.commit()
cur.close()
conn.close()
Run Code Online (Sandbox Code Playgroud)

好吧,我一直在使用 pandas,并将最后一个数据帧导出到 csv,如下所示:

df.to_csv('new_file_name.csv', sep=',', encoding='utf-8')
Run Code Online (Sandbox Code Playgroud)

然后我就使用了pyobdcTransact BULK INSERT-SQL,例如:

import pyodbc

conn = pyodbc.connect(DRIVER='{SQL Server}', Server='server_name', Database='Database_name', trusted_connection='yes')
cur = conn.cursor()

cur.execute("""BULK INSERT table_name
               FROM 'C:\\Users\\folders path\\new_file_name.csv'
               WITH
               (
                   CODEPAGE = 'ACP',
                   FIRSTROW = 2,
                   FIELDTERMINATOR = ',',
                   ROWTERMINATOR = '\n'
               )""")
conn.commit()

cur.close()
conn.close()
Run Code Online (Sandbox Code Playgroud)

将 15314 行记入 SQL Server 只需一秒。我希望这能给你一个想法。