移动并返回 psycopg2
mogrify and returning with psycopg2
我正在尝试生成自动查询。我在考虑使用 executemany,但我需要使用返回语句,所以我做了:
def format_bind(cols, rows):
return '(' + '), ('.join([', '.join(['%s'] * cols)] * rows) + ')'
def insert_many(table, values, id_column):
if not values:
return []
keys = values[0].keys()
conn = psycopg2.connect("dbname='db' user='postgres' host='localhost' password='postgres'")
cursor = conn.cursor()
query = cursor.mogrify("INSERT INTO {} ({}) VALUES {} RETURNING {}".format(table,
', '.join(keys),
format_bind(len(keys), len(values)),
id_column),
[tuple(v.values()) for v in values])
cursor.execute(query)
return [t[0] for t in (cursor.fetchall())]
问题是当我执行它时,我得到:error list index out of range
有人可以帮我解决这个问题吗?
问题是我认为我必须为每个要插入的值插入一个字符串参数插值。我来解释一下:
假设我有一个包含 2 个字典(长度为 3)的列表,其中包含要插入的数据:
lst = [{'a': 21, 'b': 9, 'c': 33}, {'a': 76, 'b': 84, 'c': 46}]
为了插入这些值,我做了类似的事情:
query = curs.mogrify("INSERT INTO {} ({}) VALUES {} RETURNING {}".format(
table,
', '.join(lst[0].keys()),
', '.join(['%s'] * len(lst[0].values())),
'id'
), [tuple(v.values()) for v in lst])
总共附加三个 '%s'
(lst
中单个字典中的每个项目一个)。这样做的结果是异常消息 error list index out of range
发生这种情况是因为 curs.mogrify()
中的每个字典只需要 一个 '%s'
lst
,所以对于这种情况,它只需要两个 '%s'
而不是三个。
因此,从 lst
插入数据的正确格式是:
query = curs.mogrify("INSERT INTO {} ({}) VALUES {} RETURNING {}".format(
table,
', '.join(lst[0].keys()),
', '.join(['%s'] * len(lst)),
'id'
), [tuple(v.values()) for v in lst])
将 len(lst[0].values())
替换为 len(lst)
.
这就是我解决问题的方法(我不明白这个是因为我没有正确阅读示例代码)。希望对您有所帮助。
山姆
我正在尝试生成自动查询。我在考虑使用 executemany,但我需要使用返回语句,所以我做了:
def format_bind(cols, rows):
return '(' + '), ('.join([', '.join(['%s'] * cols)] * rows) + ')'
def insert_many(table, values, id_column):
if not values:
return []
keys = values[0].keys()
conn = psycopg2.connect("dbname='db' user='postgres' host='localhost' password='postgres'")
cursor = conn.cursor()
query = cursor.mogrify("INSERT INTO {} ({}) VALUES {} RETURNING {}".format(table,
', '.join(keys),
format_bind(len(keys), len(values)),
id_column),
[tuple(v.values()) for v in values])
cursor.execute(query)
return [t[0] for t in (cursor.fetchall())]
问题是当我执行它时,我得到:error list index out of range
有人可以帮我解决这个问题吗?
问题是我认为我必须为每个要插入的值插入一个字符串参数插值。我来解释一下:
假设我有一个包含 2 个字典(长度为 3)的列表,其中包含要插入的数据:
lst = [{'a': 21, 'b': 9, 'c': 33}, {'a': 76, 'b': 84, 'c': 46}]
为了插入这些值,我做了类似的事情:
query = curs.mogrify("INSERT INTO {} ({}) VALUES {} RETURNING {}".format(
table,
', '.join(lst[0].keys()),
', '.join(['%s'] * len(lst[0].values())),
'id'
), [tuple(v.values()) for v in lst])
总共附加三个 '%s'
(lst
中单个字典中的每个项目一个)。这样做的结果是异常消息 error list index out of range
发生这种情况是因为 curs.mogrify()
中的每个字典只需要 一个 '%s'
lst
,所以对于这种情况,它只需要两个 '%s'
而不是三个。
因此,从 lst
插入数据的正确格式是:
query = curs.mogrify("INSERT INTO {} ({}) VALUES {} RETURNING {}".format(
table,
', '.join(lst[0].keys()),
', '.join(['%s'] * len(lst)),
'id'
), [tuple(v.values()) for v in lst])
将 len(lst[0].values())
替换为 len(lst)
.
这就是我解决问题的方法(我不明白这个是因为我没有正确阅读示例代码)。希望对您有所帮助。
山姆