python使用mysqldb时查询的缓冲问题有没碰到过的?
我使用cur=conn.cursor()
cur.execute(sql,para)
data=cur.fetchall()
cur.close()
当我在数据库手动删除一条记录时发现,返回的数据并没有变化,那么这里肯定是mysqldb存在缓冲,请问下这问题怎么处理? 需要
conn.commit()
The connection object commit() method commits any outstanding changes in the current transaction to make them permanent in the database. In DB-API, connections begin with autocommit mode disabled, so you must call commit() before disconnecting or changes may be lost.
[ 本帖最后由 yaksavage 于 2009-4-11 17:22 编辑 ] 不好意思,楼上的理解错了。
我是说查询
比如a表有3条记录,我第一次通过python程序查询是三条,python不退出,我手动从数据库删除一条,再通过python查询,还是3条,这时应该是2条才对。
这里应该是有缓冲的,我不知道怎么来消除。避免不同进程对数据库操作的不统一。 关注... 貌似只能重新生成一个db connect实例
db实例里有set_server_option方法,试了禁止query_cache off,没效果,只能去源码看看。 解决了,惯性影响,以前的query都不需要commit,而mysqldb不管怎样都需要做commit操作。
def test_commit(self):
con = self._connect()
try:
# Commit must work, even if it doesn't do anything
con.commit()
finally:
con.close() 发现不一样的结果,以下是我在OpenBSD下测试的结果:
Shell:~ >: python
Python 2.5.2 (r252:60911, Aug 12 2008, 11:14:20)
on openbsd4
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
>>> db = MySQLdb.connect(host='127.0.0.1', db='test', user='Py3k', passwd='password')
>>> c = db.cursor()
>>> c.execute('select * from todo')
3L
>>> c.execute('select * from todo')
4L
>>> c.execute('select * from todo')
3L
>>> MySQLdb.__version__
'1.2.2'
>>>
回复 #7 23号 的帖子
灵异时间,难道跟系统环境相关?我这版本都是1.2.2的,除非按照6楼的commit,其他还是照旧。 lz应该打开了自动事务,并且表用的innodb python MySQLdb 默认关闭了 autocommit,如果查询的是一个 innodb 表的话,一旦该表后面插入了新数据,之前的连接就会查不到新数据,比较蛋疼。
所以根据情况,一般情况下最好开启 autocommit
conn.autocommit(True)
页:
[1]