2012-09-05 13 views
14

estoy insertando filas con muchos sqlalchemy:Obtener clave principal después de insertar filas usando 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 

cuando trate de obtener las claves principales insertados, y estoy consiguiendo:
AttributeError: objeto 'MySQLExecutionContext_mysqldb' tiene no hay atributo 'inserted_primary_key', pero topic_res es el objeto 'ResultProxy' debido a la depuración.
Así que si inserto solo una fila, puedo obtener topic_res.inserted_primary_key.

+0

Hay buenas respuestas, acuerde con cualquiera de ellas. – I159

Respuesta

13

el atributo inserted_primary_key sólo es funcional para una inserción de una sola fila:

http://docs.sqlalchemy.org/en/rel_0_7/core/connections.html?highlight=inserted_primary_key#sqlalchemy.engine.base.ResultProxy.inserted_primary_key

This only applies to single row insert() constructs which did not explicitly specify Insert.returning().

esto se debe a una limitación muy extendido en las bibliotecas de cliente de base de datos que incluye todas DBAPIs Python donde sólo uno El atributo "última identificación insertada" se deja disponible a la vez.

+0

Entonces, ¿para MySQL no hay forma de hacer una inserción múltiple y obtener la lista de todos los ID insertados en una sola llamada? Estoy viendo una diferencia de rendimiento de 25x al insertar todo a la vez en lugar de recorrer cada uno y recuperar la clave_primaria_instalada. – Zitrax

+1

que yo sepa, DBAPI no es compatible con esto y los adaptadores de mysql no parecen ofrecer ninguna API no estándar para esto. esta es una respuesta antigua así que eche un vistazo a http://docs.sqlalchemy.org/en/rel_0_9/faq.html#im-inserting-400-000-rows-with- the-orm-and-it-s- realmente lento para una visión general de la situación. – zzzeek

Cuestiones relacionadas