1

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

>>> 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 会这样做?

4

3 回答 3

3

请参阅有关自动提交的信息:http: //mysql-python.sourceforge.net/FAQ.html#my-data-disappeared-or-won-t-go-away

于 2012-09-25T00:16:50.653 回答
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()
于 2012-09-25T00:17:07.713 回答
1

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

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

通常也值得阅读有关 InnoDB 事务模型的章节(或您正在使用的引擎的章节)。

于 2012-09-25T00:17:25.173 回答