【问题标题】:INSERT query executes but the table is empty using MySQLdbINSERT 查询执行,但使用 MySQLdb 的表为空
【发布时间】:2014-12-11 15:21:58
【问题描述】:

我写了一个 Python 脚本来执行如下的一些查询:

cur.execute('CREATE DATABASE IF NOT EXISTS testdb;')

table = """CREATE TABLE IF NOT EXISTS links (
             keyword VARCHAR(30) NOT NULL,
             url VARCHAR(30) NOT NULL)"""

cur.execute(table)

从 MySQL shell 中我发现没有任何问题:

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| testdb             |
+--------------------+
4 rows in set (0.02 sec)


mysql> SHOW TABLES;
+--------------------+
| Tables_in_testdb   |
+--------------------+
| links              |
+--------------------+
1 row in set (0.00 sec)

问题是一个带有两个参数的INSERT 查询:

cur3.execute("INSERT INTO links(keyword,url) VALUES(%s,%s);",(sys.argv[1],link))

检查 MySQL 有问题:

mysql> SELECT * from links;
Empty set (0.00 sec)

为什么执行INSERT查询后表为空?

【问题讨论】:

    标签: python mysql mysql-python


    【解决方案1】:

    确保使用Connection.commit提交您的更改:

    cur3.execute("INSERT INTO links(keyword, url) VALUES(%s, %s)", (sys.argv[1], link))
    connection_object.commit()
    

    根据MySQLdb FAQ - My data disappeared! (or won't go away!)

    从 1.2.0 开始,MySQLdb 默认禁用自动提交,如 DB-API 标准 (PEP-249) 要求的。如果你使用 InnoDB 表或其他类型的事务表类型,您需要 在关闭连接之前执行connection.commit(),否则没有 您的更改将写入数据库。

    相反,您也可以使用connection.rollback() 扔掉任何 自上次提交以来您所做的更改。

    重要提示:一些 SQL 语句——特别是 DDL 语句 像CREATE TABLE -- 是非事务性的,所以它们不能滚动 返回,它们会导致未决事务提交。

    【讨论】:

    • 您也可以在定义connection_object 后使用connection_object.autocommit() 自动提交
    • @xnx,感谢您的评论。但这不是DB API 2 的一部分。
    • 另一个选项,由 MySQLdb 实现但未在 API 中指定,是使用上下文管理器执行事务,例如:with connection as cursor: cursor.execute(query) 将在 with 块的末尾提交。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2011-06-04
    • 2019-05-09
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多