如何使用OpenERP在Postgresql中获取最后一个插入的id

时间:2011-05-02 06:07:39

标签: python postgresql openerp

我有一个插入查询,我想在OpenERP中获取最后一个插入的id。这是代码:

query = "INSERT INTO foo SELECT * FROM bar"
cr.execute(query) # cr => cursor

如何获取最后插入的ID?插入为空时发生了什么?

4 个答案:

答案 0 :(得分:7)

查看RETURNING clause

INSERT INTO table [ ( column [, ...] ) ]
    { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
    [ RETURNING * | output_expression [ AS output_name ] [, ...] ]
  

在表分发器中插入一行,返回由DEFAULT子句生成的序列号:

INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
   RETURNING did;

答案 1 :(得分:1)

如果您正在运行v8.2 +,

RETURNING效果很好。否则,您可能会考虑使用currval()doc here)。

答案 2 :(得分:1)

看到openerp标签的链接,我不得不建议你使用openerp orm。对于orm调用,create方法将返回新创建的记录的id。 (它也适用于您可能定义的任何osv_memory类)

参考: http://doc.openerp.com/v6.0/developer/2_5_Objects_Fields_Methods/methods.html#osv.osv.osv.create

示例:

new_id = self.pool.get('model.name').create(cr, uid, {'name': 'New Name'})

答案 3 :(得分:0)

看起来Sentinel's suggestionPostgreSQL RETURNING clause对您来说是最简单的事情。

您可能还对OpenERP的ORM类如何管理新记录的id值感兴趣。以下是orm.create()方法的摘录:

    # Try-except added to filter the creation of those records whose filds are readonly.
    # Example : any dashboard which has all the fields readonly.(due to Views(database views))
    try:
        cr.execute("SELECT nextval('"+self._sequence+"')")
    except:
        raise except_orm(_('UserError'),
                    _('You cannot perform this operation. New Record Creation is not allowed for this object as this object is for reporting purpose.'))
    id_new = cr.fetchone()[0]

它使用每个表的序列来生成新的id值。序列的名称默认为表格的名称加上'_id_seq',您可以在orm.__init__() method中看到。

我不知道您要完成什么,但您可能会发现使用the orm class为您创建记录更容易,并让它处理细节。例如,the create method返回新记录的id值。