为什么数据库更改只显示在当前游标中?

时间:2012-09-25 00:13:41

标签: python mysql mysql-python

我在我的表中插入一行,当我使用相同的光标从中选择数据时,它工作正常。但是当我尝试通过其他方式查看它或创建一个新光标时,它似乎神奇地消失了。这就是我的意思:

>>> cur = MySQLdb.connect(user='alex', db='testing').cursor()
>>> target = 'Alex'
>>> cur.execute("""INSERT INTO user_data (nick, points) VALUES (%s, 100);""", (target.lower()))
1L
>>> cur.execute("""SELECT points FROM user_data WHERE nick = %s;""", (target.lower()))
1L
>>> total = str(cur.fetchone()[0])
>>> print total
100
>>> cur = MySQLdb.connect(user='alex', db='testing').cursor()
>>> cur.execute("""SELECT points FROM user_data WHERE nick = %s;""", (target.lower()))
0L
>>> total = str(cur.fetchone()[0])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object has no attribute '__getitem__'
>>> 

有谁能告诉我为什么MySQLdb会这样做?

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:3)

我认为您的问题是您没有提交交易。插入后尝试拨打commit()

也就是说,你必须这样做

conn = MySQLdb.connect(user='alex', db='testing')
cur = conn.cursor()
cur.execute("""INSERT INTO user_data (nick, points) VALUES (%s, 100);""", (target.lower()))
conn.commit()

答案 2 :(得分:1)

您应该阅读有关ACID的内容,例如,在使用InnoDB时MySQL支持该内容。

您遇到的是Isolation属性:您的两个连接已打开两个不同的事务(通过执行此操作MySQLdb.connect(user='alex', db='testing').cursor()两次,您创建的不仅仅是创建两个游标,而是创建两个连接)。如果您希望更改在后续事务中可见,则需要在打开新事务之前提交事务。

通常还值得阅读chapter on InnoDB's transaction model(或者您正在使用的引擎)。