自己封装了一个 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 的同学遇到这么蛋疼的问题不?来分享一下,谢谢!
1
mywaiting OP 好吧,每次都是 post 上来就直接解决了~
大体是,需要 insert update delete 的时候,没有带 returning 就直接执行 cursor.execute , return cursor.rowcount ;带 returning 的,就 return cursor.fetchone()[0] 这样就不会出错了 蛋疼! |
2
cevincheung 2016-12-02 04:27:59 +08:00
PHP 会自己处理返回。嗯。
|
3
cevincheung 2016-12-02 04:40:45 +08:00
插入不应该是自己二次封装的吗?
return select lastval() as insert_id |
4
sagaxu 2016-12-02 06:03:31 +08:00 via Android
Sqlalchemy 或者 peewee 二选一,都封装的很好了
|
5
mywaiting OP @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 早搞定了 |