2012-03-22 3 views
10

No puedo estar seguro de si los identificadores generados son continuos, si no, ¿hay alguna otra forma de obtenerlos?¿es posible buscar todas las lastrowids después de ejecutar many insert en 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() 

Respuesta

7

Cada vez MySQLdb ejecuta una consulta que implique una columna de incremento automático, el último ID de inserción se perderá a menos que lo lea antes de la próxima ejecución(), que con un executemany() que no podrá que hacer.

Usted tendría que cambiar el código anterior para algo como:

num = 0 
insert_ids = [] 

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

Desde el módulo de Python es realmente una capa fina sobre la API MySQL, aquí es una idea de cómo funciona la función mysql_insert_id().

+0

bueno, no daré ninguna esperanza, resuélvelo bien, excepto ejecuta secuencialmente, como dijiste – bigwesthorse

Cuestiones relacionadas