2012-09-25 2 views
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 делает это?

ответ

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() 
1

Вы должны читать о ACID, который поддерживается MySQL при использовании InnoDB, например.

Что вы испытываете, это свойство Isolation: ваши два соединения открыли две различные транзакции (делая это MySQLdb.connect(user='alex', db='testing').cursor() два раза, вы делаете больше, чем создание двух курсоров, вы также создаете два подключения). Вам нужно будет совершить транзакцию, прежде чем открывать новую, если вы хотите, чтобы изменения были видимыми в последующих транзакциях.

Это также, как правило, стоит прочитать chapter on InnoDB's transaction model (или тот, который вы используете).

Смежные вопросы