2012-03-22 17 views
10

Tôi không thể chắc chắn liệu các id được tạo có liên tục hay không, nếu không, có cách nào khác để nhận chúng không?là nó có thể lấy tất cả các lastrowids sau khi thực hiện chèn trong 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() 

Trả lời

7

Mỗi lần mysqldb thực hiện một truy vấn liên quan đến một cột auto-increment, ID chèn cuối cùng sẽ bị mất, trừ khi bạn đọc nó trước khi tiếp thực hiện(), mà với một executemany(), bạn sẽ không thể làm.

Bạn sẽ phải thay đổi mã ở trên để một cái gì đó như:

num = 0 
insert_ids = [] 

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

Kể từ khi mô-đun Python thực sự là một lớp mỏng trên API MySQL, đây là một số cái nhìn sâu sắc như thế nào mysql_insert_id() chức năng hoạt động.

+0

tốt, tôi sẽ không hy vọng làm điều gì tốt đẹp giải quyết nó trừ khi thực hiện theo trình tự, giống như những gì bạn nói – bigwesthorse

Các vấn đề liên quan