此代码有效:
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 :(得分:2)
本声明:
cursor.execute(sql, multi=True)
在结果上创建一个迭代器。看起来它很懒(即,它只根据需要执行SQL语句)。您永远不会要求第二个语句的结果,因此它只执行第一个语句。尝试:
for _ in cursor.execute(sql, multi=True): pass
一般情况下,最好只使用单独的execute()
来电。