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 的答案是正确的。只是为了进一步发展,您必须了解数据库的指定同时考虑了“并发访问”和“失败的可能性”。

在这种情况下,如果有人开始对数据库进行更改,显示对其他数据库用户的(不完整)更改,并且突然由于某种原因(错误、杀死等)中止其修改从而离开数据库,这是不可接受的处于不一致的状态。

为防止这种情况发生,当您的数据库以适当的隔离级别运行时,您必须明确声明您的更改已准备好发布。这就是commit声明的目的。

在 Python 中,您要么必须显式调用conn.commit()自己。或者如果没有例外,让上下文管理器为你做这件事。 with conn:下面的两个片段在全球范围内做同样的事情:

>>> 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 回答