PostgreSQL 中返回刚刚 insert 数据的 ID 好麻烦

2016-12-02 00:45:36 +08:00
 mywaiting

自己封装了一个 psycopg2 的 execute 方法:

			def execute(self, sql, params=None):
				cursor.execute(sql, params)
				# return
				# return cursor.rowcount
				return cursor.fetchone()[0] # return last_insert_row_id !!!

这样就能使用类似这样的 insert in () values () returning id 的 SQL 语句来返回刚刚插入数据的 ID

然后问题就来了,要是 update 数据的时候没有写 returning id 这样的有返回的句子,那么断然会报 ProgrammingError: no results to fetch

然而这个 execute 是 insert update delete 都会用到的啊,难道要 insert 搞一个 insert method ? update 单独来个 update method ?这样?

很不优美好不好!

想想我大 MySQL ,那个简单.....

有使用 Postgres 的同学遇到这么蛋疼的问题不?来分享一下,谢谢!

6789 次点击
所在节点    PostgreSQL
7 条回复
mywaiting
2016-12-02 01:09:51 +08:00
好吧,每次都是 post 上来就直接解决了~

大体是,需要 insert update delete 的时候,没有带 returning 就直接执行 cursor.execute , return cursor.rowcount ;带 returning 的,就 return cursor.fetchone()[0]

这样就不会出错了

蛋疼!
cevincheung
2016-12-02 04:27:59 +08:00
PHP 会自己处理返回。嗯。
cevincheung
2016-12-02 04:40:45 +08:00
插入不应该是自己二次封装的吗?

return select lastval() as insert_id
sagaxu
2016-12-02 06:03:31 +08:00
Sqlalchemy 或者 peewee 二选一,都封装的很好了
mywaiting
2016-12-02 08:53:19 +08:00
@sagaxu sqlalchemy 的代码太长太庞大了看不懂就不说了

peewee 的实现很简单的,就是分别对 MySQL 和 PostgreSQL 设置 last_insert_id 这个方法

其中 PostgreSQL 中的 last_insert_id 方法的实现,就是跟我上面的方法是一样的,有 returning 或者 mutil 返回的时候,就 cursor.execute , return cursor.fetchall() ,没有带 returning 的就是 return cursor.fetchone()[0]

顺便说一句 orm ,其实我需要的就是 封装好的 select update insert delete 方法就足够了, orm 啥的,实在是画蛇添足, join 语句多的话,把 orm 的这套语法搞清楚弄明白后,我写 raw sql 早搞定了
sagaxu
2016-12-02 09:58:16 +08:00
@mywaiting 用 sqlalchemy 可以不用它的 orm ,只用 core 部分也不错,而且它也支持 raw sql ,自己封装的优势是什么呢?我封装过 php 的, python 的, java 的, C++的,除了自己比较熟悉实现细节可以做比较奇葩的定制,并没有额外收益。
mywaiting
2016-12-02 10:55:34 +08:00
@sagaxu 支持是支持,就是觉得代码好大好乱,自己造一个简单的也一百来行代码,实在没有心思再去学一套东西,有不懂的最后还是得去翻 sqlalchemy 的代码

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/324707

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX