web-dev-qa-db-ja.com

executemany()で行を挿入するときの「無効なパラメータータイプ」(numpy.int64)

たくさんのデータをデータベースに挿入しようとしています

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)

pyodbc.ProgrammingError :( '無効なパラメータータイプ。param-index= 4 param-type = numpy.int64'、 'HY105')

100タプルに減らします:

cursor.executemany(sql, insert_list[:100])

cursor.executemany(sql、insert_list [:100])

pyodbc.ProgrammingError :( '無効なパラメータータイプ。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()の前ですが、エラーがあります:

pyodbc.ProgrammingError :( '42000'、 "[42000] [FreeTDS] [SQL Server] 'GLOBAL'は認識されたSETオプションではありません。(195)(SQLExecDirectW)")

どうやってこれを解決したのですか。

ありがとうございました。

9
YONG BAGJNS

問題はデータの量ではありませんそれ自体、タプルの一部にSQLステートメントのパラメーター値として直接使用できない_numpy.int64_値が含まれていることがあります。例えば、

_a = numpy.array([10, 11, 12], dtype=numpy.int64)
params = (1, 1, a[1], 1, 1, 1)
crsr.execute(sql, params)
_

投げます

ProgrammingError :( '無効なパラメータタイプ。param-index= 2 param-type = numpy.int64'、 'HY105')

3番目のパラメーター値は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_がMicrosoft SQLServerにとって意味のないMySQL設定であるということです。

9
Gord Thompson