【问题标题】:How to disable query cache with mysql.connector如何使用 mysql.connector 禁用查询缓存
【发布时间】:2014-03-25 07:31:10
【问题描述】:

我正在我的 Kivy 应用程序上连接 mysql。

import mysql.connector
con = mysql.connector.Connect(host='XXX', port=XXX, user='XXX', password='XXX', database='XXX')
cur = con.cursor()
db = cur.execute("""select SELECT SQL_NO_CACHE * from abc""")
data = cur.fetchall()
print (data)

从另一个连接对表 abc 插入或删除后;我在 python 上调用相同的查询;但数据没有更新。

我添加了查询“SET SESSION query_cache_type = OFF;”在选择查询之前,但它没有工作。有人说“select NOW() ...”查询不可缓存,但它不再起作用。我该怎么办?

【问题讨论】:

  • 事务隔离,也许?
  • 我现在检查了。它说“事务隔离=可重复阅读”。正常吗?
  • 我已经测试过“... LOCK IN SHARE MODE”查询,但是当我调用它时,我无法从另一个连接插入或更新。我想从另一个连接插入或更新,我想在 Python 上再次调用选择查询并获得新结果。
  • @user3051668 插入/更新数据库的代码是否调用 .commit() ?

标签: python mysql mysql-python kivy


【解决方案1】:

我通过在 fetchall() 之后添加代码解决了这个问题

con.commit()

在不执行提交的情况下调用相同的选择查询,不会更新结果。

【讨论】:

  • 为什么这个答案这么难找?我很感激它。我以为我要疯了,在更新表中的一行并再次运行选择查询后,我仍然得到旧值。
【解决方案2】:

解决方法是使用:

  • 一次:

    con.autocommit(True)
    
  • 或者,在每次选择查询之后:

    con.commit()
    

使用此选项,每次选择查询后都会有一个提交。 否则,后续的选择将呈现相同的结果。

这个错误似乎是Bug #42197 与 MySQL 中的查询缓存和自动提交有关。状态为无法修复

几个月后,这应该无关紧要了,因为MySQL 8.0 is dropping Query Cache

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,用上面的方法解决了。

    conn.commit()
    

    我发现不同的 DBMS 有不同的行为,并不是所有的 DBMS 都存在于连接缓存中

    【讨论】:

    • 这应该是问题的答案吗?
    • 也许吧,希望有更好的答案
    • A) 你的意思是 below 而不是 above? B)不,到目前为止你的答案很难理解,而且真的不是很有帮助。 “并非所有的 DBMS 都存在于缓存中”......如前所述:没有帮助。
    【解决方案4】:

    试试这个,

    conn.autocommit(True);
    

    这将在你们每个人select 查询后自动提交。

    【讨论】:

    • 就我而言,db.autocommit(True) 不起作用。我使用 mysql-connector-python-2.0.4。我不得不使用另一个条目:db.autocommit = True,这很有帮助。
    【解决方案5】:

    MySQL 查询缓存在表被修改时被刷新,所以它不会产生这种效果。没有看到您的其余代码就不可能说,但是您的 INSERT / DELETE 查询很可能无法运行。

    【讨论】:

    • 不,它没有失败。因为我正在检查 HeidiSQL。
    猜你喜欢
    • 2010-12-25
    • 2013-04-09
    • 2011-03-07
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 2022-06-24
    • 1970-01-01
    相关资源
    最近更新 更多