MySQL 为什么 cursor.execute(sql, multi=True) 不起作用但 2 cursor.execute(sql) 有效?

And*_*itt 3 python mysql

此代码有效:

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()
Run Code Online (Sandbox Code Playgroud)

此代码不起作用:

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()
Run Code Online (Sandbox Code Playgroud)

两个代码之间的区别只是 cursor.execute()。在第一个代码中,我们有 2 个 cursor.execute(sql)。在第二个代码中,我们有 1 个 cursor.execute(sql, multi=True) 和 2 个 SQL 语句。

两个代码都不会引发错误,但是,第二个代码不会插入行。

为什么只有第一个代码有效?

kin*_*all 5

这个说法:

cursor.execute(sql, multi=True)
Run Code Online (Sandbox Code Playgroud)

在结果上创建一个迭代器。它看起来很懒惰(即,它仅在需要时执行 SQL 语句)。你永远不会要求第二个语句的结果,所以它只执行第一个。尝试:

for _ in cursor.execute(sql, multi=True): pass
Run Code Online (Sandbox Code Playgroud)

一般来说,最好只使用单独的execute()调用。