PostgreSQL 中返回刚刚 insert 数据的 ID 好麻烦 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mywaiting

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

  •  
  •   mywaiting 2016 年 12 月 2 日 7196 次点击
    这是一个创建于 3430 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自己封装了一个 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 月 2 日
    好吧,每次都是 post 上来就直接解决了~

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

    这样就不会出错了

    蛋疼!
    cevincheung
        2
    cevincheung  
       2016 年 12 月 2 日
    PHP 会自己处理返回。嗯。
    cevincheung
        3
    cevincheung  
       2016 年 12 月 2 日
    插入不应该是自己二次封装的吗?

    return select lastval() as insert_id
    sagaxu
        4
    sagaxu  
       2016 年 12 月 2 日 via Android
    Sqlalchemy 或者 peewee 二选一,都封装的很好了
    mywaiting
        5
    mywaiting  
    OP
       2016 年 12 月 2 日
    @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 月 2 日
    @mywaiting 用 sqlalchemy 可以不用它的 orm ,只用 core 部分也不错,而且它也支持 raw sql ,自己封装的优势是什么呢?我封装过 php 的, python 的, java 的, C++的,除了自己比较熟悉实现细节可以做比较奇葩的定制,并没有额外收益。
    mywaiting
        7
    mywaiting  
    OP
       2016 年 12 月 2 日
    @sagaxu 支持是支持,就是觉得代码好大好乱,自己造一个简单的也一百来行代码,实在没有心思再去学一套东西,有不懂的最后还是得去翻 sqlalchemy 的代码
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3681 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 42ms UTC 04:36 PVG 12:36 LAX 21:36 JFK 00:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86