【问题标题】:How should I build a simple database package for my python application?我应该如何为我的 python 应用程序构建一个简单的数据库包?
【发布时间】:2010-05-18 02:56:50
【问题描述】:

我正在使用 sqlite3 作为基础为我的应用程序构建一个数据库库。我想这样构造它:

D b/ __init__.py 用户.py 废话 等.py

所以我会在 Python 中这样做:

import db
db.users.create('username', 'password')

关于如何处理数据库连接,我正在遭受分析瘫痪(哦,不!)。我真的不想在这些模块中使用类,能够创建一堆可以以相同方式操作同一个数据库的“用户”对象似乎并不合适——所以继承一个连接是不行。

我是否应该有一个到所有模块都使用的数据库的全局连接,然后把它放在每个模块中:

#users.py
from db_stuff import connection

或者我应该为每个模块创建一个新连接并保持其活动状态?

或者我应该为每笔交易创建一个新的连接?

应该如何使用这些数据库连接?游标对象也是如此:我是否为每个事务创建一个新游标?只为每个数据库连接创建一个?

【问题讨论】:

    标签: python database sqlite library-design


    【解决方案1】:

    不,不要将连接分散到多个模块 - 这是糟糕的设计。让单个类处理 DB 连接并为应用程序中的其他类/模块提供服务。

    这与非数据库相关的良好设计原则没有什么不同。连接是全局资源。在许多模块上共享该资源类似于从许多地方访问一个全局变量——默认情况下这是一件坏事(除非你有一个非常令人信服的理由,但你没有)。将全局资源封装在一个类中进行处理。

    【讨论】:

    • 非常优雅地表达了一个经常被忽视的戒律。
    • 所以有一个全局连接但将其包装在一个类中?这似乎与拥有一个全局连接但将其放在一个模块中没有太大区别......让每个模块开始自己的连接是一件坏事吗?
    • 没关系,经过一番阅读后,我发现到同一个数据库的两个连接不能很好地工作:/
    • @Carson:对象封装了连接,为用户提供了一些统一的接口。如果您决定将来某个时候更改连接或数据库,则必须对用户代码进行最低限度的更改
    • 您不需要全局连接。例如,如果您有db.get_connection(),则该方法可以选择是返回其他对db.get_connection() 的调用所使用的相同连接对象,还是返回一个新对象。然后你可以维护一个连接池等。
    【解决方案2】:

    我知道这并不能真正回答您提出的实际问题,但真正的答案是您可能不应该实现自己的数据库包。您可能应该使用现有的(例如 SQLALchemy),然后使用该库的标准模式。

    如果您真的想自己动手,那么最好的方法将取决于很多因素,例如项目确定只需要连接到一个数据库吗?

    如果这是一个相当简单的应用程序,我认为导入全局连接对象可能是可行的方法。您可以随时将其换成幕后的连接池等。

    【讨论】:

    • 这是一个相当简单的应用程序,这个包所做的只是为一堆查询命名,真的。我只是不确定何时创建数据库连接。
    • +1 建议使用 SQLAlchemy,即使对于一个简单的应用程序也可能是一个好主意,它使编写数据库查询变得更加 Pythonic :) 它还在内部实现连接池和每线程范围的会话处理所以你不必担心这些事情。只需在您需要时进行会话,它将处理血淋淋的细节和优化。
    猜你喜欢
    • 2021-06-05
    • 2010-09-26
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    相关资源
    最近更新 更多