2017-05-07 105 views
1

作为Python和sqlite的新手,我一直在与他们一起玩,最近都在努力弄清楚事情的真相。特别是对于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命令。

回答

1

这是因为您定义的连接对于打开的数据库函数是本地的。更改如下

def open_db(): 
    conn = sqlite3.connect("path) 
    return conn.cursor() 

然后

c = open_db() 
c.execute('SELECT * DO STUFF') 

应当注意的是,写功能像这样单纯作为一个学习的过程可能是好的,但通常它不是非常有用的周围写瘦包装一个数据库连接API。

+0

谢谢你。什么是合适的方式来处理打开和关闭数据库然后如果不是这样? – Biggen

+0

我在说的是你的函数不会做任何真正有用的事情。把它们留下。和顺便说一句,长期来说,你将不会使用python数据库apis。你最终会想要适应像SQLAlchemy这样的ORM。 – e4c5

+0

好吧,然后我明白了。所以,除非我想使用ORM,否则最好只是将游标和conn全局化,并且每次需要打开/关闭数据库时都要输入它们,而不是使用这些非常简单的函数来处理这个问题。 – Biggen

1

我不知道有一个简单的方法。如前所述,如果您将某个数据库的游标或连接的名称设置为某个函数的本地名称,那么在退出该函数时这些数据将会丢失。答案可能是使用contextlib模块(包含在Python发行版中,并在帮助文件中记录)编写代码;我不会那么容易。 sqlite3的文档确实提到可以将连接对象用作上下文管理器;我怀疑你已经注意到了。我也看到有一些MySQL的上下文管理器,但我没有使用它。