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

たとえば、InnoDBを使用する場合にMySQLでサポートされるACIDについて読む必要があります。

あなたが経験しているのはIsolationプロパティです:あなたの2つの接続は2つの異なるトランザクションを開きました(これMySQLdb.connect(user='alex', db='testing').cursor()を2回行うことで、2つのカーソルを作成するだけでなく、2つの接続も作成します)。後続のトランザクションで変更を表示する場合は、新しいトランザクションを開く前にトランザクションをコミットする必要があります。

また、一般的に、InnoDBのトランザクションモデル(または使用しているエンジンのトランザクションモデル)の章を読む価値があります。

于 2012-09-25T00:17:25.173 に答える