Подтвердить что ты не робот

Получить первичный ключ после вставки строк с использованием sqlalchemy

Я вставляю много строк с sqlalchemy:

connection = engine.connect()
topic_res = connection.execute(message_topics.insert(),[
        {
        'mt_date': time.time(),
        'mt_title': title,
        'mt_hasattach':u'0',
        'mt_starter_id':member.member_id,
        'mt_start_time': time.time(),
        'mt_last_post_time': time.time(),
        'mt_invited_members': u'a:0:{}',
        'mt_to_count': u'1',
        'mt_to_member_id':member.member_id,
        'mt_replies': u'1',
        } for member in members ])
topic_res.inserted_primary_key

когда я пытаюсь получить вставленные первичные ключи, и я получаю:
AttributeError: объект 'MySQLExecutionContext_mysqldb' не имеет атрибута 'insert_primary_key', но topic_res - это объект ResultProxy из-за отладки.
Поэтому, если я вставляю только одну строку, я могу получить topic_res.inserted_primary_key.

4b9b3361

Ответ 1

Атрибут insert_primary_key работает только для однострочной вставки:

https://docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.ResultProxy.inserted_primary_key

Это применимо только к конструкциям вставки из одной строки(), которые явно не указывали Insert.returning().

это связано с широко распространенным ограничением в клиентских библиотеках базы данных, включая все DBAPI Python, где одновременно доступен только один атрибут "последний вставленный идентификатор".

Ответ 2

Возможно, ваш ProjectProxy - это список или похожий на список объект, поэтому вы должны перебирать элементы = db-rows этого объекта:

for e in topic_res:
    print e.inserted_primary_key

EDIT: метод "insert_primary_key" работает только для однострочных вставок. См. http://docs.sqlalchemy.org/en/rel_0_6/core/connections.html#sqlalchemy.engine.base.ResultProxy.inserted_primary_key