从executemany语句中获取“返回”值

问题描述:

在psycopg2中使用Postgresql 9.5。从executemany语句中获取“返回”值

使用'返回',我可以检索插入的单行'id'。

sql = "insert into %s (%s) values (%s) returning id" % (table_name, columns, values_template)   
values = tuple(row_dict[key] for key in keys) 
cur.execute(sql, values) 
id_new_row = cur.fetchone()[0] 

我希望也检索最后使用executemany语句插入多行的ID。

cur.executemany(insert_sql , data_dict) 
#get id of the last row inserted 
id_new_row = cur.fetchone()[0] 

但是,这引发了一个DatabaseError,“没有结果取”。

这只是一个根本不可能的事情,或者我没有正确地调用结果?

我认为你想要做的事是不可能的。

首先,就PEP 249而言,您已经是一个狡猾的地方。具体来说,这是关于executemany的说法。

使用此方法,用于产生一个或多个结果集的操作的构成未定义的行为,并执行被许可(但不是必需的),当它检测到一个结果集已经通过创建引发异常调用操作。

如果您查看psycopg2源代码,您可以看到executemany设置了no_result标志。当你追踪到code that handles the query时,你可以看到它丢弃了任何结果(发布时为1582-1595行)。

+0

谢谢,这些来源是权威性的。这似乎是一个不行。不会追求。 – user3556757

+0

看来你是对的。我在'execute'上使用'fetchall()'而不在'executemany()'上使用。 – AKS