Wkładam wiersz do mojego stołu i podczas wybierania danych z niego przy użyciu tego samego kursora, działa dobrze. Ale kiedy próbuję go zobaczyć za pomocą innych środków lub utwórz nowy kursor, wydaje się, że magicznie zniknie. Oto, co mam na myśli:

>>> 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__'
>>> 

Czy ktoś może mi powiedzieć, dlaczego MySQLDB to robi?

1
user1447941 25 wrzesień 2012, 04:13

3 odpowiedzi

Najlepsza odpowiedź

Wierzę, że twoim problemem jest to, że nie popełniasz transakcji. Spróbuj zadzwonić commit() po wkładce.

To znaczy, musisz zrobić

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()
3
Erik 25 wrzesień 2012, 00:17

Zobacz informacje o Auto-Commit: http://mysql-phython.sourceforge.net/faq.html#my-data-disappeared-or-won-t-go-away.

3
AJ. 25 wrzesień 2012, 00:16

Powinieneś przeczytać o Kwas, który jest obsługiwany przez MySQL podczas korzystania z InnoDB.

To, czego doświadczasz, jest Izolacja Nieruchomość: Twoje dwa połączenia otworzyły dwa różne Transakcje (robiąc to dwukrotnie MySQLdb.connect(user='alex', db='testing').cursor(), robisz więcej niż tworzenie dwóch kursorów, tworzysz dwa połączenia). Musisz popełnić transakcję przed otwarciem nowego, jeśli chcesz, aby zmiany były widoczne w kolejnych transakcjach.

Zasadniczo warto przeczytać Rozdział w modelu transakcji InnoDB (lub ten dla silnika, którego używasz).

1
Bruno 25 wrzesień 2012, 00:17