【问题标题】:MySQL rows delete when program exitsMySQL 行在程序退出时删除
【发布时间】:2021-06-30 16:16:31
【问题描述】:

我正在使用 Python 和 MySQLdb 向我的数据库添加行。似乎当我的脚本退出时,行被删除了。我在脚本退出前的最后几行在表格上做了一个“select *”,它显示了我的一行。当我重新运行脚本时,第一行(打开连接后)执行相同的“选择 *”并返回零结果。我在这里真的很茫然。我已经为此工作了大约 2 个小时,但无法理解什么可以访问我的数据库。

另外,在运行脚本之间,我从终端手动运行“select *”,结果为零。

如果我从终端手动添加一行,它似乎会持续。

插入行的查询:

cursor.execute("INSERT INTO sessions(username, id, ip) VALUES (%s, %s, %s)", (username, SessionID, IP]))

我用来检查数据的查询:

cursor.execute("select * from sessions")
print cursor.fetchall()

这会显示程序退出前的行,然后在程序再次运行时不显示任何内容。

提前感谢所有帮助。

【问题讨论】:

  • 你使用事务吗?
  • 没有。我什至不知道什么是交易。
  • 你为什么不显示你的代码?
  • 我猜你需要commit你对数据库的更改。
  • 听起来事务确实没有提交。

标签: python mysql mysql-python


【解决方案1】:

执行查询后,您似乎需要 connection.commit() 进行更改(将 connection 替换为您的数据库连接变量)。

http://docs.python.org/library/sqlite3.html

Connection.commit(): 此方法提交当前事务。如果您不调用此方法,则自上次调用 commit() 以来您所做的任何事情都不会从其他数据库连接中看到。如果你想知道为什么你没有看到你写入数据库的数据,请检查你没有忘记调用这个方法。

【讨论】:

  • 你是对的。我在mysql-python.sourceforge.net/… 上找到了这个:“从 1.2.0 开始,MySQLdb 默认禁用自动提交,这是 DB-API 标准 (PEP-249) 的要求。如果您使用的是 InnoDB 表或其他类型的事务表类型,您需要在关闭连接之前执行 connection.commit(),否则您的任何更改都不会写入数据库。”因此,即使 MySQL 设置为自动提交,由于 MySQLdb,我仍然需要提交我的更改。非常感谢!
  • 应该是connection.commit(),而不是cursor.commit()
【解决方案2】:

检查另一个问题:Python MySQLdb update query fails

您可以找到一些关于如何提交、如何使用自动提交进行连接等的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2018-05-14
    • 1970-01-01
    相关资源
    最近更新 更多