对Python和sqlite都不熟悉,我最近都试图解决这些问题。特别是对于sqlite,我已经学会了如何打开/关闭/提交数据到数据库。但是现在我试图清理一下,以便通过函数调用打开/关闭数据库。例如,我想做类似的事情:
def open_db():
conn = sqlite3.connect("path)
c = conn.cursor()
def close_db():
c.close()
conn.close()
def create_db():
open_db()
c.execute("CREATE STUFF")
close_db()
然后当我运行程序时,在查询或写入表之前,我可以执行以下操作:
open_db()
c.execute('SELECT * DO STUFF')
OR
c.execute('DELETE * DO OTHER STUFF')
conn.commit
close_db()
我已经阅读了有关情境管理人员的内容,但我不确定我是否完全理解他们的情况。清理我打开/关闭数据库连接的方式最简单的解决方案是什么,所以我并不总是必须输入cursor
命令。
答案 0 :(得分:1)
这是因为您定义的连接是open db函数的本地连接。将其更改如下
def open_db():
conn = sqlite3.connect("path)
return conn.cursor()
然后
c = open_db()
c.execute('SELECT * DO STUFF')
应该注意的是,像这样编写函数纯粹作为一种学习练习可能没问题,但通常在数据库连接api周围编写一个瘦包装器并不是很有用。
答案 1 :(得分:1)
我不知道有一种简单的方法。如前所述,如果将数据库游标或连接的名称设置为函数的本地名称,则在退出该函数时这些名称将丢失。答案可能是使用contextlib
模块编写代码(它包含在Python发行版中,并在帮助文件中记录);我不会那么容易。 sqlite3的文档确实提到连接对象可以用作上下文管理器;我怀疑你已经注意到了这一点。我也看到MySQL有某种上下文管理器,但我还没有使用它。