Python 自动打开和关闭数据库连接

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

我正在用我的应用程序中的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 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" )