0
#!/usr/bin/python
#Program:
#   insert data into mysql and the display them
import MySQLdb as mdb

conn = mdb.connect(host = 'localhost', user = 'root', passwd = '8023xue0526', db ='contact')

cur = conn.cursor()
cur.execute("insert into contact values('123221', 'ni')")
cur.execute("select * from contact")
row_num = int(cur.rowcount)
for i in range(row_num):
    row = cur.fetchone()
    print row

これらのコードを使用してデータをmysqlに挿入すると、プログラムは機能しました。その後、mysqlclientで確認したところ、データが存在しませんでした。しかし、「cur = conn.cursor()」の前に「with conn:」ステートメントを追加すると、データが実際に mysql に挿入されます。このようなコード

#!/usr/bin/python
#Program:
#   to get some information from mysql
import MySQLdb as mdb
import sys

conn = mdb.connect(host = 'localhost', user = 'root', passwd = '8023xue0526', db =         'contact')

with conn:
    cur = conn.cursor()
    cur.execute("insert into contact values('122221', 'ni')")
    cur.execute("select * from contact")
    row_num = int(cur.rowcount)
    for i in range(row_num):
        row = cur.fetchone()
        print row
4

2 に答える 2

1

Martijn Pieters の答えは正しいものです。もう少し発展させるには、データベースが「同時アクセス」と「障害の可能性」の両方を念頭に置いて指定されていることを理解する必要があります。

その場合、誰かが DB に変更を加え始め、その (不完全な) 変更を他の DB ユーザーに示し、突然何らかの理由 (バグ、キルなど) でその変更を中止して DB を離れた場合、それは容認できません。矛盾した状態で。

それを防ぐには、DB が適切な分離レベルで実行されている場合、変更を公開する準備ができていることを明示的に示す必要があります。commitそれが声明の目的です。

Python では、明示的にconn.commit()自分自身を呼び出す必要があります。または、例外がない場合は、コンテキストマネージャーに任せてください。 with conn:以下の 2 つのフラグメントは、グローバルに同じことを行います。

>>> with conn:
...     c = conn.cursor()
...     c.doSomething()
...     # implicit commit here


>>> conn = sqlite3.connect(....)
>>> c = conn.cursor()
>>> c.doSomething()
>>> conn.commit()  # explicit commit here

いずれの場合も、コミット操作が失敗する可能性があることに注意してください。たとえば、並行トランザクションが互換性のない変更をデータベースにすでにコミットしている場合などです。

于 2013-07-29T11:54:46.447 に答える
1

with conn:with(接続オブジェクトをコンテキスト マネージャーとして使用する) は、ステートメントによって管理されるコード ブロック内で例外が発生しなかった場合、トランザクションがコミットされることを保証します。

コンテキスト マネージャがない場合はconn.commit()、トランザクションを明示的にコミットするために使用します。

于 2013-07-29T09:10:39.693 に答える