V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mywaiting
V2EX  ›  PostgreSQL

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

  •  
  •   mywaiting · 2016-12-02 00:45:36 +08:00 · 6768 次点击
    这是一个创建于 2914 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自己封装了一个 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 的同学遇到这么蛋疼的问题不?来分享一下,谢谢!

    7 条回复    2016-12-02 10:55:34 +08:00
    mywaiting
        1
    mywaiting  
    OP
       2016-12-02 01:09:51 +08:00
    好吧,每次都是 post 上来就直接解决了~

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

    这样就不会出错了

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

    return select lastval() as insert_id
    sagaxu
        4
    sagaxu  
       2016-12-02 06:03:31 +08:00 via Android
    Sqlalchemy 或者 peewee 二选一,都封装的很好了
    mywaiting
        5
    mywaiting  
    OP
       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
        6
    sagaxu  
       2016-12-02 09:58:16 +08:00
    @mywaiting 用 sqlalchemy 可以不用它的 orm ,只用 core 部分也不错,而且它也支持 raw sql ,自己封装的优势是什么呢?我封装过 php 的, python 的, java 的, C++的,除了自己比较熟悉实现细节可以做比较奇葩的定制,并没有额外收益。
    mywaiting
        7
    mywaiting  
    OP
       2016-12-02 10:55:34 +08:00
    @sagaxu 支持是支持,就是觉得代码好大好乱,自己造一个简单的也一百来行代码,实在没有心思再去学一套东西,有不懂的最后还是得去翻 sqlalchemy 的代码
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2357 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 01:52 · PVG 09:52 · LAX 17:52 · JFK 20:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.