当前位置: 首页 > 面试题库 >

MySQLdb.cursor.execute无法运行多个查询

楚洋
2023-03-14
问题内容

我们正在尝试将包含多个插入语句的SQL文件作为一个查询运行,但是rollback当任何一个语句包含错误时,它似乎都会失败。

MySQLd配置:

sql_mode = STRICT_ALL_TABLES
default-storage-engine = innodb

Python代码:

from contextlib import closing
import MySQLdb
database_connection = MySQLdb.connect(host="127.0.0.1", user="root")
with closing(database_connection.cursor()) as cursor:
    database_connection.begin()
    cursor.execute('DROP DATABASE IF EXISTS db_name')
    cursor.execute('CREATE DATABASE db_name')
    cursor.execute('USE db_name')
    cursor.execute('CREATE TABLE table_name(first_field INTEGER)')
with closing(database_connection.cursor()) as cursor:
    try:
        database_connection.begin()
        cursor.execute('USE db_name')
        cursor.execute('INSERT INTO table_name VALUES (1)')
        cursor.execute('INSERT INTO table_name VALUES ("non-integer value")')
        database_connection.commit()
    except Exception as error:
        print("Exception thrown: {0}".format(error))
        database_connection.rollback()
        print("Rolled back")
with closing(database_connection.cursor()) as cursor:
    try:
        database_connection.begin()
        cursor.execute('USE db_name')
        cursor.execute('INSERT INTO table_name VALUES (1); INSERT INTO table_name VALUES ("non-integer value")')
        database_connection.commit()
    except:
        print("Exception thrown: {0}".format(error))
        database_connection.rollback()
        print("Rolled back")

预期结果:打印两次“抛出异常”和“回滚”。

使用MySQL-python 1.2.4的实际结果:

Exception thrown: (1366, "Incorrect integer value: 'non-integer value' for column 'first_field' at row 1")
Rolled back
Exception thrown: (1366, "Incorrect integer value: 'non-integer value' for column 'first_field' at row 1")
Traceback (most recent call last):
  File "test.py", line 30, in <module>
    print("Rolled back")
  File ".../python-2.7/lib/python2.7/contextlib.py", line 154, in __exit__
    self.thing.close()
  File ".../virtualenv-python-2.7/lib/python2.7/site-packages/MySQLdb/cursors.py", line 100, in close
    while self.nextset(): pass
  File ".../virtualenv-python-2.7/lib/python2.7/site-packages/MySQLdb/cursors.py", line 132, in nextset
    nr = db.next_result()
_mysql_exceptions.OperationalError: (1366, "Incorrect integer value: 'non-integer value' for column 'first_field' at row 1")

是什么赋予了?我们是否真的必须解析SQL以拆分语句(需要进行所有转义和引号处理)才能在多个executes中运行它们?


问题答案:

显然,在MySQLdb(aka。MySQL- python)中无法执行此操作,因此我们最终只是communicate将数据写入subprocess.Popen([mysql, ...], stdin=subprocess.PIPE)并检查returncode



 类似资料:
  • 问题内容: 我正在尝试使用mybatis运行一个简单的sql查询,但是它给了我以下异常 我的UserMapper.xml是 我的UserMapper是 我试图在我的LoginController中访问它 我的spring-servlet.xml文件是 我不知道为什么会出现此错误。 问题答案: 看看错误 看来myBatis找不到您的查询。那可能是因为找不到您的xml映射。它应该符合您的配置: 在项目

  • 在Crystal Reports中,我使用以下查询(针对Oracle数据库)为报表中的单个字段生成数据: 这可以很好地工作,并基于提供的{HB_As_At_Date}(the{?}语法是Crystal将参数值嵌入SQL(SQL)的方法。不过,上述查询的内容不是我的问题——我想做的是在几个不同的日期重复运行它,并将输出输入Crystal以供在报告中使用。 假设我希望在9月的每个星期一运行这个查询,我

  • 问题内容: 我有一个脚本,它会根据几个因素生成一个SQL插入或更新脚本。以下是其生成的脚本的字符串值: 如果我在连接到数据库的sql编辑器中运行该脚本,它将运行得很好,并插入所有预期的行。但是,当这样调用该查询时: 返回此: 我将查询的生成方式从创建多个查询的串联字符串更改为创建查询数组并一次运行一个查询数组-这似乎已解决了该问题。 问题答案: 您不能通过单个php mysqli_query函数运

  • 问题内容: (来自/ r / androiddev的x- post ) 我想以说这不是“更好”的帖子作为开头。严格来说,这是一个关于如何使用Dagger构建东西(以及如何在Kodein中构建它以帮助说明问题)的问题。 我已经在多个工作项目中使用Kodein几年了,但是我发现它使用起来非常容易,以至于我再也不会看过Dagger了。我开始了一个新的个人项目,我想再给Dagger做个尝试。 为简单起见,

  • 问题内容: 如何在一台机器上运行多个JVM?您如何在其他JVM中调用方法? 问题答案: 如何在一台机器上运行多个JVM? 只需启动多个进程即可。 您如何在其他JVM中调用方法? 使用任何类型的RPC框架(RMI,EJB,Web服务等)。

  • 问题内容: 当我使用hibernate关系映射时 每次获取时都会关联多个查询。 谁能帮助我了解关系的运作方式? 问题答案: hibernate关系适用于不同的提取策略.. !! Hibernate提供了4种检索数据的策略: 选择 在此方法中,将触发多个SQL。为检索父表中的所有记录而触发第一个。其余的被解雇以获取每个父记录的记录。这基本上是N + 1问题。第一个查询从数据库中检索N条记录,在本例中