Python 以循环方式连接到mysql

Python 以循环方式连接到mysql,python,mysql-connector,mysql-connector-python,Python,Mysql Connector,Mysql Connector Python,我必须连接到mysql服务器并永久获取一些数据 所以我有两条路 1) 稍后连接到mysql抓取数据 conn = mysql.connector.connect(user='root',password='password',host='localhost',database='db',charset='utf8',autocommit=True) cursor = conn.cursor(buffered=True) while True: cursor.execute("statment

我必须连接到mysql服务器并永久获取一些数据

所以我有两条路

1) 稍后连接到mysql抓取数据

conn = mysql.connector.connect(user='root',password='password',host='localhost',database='db',charset='utf8',autocommit=True)
cursor = conn.cursor(buffered=True)
while True:
  cursor.execute("statments")
  sqlData = cursor.fetchone()
  print(sqlData)
  sleep(0.5)
这工作得很好,但如果由于mysql连接问题导致脚本崩溃,脚本将停止运行

2) 同时连接到mysql

while True:
   try:
      conn = mysql.connector.connect(user='root',password='password',host='localhost',database='db',charset='utf8',autocommit=True)
      cursor = conn.cursor(buffered=True)
      cursor.execute("statments")
      sqlData = cursor.fetchone()
      print(sqlData)
      cursor.close()
      conn.close()
      sleep(0.5)
   except:
      print("recoverable error..")

两个代码都很好,但我的问题是哪一个更好

在这两种方法中,更好的方法是使用单个连接,但为每个语句创建一个新游标,因为创建新连接需要时间,但创建新游标很快。您可以将代码更新为:

conn = mysql.connector.connect(user='root',password='password',host='localhost',database='db',charset='utf8',autocommit=True)
while True:
    try:
        cursor = conn.cursor(buffered=True)
        cursor.execute("statments")
        sqlData = cursor.fetchone()
        print(sqlData)
    except Exception: # Catch exception which will be raise in connection loss

        conn = mysql.connector.connect(user='root',password='password',host='localhost',database='db',charset='utf8',autocommit=True)
        cursor = conn.cursor(buffered=True)

    finally:
        cursor.close()

conn.close()    # Close the connection

另请阅读有关try:finallyblock的用法。

在这两种方法中,更好的方法是使用一个连接,但为每个语句创建一个新游标,因为创建新连接需要时间,但创建新游标很快。您可以将代码更新为:

conn = mysql.connector.connect(user='root',password='password',host='localhost',database='db',charset='utf8',autocommit=True)
while True:
    try:
        cursor = conn.cursor(buffered=True)
        cursor.execute("statments")
        sqlData = cursor.fetchone()
        print(sqlData)
    except Exception: # Catch exception which will be raise in connection loss

        conn = mysql.connector.connect(user='root',password='password',host='localhost',database='db',charset='utf8',autocommit=True)
        cursor = conn.cursor(buffered=True)

    finally:
        cursor.close()

conn.close()    # Close the connection

还可以阅读关于
try:finally
block的用法。

很好,但是我能为连接丢失做些什么?!例如,mysql在高负载时崩溃,您的代码在mysql恢复正常后不会开始工作,因为连接已断开!如果存在高负载,即使创建新连接也无法工作。您的整个应用程序都将失败。不是吗?在第二段代码中,我可以用try忽略错误…除了mysql服务器重新联机后,它将尝试轻松重新连接,但在第一段代码或您的代码中,无法忽略错误…我错过了永久部分。更新了应答器您的异常代码只运行一次!?最后的工作又是什么?而真实永远不会结束!:)很好,但是我能为连接丢失做些什么?!例如,mysql在高负载时崩溃,您的代码在mysql恢复正常后不会开始工作,因为连接已断开!如果存在高负载,即使创建新连接也无法工作。您的整个应用程序都将失败。不是吗?在第二段代码中,我可以用try忽略错误…除了mysql服务器重新联机后,它将尝试轻松重新连接,但在第一段代码或您的代码中,无法忽略错误…我错过了永久部分。更新了应答器您的异常代码只运行一次!?最后的工作又是什么?而真实永远不会结束!:)