从executemany语句中获取'return'd值

时间:2016-06-08 06:40:37

标签: python postgresql psycopg2

将Postgresql 9.5与psycopg2一起使用。

使用'return',我可以检索我插入的单行的'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,“没有结果可以获取”。

这是根本不可能做到的事情,还是我没有正确地要求结果?

1 个答案:

答案 0 :(得分:2)

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

首先,就PEP 249而言,你已经处于狡猾的境地。具体来说,它说的是关于executemany。

  

将此方法用于生成一个或多个结果集的操作构成未定义的行为,并且当检测到通过调用已创建结果集创建结果集时,允许(但不要求)实现引发异常。操作

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