【问题标题】:Correct exception handling with python MySQLdb connection使用 python MySQLdb 连接正确处理异常
【发布时间】:2014-03-10 09:01:04
【问题描述】:

我创建了一个小型/基本的 python 脚本来将数据插入 MySQL 数据库。我包括了一些错误处理——主要是为了关闭连接和/或防止在出现错误的情况下挂起连接(......但也忽略一些错误)。

我认为我所拥有的(见下文)是正确的 - 它似乎工作正常。但有时我会收到“连接太多”错误——我认为这意味着我实际上根本没有正确关闭连接(或者错误处理可能不正确)。

conn=MySQLdb.connect(host=####, user=####, passwd=####, db=####)
curs=conn.cursor()
try:
    curs.execute(sql)
    conn.commit()           

except MySQLdb.Error as e:
    if e[0]!= ###:
        raise

finally: 
    curs.close()    
    conn.close()

(我也试过没有finally:

另一个(我认为重要的)点是 MySQL 数据库使用了 InnoDB 存储引擎。这是我第一次使用 InnoDB 引擎,也许这里有一些与 MyISAM 相关的差异,我不知道(比如conn.commit(),但是有一个错误)......这似乎是来源我的所有其他问题!

提前致谢

【问题讨论】:

  • 您应该从try 正文中删除conn.close(),因为它将总是finally 正文中调用。除此之外,您似乎正在正确释放连接。
  • 感谢 Lanzz - 抱歉,我在复制代码时出错(在没有 finally: 的情况下玩耍,并且在 try 正文中有一个 conn.close() @ 987654330@ 正文)。已解决问题(无论哪种方式仍然存在相同的问题)

标签: python error-handling innodb mysql-python


【解决方案1】:

我认为问题在于我没有在 except 子句中调用 conn.rollback()(因此,连接没有正确关闭)。一行(见下文)似乎解决了这个问题(我不能完全确定这是否是这个问题 - 如果有人能确认那会很好)。

conn=MySQLdb.connect(host=####, user=####, passwd=####, db=####)
curs=conn.cursor()
try:
    curs.execute(sql)
    conn.commit()           

except MySQLdb.Error as e:
    conn.rollback()              #rollback transaction here
    if e[0]!= ###:
        raise

finally: 
    curs.close()    
    conn.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2023-03-07
    相关资源
    最近更新 更多