Python写入MySQL数据库的权限?

时间:2014-07-11 19:50:41

标签: python mysql permissions mysql-python

我认为我对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()

当我在shell中执行mysql并尝试插入值时,用户名/密码肯定有效,所以假设我的表中已经有值1和2。这会尝试写一个3并提交它。

打印出来

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

当我尝试再次运行完全相同的脚本时,它会提供完全相同的输出。因此尽管显示它确实添加到数据库中,但它没有添加到数据库中。当我在shell中访问mysql并查看表后,它确实没有插入新值。

我抬头看到的每一个地方只是一遍又一遍地告诉我有db.commit,我这样做我现在很困惑。

编辑:我也在我的计算机上找到了数据库的位置(一切都在我的本地机器上),然后chmod'd 777到数据库和包含它的文件夹。

1 个答案:

答案 0 :(得分:1)

您没有致电 db.commit。你忘记了最后的括号:

使用

db.commit()

而不是

db.commit

似乎工作的原因是:当您在数据库连接上运行时(在提交之前),您的更改将应用​​于DB 会话。因此,您的对象会在会话中更新,但更改不会写入数据库(此状态下的对象通常称为 dirty )。

当您随后再次查询数据库时,您将看到会话中的更改,即使它们尚未写入数据库。一旦commit(),会话中的所有更改都会实际写入数据库。

但是,如果您close()与脏会话建立连接,则会执行隐式回滚:

  

从这一点开始,连接将无法使用;错误(或   如果尝试任何操作,将引发异常   连接。这同样适用于尝试使用的所有光标对象   连接。请注意关闭连接而不提交   首先更改将导致执行隐式回滚。