#!/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()之前添加'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
答案 0 :(得分:1)
with conn:
(使用连接对象作为上下文管理器)确保在with
语句控制的代码块中没有发生异常时提交事务。
如果没有上下文管理器,请使用conn.commit()
显式提交事务。
答案 1 :(得分:1)
在这种情况下,如果某人开始对数据库进行更改,显示对其他数据库用户的(不完整)更改,并且由于某种原因(错误,杀死等)突然中止其修改,那将是不可接受的使DB处于不一致状态。
为防止这种情况发生,当您的数据库以合适的isolation level运行时,您必须明确声明您的更改已准备好发布。这就是commit
声明的目的。
在Python中,你必须自己明确地调用conn.commit()
。或者,如果没有例外,请context manager 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
请注意,在任何一种情况下,提交操作都可能失败。例如,如果并发事务已经向数据库提交了不兼容的更改。