如何在Python中获取写入MySQL数据库的权限?
我觉得我在用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()
关闭一个有脏数据的会话,系统会自动回滚:
从此之后,这个连接就不能再用了;如果尝试用这个连接进行任何操作,就会抛出一个错误(或其子类的异常)。所有试图使用这个连接的游标对象也是一样。请注意,在没有先提交修改的情况下关闭连接,会导致自动回滚。