2016-03-22 2 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() 

Разница между двумя кодами является только cursor.execute(). В первом коде у нас есть 2 cursor.execute (sql). Во втором коде мы имеем 1 cursor.execute (sql, multi = True) с 2 операторами SQL.

Оба кода не порождают ошибок, но второй код не вставляет строки.

Почему только первый код работает?

+0

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

ответ

2

Это утверждение:

cursor.execute(sql, multi=True) 

создает итератор над результатами. Похоже, что он ленив (т. Е. Он выполняет инструкции SQL только по мере необходимости). Вы никогда не запрашиваете результаты для второго оператора, поэтому он выполняет только первый. Попробуйте:

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

В общем, лучше всего использовать отдельные execute() вызовы.

+0

Thanks Kindall, очень поучительный. :) –

Смежные вопросы