问题
I'm trying to use psycopg2 executemany for a simple multi-insert but I can only make it work using dict and not "plain" sequence of values:
# given:
values = [1, 2, 3] ; cursor = conn.cursor()
# this raises TypeError: 'int' object does not support indexing:
cursor.executemany('INSERT INTO t (col_a) VALUES ( %s )', values)
# I also tried encapsulating my 'values' into a tuple/list but it gives another exception (TypeError: not all arguments converted during string formatting).
# while this is ok:
cursor.executemany('INSERT INTO t (col_a) VALUES ( %(value)s )', [ dict(value=v) for v in values ])
isn't it possible to give a "simple" list/tuple of values without using "named" parameter (%(value)s) ?
回答1:
executemany
expects a sequence of sequences, eg. a list of lists:
[[v] for v in values]
回答2:
executemany()
takes a list of parameters and each single parameter should be an object that works with execute()
, i.e., a tuple
or a dict
, but not a simple value like a number or string. That's why the second version is OK: you're generating multiple dict
s. You can also just write:
values = [(1,), (2,), (3,)]
where each element of the list is a tuple
.
来源:https://stackoverflow.com/questions/19154324/psycopg2-executemany-with-simple-list