【问题标题】:Permission in Python to write to MySQL database?Python中写入MySQL数据库的权限?
【发布时间】:2014-09-02 12:51:24
【问题描述】:

我认为 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 到数据库和包含它的文件夹。

【问题讨论】:

    标签: python mysql permissions mysql-python


    【解决方案1】:

    你不打电话db.commit。你忘了最后的括号:

    使用

    db.commit()
    

    而不是

    db.commit
    

    似乎起作用的原因是:当您对数据库连接进行操作时(在提交之前),您的更改会应用到数据库会话。所以你的对象在你的会话中被更新了,但是这些改变还没有写入数据库(这种状态的对象通常被称为dirty)。

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

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

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

    【讨论】:

    • 天哪,我是有史以来最愚蠢的人,非常感谢!为什么提交仍然显示一些东西?或者它只是因为插入而显示了一些东西
    • 不客气。而且我不会说你很笨,你至少能够清楚地描述你的问题并提供一个完整的、独立的例子,这样就很容易发现错误。你不会相信有多少人在这方面失败了;-)
    • 感谢您的解释!我真的很感激
    猜你喜欢
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 2019-02-14
    • 2013-07-21
    • 2012-12-21
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多