2012-09-05 17 views
14

sto inserendo molte righe con sqlalchemy:Ottenere chiave primaria dopo l'inserimento di righe utilizzando 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 

quando ho cercare di ottenere le chiavi primarie inseriti, e sto ricevendo:
AttributeError: oggetto 'MySQLExecutionContext_mysqldb' ha nessun attributo 'inserted_primary_key', ma topic_res è oggetto 'ResultProxy' a causa del debug.
Quindi, se inserisco solo una riga, posso ottenere topic_res.inserted_primary_key.

+0

Ci sono buone risposte, si prega di concordare con nessuno di loro. – I159

risposta

13

l'attributo inserted_primary_key è funzionale solo per un inserto sola riga:

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().

ciò è dovuto ad una limitazione ampiamente diffusa in librerie client di database comprese tutte pitone DBAPIs cui solo uno l'attributo "ultimo ID inserito" è disponibile alla volta.

+0

Quindi per MySQL non c'è modo di fare un multi insert e ottenere l'elenco di tutti gli id ​​inseriti in una chiamata? Vedo una differenza di prestazioni di 25x quando si inserisce tutto in una volta invece di eseguire il loop su ciascuna e recuperare la chiave inserita_primaria. – Zitrax

+1

non che io sappia, DBAPI non supporta questo e gli adattatori mysql non sembrano offrire alcuna API non standard per questo. questa è una vecchia risposta, quindi dai un'occhiata a http://docs.sqlalchemy.org/en/rel_0_9/faq.html#im-inserting-400-000-rows-with-the-orm-and-it-s- veramente lento per una panoramica della situazione. – zzzeek

Problemi correlati