2012-03-22 4 views
10

生成されたIDが連続的に生成されるかどうかは確かではありません。 executemany()で、あなたができなくなりますmysqldbにexecutemany insertを実行した後、すべてのlastrowidsをフェッチすることは可能ですか?

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

答えて

7

のMySQLdbは、自動インクリメント列を含むクエリを実行するたびに、あなたがそれを読んでいない限り、次を実行する前に、最後のインサートIDが(失われます)、する。

あなたが好きなものに上記のコードを変更する必要があります:Pythonモジュールが実際のMySQL APIの上に薄い層であるので

num = 0 
insert_ids = [] 

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

、ここmysql_insert_id()機能がどのように機能するかをいくつかの洞察があります。

+0

よく、私はどんな希望も与えません。 – bigwesthorse

関連する問題