python - 如何为整个 Tornado Web 应用程序建立与 SQLite 数据库的一个连接?

标签 python database sqlite database-connection tornado

现在,每次编辑用户名时,我都会创建与 SQLite 数据库的新连接。我应该怎么做才能为整个应用程序建立单个连接?

class UserEditHandler(tornado.web.RequestHandler):
    def get(self, user_id):
        self.render('user_edit.html')

    def post(self, user_id):
        edited_name = str(self.get_arguments('name')[0])
        session = create_session()
        user_object = session.query(User).filter_by(id=user_id).first()
        user_object.name = edited_name
        session.commit()

最佳答案

有几个解决方案:

  • 将其包装在一些单例类中(正如 Nikos 所说)
  • 将其包装在具有全局 session 和函数 get_session 的单独模块中(实际上与单例类相同,但在模块范围内)
  • 在Application类中处理数据库,注入(inject)到RequestHandler中

我推荐第三个:

import tornado 

class MyApp(tornado.web.Application):
    def __init__(self, *args, **kwargs):
        super(MyApp, self).__init__(*args, **kwargs)
        # or even initilaize connection
        self._db = None

    @property
    def db(self):
        if self._db is None:
            self._db = create_session()
        # additionally you can check here if session is time-outed or something
        return self._db


class UserEditHandler(tornado.web.RequestHandler):
    def get(self, user_id):
        self.render('user_edit.html')

    def post(self, user_id):
        edited_name = str(self.get_arguments('name')[0])
        user_object = self.application.db.query(User).filter_by(
            id=user_id
        ).first()
        user_object.name = edited_name
        self.application.db.commit()

关于python - 如何为整个 Tornado Web 应用程序建立与 SQLite 数据库的一个连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34240392/

相关文章:

python - 类型错误 : unsupported operand type(s) for ** or pow(): 'MLinExpr' and 'int'

mysql - SQL:如何获取仅包含某些 ID 的行?

angular - 在 promise 中循环 [object, Object]

mysql - Blob 中的 Skript 值已加密

java - 数据库中的抽象

android - 如何从数据库中提取数据并将它们存储到 Android 中的数组中?

c# - SQLite 代码分析 C#

python - 使用交替运算符匹配多个正则表达式模式?

python - 基于标准的 Pandas 样本

python - 如何在谷歌日历 API 中使用 run_flow()?