我尝试将一堆数据插入数据库
insert_list = [(1,1,1,1,1,1),(2,2,2,2,2,2),(3,3,3,3,3,3),....] #up to 10000 tuples in this list
conn = pyodbc.connect('DRIVER={FreeTDS};SERVER=xxxxx;DATABASE=xxxx;UID=xx;PWD=xx;TDS_Version=7.0')
cursor = conn.cursor()
sql = "insert into ScanEMAxEMAHistoryDay(SecurityNumber, EMA1, EMA2, CrossType, DayCross, IsLocalMinMax) values (?, ?, ?, ?, ?, ?)"
cursor.executemany(sql, insert_list)
cursor.executemany(sql, insert_list)
噗嗤。编程错误: ('参数类型无效。 param-index=4 param-type=numpy.int64', 'HY105')
减少到 100 个元组:
cursor.executemany(sql, insert_list[:100])
cursor.executemany(sql, insert_list[:100])
噗嗤。编程错误: ('参数类型无效。 param-index=4 param-type=numpy.int64', 'HY105') cursor.executemany(sql, insert_list[:100])
减少到 5 个元组:
cursor.executemany(sql, insert_list[:5])
conn.commit()
这可以插入到数据库
我尝试:
sql = 'SET GLOBAL max_allowed_packet=50*1024*1024'
cursor.execute(sql)
在 excutemany() 之前,但它有一个错误:
噗嗤。编程错误: ('42000', "[42000] [FreeTDS][SQL Server]'GLOBAL' 不是可识别的 SET 选项。(195) (SQLExecDirectW)")
我是如何解决这个问题的。
谢谢。
您的问题不在于数据量本身,而在于某些元组包含numpy.int64
值,这些值不能直接用作 SQL 语句的参数值。例如
a = numpy.array([10, 11, 12], dtype=numpy.int64)
params = (1, 1, a[1], 1, 1, 1)
crsr.execute(sql, params)
会扔
编程错误: ('参数类型无效。 param-index=2 param-type=numpy.int64', 'HY105')
因为第三个参数值是 numpy 数组a
中的numpy.int64
元素。使用 int()
转换该值将避免此问题:
a = numpy.array([10, 11, 12], dtype=numpy.int64)
params = (1, 1, int(a[1]), 1, 1, 1)
crsr.execute(sql, params)
顺便说一下,原因
sql = 'SET GLOBAL max_allowed_packet=50*1024*1024'
cursor.execute(sql)
不起作用的是max_allowed_packet
是一个MySQL设置,对Microsoft SQL Server没有任何意义。
我和罗伯特做了同样的事情;我将所有内容转换为字符串。就我而言,它是一个熊猫数据框,我将其转换为字符串类型:
data = pandas.read_json(...)
data.astype(str).to_sql(...)
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.astype.html
如果您要检索的数据包含 URL,您可能会收到"未知协议"错误(或类似错误)。如果在强制转换为字符串类型后仍收到此错误,请尝试改用StringIO
:
import requests
from io import StringIO
...
data = pandas.read_json(StringIO(response.text))
其中response
是requests
库中对象Response
的实例,其属性text
包含 JSON 文本数据。
对于任何读到这篇文章的人来说,它都把我逼上了墙。
我的最终解决方案是将所有变量转换为"str",它工作正常。
使用 pyodbc
将参数传递到 SQL INSERT 语句时,我遇到了同样的错误。正如罗伯特所提到的,只需将变量转换为字符串即可。
例:语法 - str()
cursor.execute("INSERT INTO Table ([col1],[col2],[col3]...])VALUES(?,'test',?)", str(value1), str(value3))