为什么 MySQL Connector 在我的循环期间断开连接?

问题描述 投票:0回答:2

我不确定为什么我的连接在循环遍历表格来搜索列表元素时出现错误:

try:
    conn = mysql.connector.connect(user='root', password='####',host='####',database='###', allow_local_infile=True)
    cursor = conn.cursor()
    
except Exception:
    traceback.print_exc()
    print("I am unable to connect to the database")

index= 0

for i in range(0, len(listdates)):
    date= listdates[i]
    print(date)
    try:
        query = ("SELECT * FROM search WHERE time= %s;", (date,))
        cursor.execute(query)
        row= cursor.fetchall()
        if not row:
           index = i
           break
  
    except Exception:
        traceback.print_exc()
        print("did not return row")
    

我不确定问题是什么。我的连接很好,因为当我在循环外执行查询时没有问题。在更大的代码中,这将进入,我在循环查询时没有问题。我不知道出了什么问题。

错误: mysql.connector.errors.OperationalError:2055:与位于“127.0.0.1:3306”的 MySQL 服务器失去连接,系统错误:连接不可用。

我尝试在循环中使用cursor.close()。我也尝试过使用“ 以 conn.cursor() 作为光标:“在循环之外。

python mysql loops connection
2个回答
0
投票

这里有一些您可以检查和改进的事情:

超时:MySQL 的

wait_timeout
可能正在关闭不活动的连接。

  • 修复:增加
    wait_timeout
    或定期运行
    SELECT 1
    查询以保持连接处于活动状态。

查询格式:而不是:

query = ("SELECT * FROM search WHERE time= %s;", (date,))

用途:

query = "SELECT * FROM search WHERE time= %s"
cursor.execute(query, (date,))

重新连接:将

autocommit
设置为
True
并使用
conn.ping(reconnect=True)
自动重新连接。

服务器日志:检查 MySQL 服务器日志是否有错误或重新启动。

网络:如果MySQL是远程的,请确保稳定的网络连接。

资源限制:确保 MySQL 没有达到最大连接数。

管理游标:使用后关闭游标,但无需为每次循环迭代关闭/重新打开。

上下文管理器:在循环之外使用

with conn.cursor() as cursor:
以实现更好的资源管理。

请记住通过使用较小的数据进行测试或添加日志来查明确切的问题来隔离问题。


0
投票

execute
方法采用一个或两个参数,当第一个参数具有
%s
占位符时需要两个参数。在这种情况下,第二个参数应该是
tuple
list
,并用实际值替换
%s
占位符:

cursor.execute("SELECT * FROM search WHERE time", (date,))

在本例中,第二个参数是一个元组。但你有相当于:

cursor.execute(("SELECT * FROM search WHERE time= %s;", (date,)))

我冒昧地将变量

query
替换为上面方法调用中的实际值。您正在传递一个作为元组的single参数。这就是导致您出现问题的原因。

© www.soinside.com 2019 - 2024. All rights reserved.