如何在Python中获取写入MySQL数据库的权限?

0 投票
1 回答
984 浏览
提问于 2025-04-18 13:00

我觉得我在用Python和MySQL时遇到了权限问题。这是我的测试代码 test.py

#!/usr/bin/python
import MySQLdb

#change the host, user, passwd, and db below as necessary
db = MySQLdb.connect(host="localhost", user="username", passwd="password", db="database")

cur = db.cursor()
cur.execute("SELECT * from table")
a = cur.fetchall()
print "pre values"
print a

cur.execute("insert into table values(3)")
db.commit

cur.execute("SELECT * from table")
a = cur.fetchall()
print "updated values"
print a

cur.close()
db.close()

当我在命令行中执行MySQL并尝试插入值时,用户名和密码肯定是有效的。假设我在表中已经有了1和2这两个值。这个代码尝试往表里写一个3,并提交这个操作。

这段代码输出了

pre values
(('1',), ('2',))
updated values
(('1',), ('2',), ('3',))

当我再次运行完全相同的脚本时,它给出的输出也是一模一样的。虽然显示它确实添加到了数据库,但实际上并没有添加。当我在命令行中进入MySQL查看表时,确实没有插入新的值。

我查阅的每一个地方都一再告诉我需要使用db.commit,而我确实这么做了,所以我现在非常困惑。

补充:我还去查看了我电脑上数据库的位置(所有东西都在我的本地机器上),并对数据库及其所在的文件夹设置了777的权限。

1 个回答

1

你没有正确地使用 db.commit。你忘记在后面加上括号了:

应该用

db.commit()

而不是

db.commit

之所以看起来好像能工作,是因为:在你操作数据库连接的时候(在提交之前),你的修改会被应用到数据库的 会话 中。所以你的对象在会话里是更新过的,但这些修改还没有写入数据库(这种状态的对象通常叫做 脏数据)。

当你之后再次查询数据库时,你会看到会话里的修改,尽管这些修改还没有写入数据库。一旦你执行 commit(),会话里的所有修改就会真正写入数据库。

不过,如果你用 close() 关闭一个有脏数据的会话,系统会自动回滚:

从此之后,这个连接就不能再用了;如果尝试用这个连接进行任何操作,就会抛出一个错误(或其子类的异常)。所有试图使用这个连接的游标对象也是一样。请注意,在没有先提交修改的情况下关闭连接,会导致自动回滚。

撰写回答