我认为我对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到数据库和包含它的文件夹。答案 0 :(得分:1)
您没有致电 db.commit
。你忘记了最后的括号:
使用
db.commit()
而不是
db.commit
似乎工作的原因是:当您在数据库连接上运行时(在提交之前),您的更改将应用于DB 会话。因此,您的对象会在会话中更新,但更改不会写入数据库(此状态下的对象通常称为 dirty )。
当您随后再次查询数据库时,您将看到会话中的更改,即使它们尚未写入数据库。一旦commit()
,会话中的所有更改都会实际写入数据库。
但是,如果您close()
与脏会话建立连接,则会执行隐式回滚:
从这一点开始,连接将无法使用;错误(或 如果尝试任何操作,将引发异常 连接。这同样适用于尝试使用的所有光标对象 连接。请注意关闭连接而不提交 首先更改将导致执行隐式回滚。