2012-03-22 2 views
10

Non posso essere sicuro che gli ID generati siano continui, se no, c'è qualche altra via per ottenerli?è possibile recuperare tutte le lastrowid dopo l'esecuzione di execemany in mysqldb?

class BaseDao(object): 

    def __init__(self,pooldb): 
     self.pooldb = pooldb 

    def insertmany(self,sql,args): 
     conn,cur = None,None 
     try: 
      conn = pooldb.dedicated_connection() 
      cur = conn.cursor() 
      num=cur.executemany(sql,args) 
      if num <= 0: 
       raise Exception("insert failure with num equals zero") 
      lastrowid = int(cur.lastrowid) 
      return [range(lastrowid - num + 1,lastrowid+1)] 
     except: 
      conn.rollback() 
      traceback.print_exc() 
      raise Exception("error happened when insert sql=%s args=%s " % (sql,str(args))) 
     finally: 
      if cur: 
       cur.close() 
      if conn: 
       conn.close() 

risposta

7

Ogni volta MySQLdb esegue una query che coinvolge una colonna di incremento automatico, l'ultimo ID inserto sarà persa a meno che non lo si legge prima del prossimo execute(), che con un'executemany() non sarà in grado fare.

Lei avrebbe dovuto cambiare il codice di cui sopra a qualcosa di simile:

num = 0 
insert_ids = [] 

for arg in args: 
    num += cur.execute(sql, arg) 
    insert_ids.append(cur.lastrowid) 

Dal momento che il modulo Python è in realtà un sottile strato sopra l'API di MySQL, qui è una certa comprensione di come funziona la funzione mysql_insert_id().

+0

beh, non darò alcuna speranza di risolverlo con decisione tranne che eseguirlo in sequenza, proprio come hai detto – bigwesthorse