2016-03-22 4 views
0

このコードは動作します:MySQLなぜcursor.execute(sql、multi = True)は動作しませんが、2 cursor.execute(sql)は動作しますか?

sql = """TRUNCATE TABLE product_groups;""" 
cursor.execute(sql) 

sql = """INSERT INTO product_groups (origin, type, name, brand, concentration, gender) 
      SELECT origin, type, name, brand, concentration, gender 
      FROM products 
      GROUP BY origin, type, name, brand, concentration, gender 
      ORDER BY brand, name;""" 
cursor.execute(sql) 

cursor.close() 
conn.commit() 
conn.close() 

このコードは動作しません:

sql = """TRUNCATE TABLE product_groups; 
      INSERT INTO product_groups (origin, type, name, brand, concentration, gender) 
      SELECT origin, type, name, brand, concentration, gender 
      FROM products 
      GROUP BY origin, type, name, brand, concentration, gender 
      ORDER BY brand, name;""" 
cursor.execute(sql, multi=True) 

cursor.close() 
conn.commit() 
conn.close() 

2つのコード間の差はちょうどcursor.executeです()。 最初のコードでは、2つのcursor.execute(sql)があります。 2番目のコードでは、2つのSQL文で1つのcursor.execute(sql、multi = True)があります。

両方のコードでエラーは発生しませんが、2番目のコードでは行が挿入されません。

なぜ最初のコードが機能するのですか?

+0

https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html –

答えて

2

この文:

cursor.execute(sql, multi=True) 

は、結果の反復子を作成します。それは怠惰な(つまり、必要に応じてSQL文だけを実行する)ようです。 2番目のステートメントの結果を求めることは決してないので、最初のステートメントを実行するだけです。試してみてください:

for _ in cursor.execute(sql, multi=True): pass 

一般的には、別の​​コールを使用する方が良いでしょう。

+0

ありがとうKindall、非常に啓発です。 :) –

関連する問題