我正在构建一个WSGI Web应用程序,我有一个MySQL数据库.我正在使用MySQLdb,它提供了执行语句和获取结果的游标.获取和关闭游标的标准做法是什么?特别是,我的游标应该持续多久?我应该为每笔交易获得一个新光标吗?
我相信你需要在提交连接之前关闭光标.查找不需要中间提交的事务集是否有任何显着优势,这样您就不必为每个事务获取新游标?获得新游标是否有很多开销,或者这不是什么大不了的事?
我很困惑为什么python需要游标对象.我知道jdbc,那里的数据库连接非常直观但是在python中我与游标对象混淆了.另外,我怀疑在资源释放方面cursor.close()和connection.close()函数之间的区别是什么.
我对 Python 及其 MySQLdb 连接器有点陌生。我正在编写一个 API 来使用 RESTful 方法从数据库返回一些数据。在 PHP 中,我将连接管理部分封装在一个类中,充当 MySQL 查询的抽象层。
我很早就在脚本中定义了连接: 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
Run Code Online (Sandbox Code Playgroud)
等等。
我使用mdb.cursors.DictCursor是因为我更喜欢能够以关联数组的方式访问数据库列。
在一个函数中,我发出一个插入查询以创建一个具有唯一“groupid”的“组”。
这个“组”有一个创建者。数据库中的每个用户都在表中他/她行的“组”列中保存一个 JSON 数组。
因此,当我创建一个新组时,我想将 groupid 分配给创建它的用户。
我使用类似的功能更新用户的记录。
我已经将“插入”和“更新”部分包装在两个单独的函数定义中。
我第一次运行脚本时,一切正常。
第二次运行脚本时,脚本无休止地运行(我怀疑是由于与 MySQL 数据库的某些空闲连接)。
当我使用 CTRL + …
cur.close()完成数据库后,我一直在使用该命令:
import sqlite3
conn = sqlite3.connect('mydb')
cur = conn.cursor()
# whatever actions in the database
cur.close()
Run Code Online (Sandbox Code Playgroud)
但是,我只是在某些情况下看到了以下方法:
import sqlite3
conn = sqlite3.connect('mydb')
cur = conn.cursor()
# whatever actions in the database
cur.close()
conn.close()
Run Code Online (Sandbox Code Playgroud)
在官方文档中,有时光标关闭,有时连接关闭,有时两者兼而有之。
我的问题是:
cur.close()和conn.close()?