我使用python mysql API将数据插入到mysql中但是当我没有添加语句'with conn:'时它不起作用

时间:2013-07-29 09:09:57

标签: python mysql

#!/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

2 个答案:

答案 0 :(得分:1)

with conn:(使用连接对象作为上下文管理器)确保在with语句控制的代码块中没有发生异常时提交事务。

如果没有上下文管理器,请使用conn.commit()显式提交事务。

答案 1 :(得分:1)

Martijn Pieters的回答是正确的。只是为了进一步发展,你必须要明白数据库被指定为“并发访问”和“失败的可能性”。

在这种情况下,如果某人开始对数据库进行更改,显示对其他数据库用户的(不完整)更改,并且由于某种原因(错误,杀死等)突然中止其修改,那将是不可接受的使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

请注意,在任何一种情况下,提交操作都可能失败。例如,如果并发事务已经向数据库提交了不兼容的更改。