【问题标题】:How to organize database connections in larger Python/Flask applications?如何在较大的 Python/Flask 应用程序中组织数据库连接?
【发布时间】:2013-11-04 15:00:40
【问题描述】:

我目前正在尝试使用 python、flask 和 sqlite 编写一个小型 Web 应用程序,但我不确定如何处理数据库连接。

基本上我一直在关注“官方”教程(和http://flask.pocoo.org/docs/patterns/sqlite3/#sqlite3),在我的主要 Flask/App 模块(大大缩短)中留下了这样的代码:

@vs_app.before_request
def before_request():
    g.db = sqlite3.connect("somedb.db")

def execute_db(command):
    return g.db.cursor().execute(command).fetchall()

@app.route("/givemeallusers")
def foo():
    return execute_db("SELECT * FROM users")

因此,这将为我的应用程序可以用来执行 sql 命令的每个请求创建一个 DB-Connection,它适用于较小的应用程序。
但是对于一个更大的项目,我想把我的数据库代码(带有一些实用方法)和应用程序代码放在不同的模块中,所以我可以(例如)写:

from my_database_module import user_auth #

@app.route("/login")
def foo():
    if user_auth(request.form["name"], request.form["pw"]):
        pass

但是为此,我需要从我的数据库类访问 g(或 g.db),我可以让它工作的唯一方法是“手动”将 db-connection 移交给每个方法,留下我用这样的代码:

@app.route("/login")
def foo():
    if user_auth(g.db, request.form["name"], request.form["pw"]):
        pass

在我的数据库模块中

def user_auth(database, name, pw):
    pass

我认为这不是最好的方法,但是我的其他想法(例如将 g 对象导入我的数据库类)不起作用。我也不知道我的方法对于并发数据库访问是否安全,因此我们将不胜感激。
tl; dr 如何以正确的方式拆分 Flask-App 和 Database/Database-Utility?

【问题讨论】:

  • 我建议你看看 Flask-SQlAlchemy pythonhosted.org/Flask-SQLAlchemy
  • 为什么不简单地在您的user_auth 方法中访问相同的g.db,而不是将其传入?因为它是一个本地线程,所以一切应该正常工作。
  • 1.我目前正在研究 Flask-SQLAlchemy。还不知道该怎么想 :) 2. 我通过从我的数据库模块中导入“g”来尝试过,但是我需要再次将我的身份验证方法导入到我的主模块中,这不是可能是因为循环依赖
  • 你真的应该听从建议并使用 Flask-SQLAlchemy。
  • 我一直在使用 Flask-SQLAlchemy 重建应用程序。虽然我花了一些时间来启动和运行它(我想我需要更长的时间才能正确地获得一些 N:M-Mapping),但我不得不说到目前为止它的可用性给我留下了深刻的印象,绝对值得我说的努力。谢谢大家的帮助:)

标签: python sqlite flask


【解决方案1】:

以防万一有人偶然发现这个问题:
正确的答案是不要打扰问题中描述的方法,而是开始使用 Flask-SQLAlchemy。

【讨论】:

    猜你喜欢
    • 2012-03-12
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多