使用 pymssql 将数据插入 SQL 服务器 Table
Insert Data to SQL Server Table using pymssql
我正在尝试将数据帧写入 SQL 服务器 Table。我的代码:
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()
df_sql
的维度是 (5860, 20)
,即数据框中的列数与 SQL 服务器 Table 中的列数相同。我仍然收到以下错误:
ValueError: more placeholders in sql than params available
更新如下
根据其中一条评论,我尝试使用 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()
我收到以下错误:
ValueError: The truth value of an array with more than one element is
ambiguous. Use a.any() or 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']
如果我理解正确你想使用DataFrame.to_sql()方法:
df_sql.to_sql('dbo.SCORE_TABLE', conn, index=False, if_exists='append')
我认为你只需要指定每个列名并且不要忘记 table 必须有 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()
好的,我一直在使用 pandas,我将最后一个数据帧导出到 csv,如:
df.to_csv('new_file_name.csv', sep=',', encoding='utf-8')
然后我就用了 pyobdc
和 BULK INSERT
Transact-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()
向 SQL 服务器收取 15314 行是一秒钟。我希望这能给你一个想法。
可能 executemany
将来自您的 df.values
调用的 ndarray
中的每一行视为 一个 项,因为值之间没有逗号分隔符.因此,占位符的数量超过实际绑定值,您会收到不匹配错误。
考虑将数组转换为元组的元组(或元组的 lists/list 的 lists/tuple 的列表),然后将该对象传递给 executemany
:
query = "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)"
sql_data = tuple(map(tuple, df.values))
cur.executemany(query, sql_data)
cur.commit()
这对我有用-
insert_query = """INSERT INTO dbo.temptable(CHECK_TIME, DEVICE, METRIC, VALUE, TOWER, LOCATION, ANOMALY, ANOMALY_SCORE, ANOMALY_SEVERITY)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)"""
write_data = tuple(map(tuple, data_frame.values))
cursor.executemany(insert_query, write_data)
con.commit()
cursor.close()
con.close()
我正在尝试将数据帧写入 SQL 服务器 Table。我的代码:
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()
df_sql
的维度是 (5860, 20)
,即数据框中的列数与 SQL 服务器 Table 中的列数相同。我仍然收到以下错误:
ValueError: more placeholders in sql than params available
更新如下
根据其中一条评论,我尝试使用 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()
我收到以下错误:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or 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']
如果我理解正确你想使用DataFrame.to_sql()方法:
df_sql.to_sql('dbo.SCORE_TABLE', conn, index=False, if_exists='append')
我认为你只需要指定每个列名并且不要忘记 table 必须有 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()
好的,我一直在使用 pandas,我将最后一个数据帧导出到 csv,如:
df.to_csv('new_file_name.csv', sep=',', encoding='utf-8')
然后我就用了 pyobdc
和 BULK INSERT
Transact-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()
向 SQL 服务器收取 15314 行是一秒钟。我希望这能给你一个想法。
可能 executemany
将来自您的 df.values
调用的 ndarray
中的每一行视为 一个 项,因为值之间没有逗号分隔符.因此,占位符的数量超过实际绑定值,您会收到不匹配错误。
考虑将数组转换为元组的元组(或元组的 lists/list 的 lists/tuple 的列表),然后将该对象传递给 executemany
:
query = "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)"
sql_data = tuple(map(tuple, df.values))
cur.executemany(query, sql_data)
cur.commit()
这对我有用-
insert_query = """INSERT INTO dbo.temptable(CHECK_TIME, DEVICE, METRIC, VALUE, TOWER, LOCATION, ANOMALY, ANOMALY_SCORE, ANOMALY_SEVERITY)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)"""
write_data = tuple(map(tuple, data_frame.values))
cursor.executemany(insert_query, write_data)
con.commit()
cursor.close()
con.close()