Python 自动打开和关闭数据库连接
我正在用我的应用程序中的SQLite3为数据库查询编写一个类。该类的大多数方法与此非常相似:Python 自动打开和关闭数据库连接,python,class,database-connection,Python,Class,Database Connection,我正在用我的应用程序中的SQLite3为数据库查询编写一个类。该类的大多数方法与此非常相似: def getPrice(self, symbol, date): date = dt.datetime.strptime(date, '%Y-%m-%d') conn = sqlite3.connect('stocks.db') curs =conn.cursor() curs.execute('''SELECT close FROM prices WHERE symb
def getPrice(self, symbol, date):
date = dt.datetime.strptime(date, '%Y-%m-%d')
conn = sqlite3.connect('stocks.db')
curs =conn.cursor()
curs.execute('''SELECT close FROM prices WHERE symbol = ? AND date = ?;''', (symbol, date))
close = curs.fetchall()
curs.close()
return close
唯一的区别是数据库查询和参数的数量。是否有可能抽象出数据库连接的打开和关闭
我知道使用像SQLAlchemy这样的ORM可能会更容易。但我想了解我是如何解决这类问题的,不仅仅是数据库方面的问题
谢谢你的建议
编辑:基本上回答了我的问题。将该逻辑封装到一个对象中,将该对象传递给数据访问对象,并要求它调用方法 方面或装饰可能是一个很好的方式来做事情
你没有提到池或交易。也要考虑这些问题。注意,从Python2.6开始,
sqlite.connect
:
连接对象可以用作上下文管理器,自动
提交或回滚事务。如果发生异常,则
事务被回滚;否则,事务将被提交:
因此,不要用contextlib.closing
装饰连接——否则,您将丢失提交/回滚行为,而只会在退出with语句时调用连接.close()
Per:
因此,提交/回滚行为比简单地调用close更有用
您可以使用:
由于有许多函数,如getPrice
,它们只在SQL和参数上有所不同,因此可以通过定义query
函数来减少重复的锅炉板代码
您还可以定义一个上下文管理器,以便在出现错误时回滚连接,并在退出with块时提交和关闭连接。可以找到这样一个例子(对于MySQL),将其应用于sqlite3应该并不困难
参考:
首先。有了一个——而且只有一个——全球联系,你会非常非常快乐。如果您只在一个位置执行此操作,那么配置更改会容易得多
其次,使用
with
语句和上下文管理器库
from contextlib import closing
from my_database_module import the_global_connection
def getPrice(
with closing(the_global_connection.cursor())
curs.execute('''SELECT close FROM prices WHERE symbol = ? AND date = ?;''', (symbol, date))
close = curs.fetchall()
return close
您的数据库模块如下所示:
import sqlite3
the_global_connection = sqlite3.connect( "stocks.db" )
这使您能够在同一个位置更改数据库或数据库服务器技术。虽然这是一种改进,特别是在资源管理方面,但与OP演示的内容相比,它不会节省太多代码。您能否解释一下您所指的方面?我从没听说过这个概念。谢谢你的其他想法。面向方面编程。在Python中,它们被称为decorators:contextlib听起来很有前途。我会调查的。全局连接也是我将实现的一个方面。谢谢。我还有一个关于全局数据库连接的问题。当我构建自己的数据库类“database”时,每次需要连接时,我都必须实例化并调用这个类:db=database()
和conn=db。有没有更简单的方法,代码更少?或者是一个如何使用不同类的好例子?很抱歉,如果这对您来说是微不足道的,但我只是从OOP开始。“并在每次需要连接时调用这个类:db=database()。一个单一的全局连接对象就是我告诉你要做的。单个全局连接对象。仅创建数据库连接的一个实例。
from contextlib import closing
from my_database_module import the_global_connection
def getPrice(
with closing(the_global_connection.cursor())
curs.execute('''SELECT close FROM prices WHERE symbol = ? AND date = ?;''', (symbol, date))
close = curs.fetchall()
return close
import sqlite3
the_global_connection = sqlite3.connect( "stocks.db" )