Как получить последний вставленный идентификатор в Postgresql с OpenERP - PullRequest
3 голосов
/ 02 мая 2011

У меня есть запрос на вставку, и я хочу получить последний вставленный идентификатор в OpenERP. Вот код:

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

Как получить последние вставленные идентификаторы? Что случилось, когда вставка пуста?

Ответы [ 4 ]

7 голосов
/ 02 мая 2011

Посмотрите на предложение RETURNING .

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 голос
/ 27 мая 2011

Видя ссылку на тег openerp, я бы посоветовал вам использовать форму openerp.Для вызова orm метод create вернет идентификатор только что созданной записи.(Затем он также работает для любых классов 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'})
1 голос
/ 02 мая 2011

RETURNING отлично работает, если вы работаете с v8.2 +.В противном случае вы, вероятно, будете использовать currval() ( документ здесь ).

0 голосов
/ 03 мая 2011

Похоже, Предложение Sentinel из предложения PostgreSQL RETURNING - это самое легкое для вас использование.

Вас также может интересовать, как класс ORM OpenERP управляет значениями идентификаторов для новых записей. Вот фрагмент из метода 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_seq», как вы можете видеть в orm.__init__() метод .

Я не знаю, чего вы пытаетесь достичь, но вам может быть проще использовать orm класс , чтобы создать запись для вас и позволить ей позаботиться о деталях. Например, метод создания возвращает значение идентификатора новой записи.

...