【发布时间】:2015-07-29 02:09:03
【问题描述】:
我对 Python 及其 MySQLdb 连接器有点陌生。 我正在编写一个 API 来使用 RESTful 方法从数据库中返回一些数据。在 PHP 中,我将连接管理部分封装在一个类中,充当 MySQL 查询的抽象层。
在 Python 中:
我在脚本的早期定义了连接:
con = mdb.connect('localhost', 'user', 'passwd', 'dbname')-
然后,在所有后续方法中:
import MySQLdb as mdb def insert_func(): with con: cur = con.cursor(mdb.cursors.DictCursor) cur.execute("INSERT INTO table (col1, col2, col3) VALUES (%s, %s, %s)", (val1, val2, val3) ) rows = cur.fetchall() #do something with the results return someval等等
我使用
mdb.cursors.DictCursor,因为我更喜欢能够以关联数组的方式访问数据库列。
现在问题开始出现:
在一个函数中,我发出一个插入查询来创建一个具有唯一“groupid”的“组”。
此“组”有一个创建者。数据库中的每个用户都在表中他/她行的“组”列中保存一个 JSON 数组。
所以当我创建一个新组时,我想将 groupid 分配给创建它的用户。
我使用类似功能更新用户记录。
我已将“插入”和“更新”部分包装在两个单独的函数定义中。
我第一次运行脚本时,一切正常。
我第二次运行脚本时,脚本无休止地运行(我怀疑是由于与 MySQL 数据库的一些空闲连接)。
-
当我使用 CTRL + C 中断它时,出现以下错误之一:
- “‘游标’对象没有属性‘连接’”
- “命令不同步;您现在无法运行此命令”
- 或任何其他 KeyboardInterrupt 异常,正如预期的那样。
在我看来,这些错误是由我的代码中处理连接和游标的一些错误方式引起的。
我读到使用with con: 是一种很好的做法,这样连接会在查询后自动关闭。我在每个函数中使用 'con' 上的 'with',因此连接已关闭,但我决定全局定义连接,以便任何函数使用它。这似乎与with con: 上下文管理不兼容。我怀疑游标需要以类似的方式“上下文管理”,但我不知道该怎么做(据我所知,PHP 不使用 MySQL 游标,所以我没有使用它们的经验)。
我现在有以下问题:
为什么第一次有效,第二次无效? (但是,它会在 CTRL + C 中断后再次工作一次)。
在使用多个函数(可以依次调用)时如何使用连接和游标?
【问题讨论】:
-
只是为了确定-您的意思是同一个python模块中的函数,对吗?
-
是的,没错!
标签: python mysql-python