从工作线程使用 Flask SQLAlchemy

2024-02-22

我有一个 python 应用程序使用烧瓶宁静 http://flask-restful-cn.readthedocs.io/en/0.3.5Flask SQLAlchemy http://flask-sqlalchemy.pocoo.org/2.1。我正在编写的部分 API 具有剥离的副作用Timer https://docs.python.org/2/library/threading.html#timer-objects对象。当一个Timer过期后,它会执行一些数据库查询。我看到一个问题,其中应该更新数据库(sqlite 后端)中的行的代码实际上没有发出任何UPDATE声明。我已经通过转动来验证了这一点SQLALCHEMY_ECHO标记为记录 SQL 语句。代码是否有效似乎是随机的。大约有一半的时间它无法发出UPDATE陈述。请参阅下面的完整示例。

我的猜测是,从工作线程调用时,SQLAlchemy Flask 无法正常工作。我认为 Flask SQLAlchemy 的部分目的是为每个 API 请求管理 SQLAlchemy 会话。显然,因为当Timer过期后,我可以看到哪些地方可能无法正常工作。

为了测试这一点,我继续使用 python 编写了一个简单的数据访问层sqlite3接口 https://docs.python.org/2/library/sqlite3.html它似乎解决了问题。

不过,我真的不想重写一堆数据访问代码。在这种情况下,有没有办法让 Flask SQLAlchemy 正常工作?

示例代码

这是我设置 Flask 应用程序并保存 SQLAlchemy 的地方db object:

from flask import Flask
from flask_restful import Api
from flask.ext.sqlalchemy import SQLAlchemy
from flask_cors import CORS
import db_conn

flask_app = Flask(__name__)
flask_app.config.from_object('config')
CORS(flask_app)
api = Api(flask_app)
db_conn.db = SQLAlchemy(flask_app)

api.add_resource(SomeClass, '/abc/<some_id>/def')

以下是我创建 ORM 模型的方法:

import db_conn

db = db_conn.db

class MyTable(db.Model):
    __tablename__ = 'my_table'
    id = db.Column(db.Integer, primary_key=True)
    phase = db.Column(db.Integer, nullable=False, default=0)

    def set_phase(self, phase):
        self.phase = phase
        db.session.commit()

以下是带有计时器的 API 处理程序和失败的数据库调用:

from flask_restful import Resource
from threading import Timer
from models import MyTable
import db_conn
import global_store

class SomeClass(Resource):    
    def put(self, some_id):
        global_store.saved_id = some_id
        self.timer = Timer(60, self.callback)
        return '', 204

    def callback(self):
        row = MyTable.query.filter_by(id=global_store.saved_id).one()
        
        # sometimes this works, sometimes it doesn't
        row.set_phase(1)
        db_conn.db.session.commit()

我猜在你的回调中你实际上并没有改变对象的值。如果会话状态不脏,SQLAlchemey 将不会发出 DB UPDATE 调用。因此,如果由于某种原因阶段已经为 1,则无需执行任何操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从工作线程使用 Flask SQLAlchemy 的相关文章

随机推荐

  • 迭代哈希在 Python 和 Java 中返回不同的值

    我正在尝试将 python 2 7 脚本移植到 Java 它多次迭代 sha256 哈希 但最终得到不同的结果 我注意到他们第一次返回相同的结果 但从那时起它就不同了 这是 Python 实现 import hashlib def to h
  • Windows 窗体的多个滑块轨迹栏

    有谁知道如何在 WinForms 中创建带有多个滑块的跟踪栏 我想标记一个范围 另外 是否可以将滑块垂直偏移一点 我的目标是在轨迹栏上方有两个滑块 在轨迹栏下方有两个滑块 v v 您可以通过编写自己的代码来做到这一点UserControl您
  • 使用 bootstrap 主题从链接添加自定义类到 drupal-modal drupal 8

    在 Drupal 8 中 当您使用以下命令创建链接时使用引导主题class and data dialog type属性如下面的代码 a class use ajax href http drupal page front text a 您
  • 我可以在C#中反序列化包含0.0的JSON字符串吗?

    我从 Web 服务返回的 JSON 有一个整数 错误地表示为 0 0 我的反序列化代码如下所示 var serializer new JsonSerializer var ret serializer Deserialize
  • 使用 R 将多个文件从多个文件夹复制到单个文件夹

    嘿我想问如何使用R语言将多个文件夹中的多个文件复制到单个文件夹 假设有三个文件夹 桌面 文件夹 A 任务 子任务 桌面 文件夹 B 任务 子任务 桌面 folder C 任务 子任务 每个sub task文件夹中都有多个文件 我想复制 su
  • Microsoft Teams 中的 ActionTypes.MessageBack 存在问题?

    我正在使用带有 C 的 Bot Builder 3 11 版本 我有一个 ActionTypes MessageBack 类型的操作按钮 具有以下属性 cardActions Add new CardAction Type ActionTy
  • CSS !important 声明在 Outlook 2007 中不起作用

    我想创建一个锚颜色为红色的电子邮件模板 它应该是 重要的声明以避免继承其他样式值 不幸的是 它在 Outlook 2007 2010 中无法正确呈现 有人有类似的经历吗 与 Outlook 中的 important 标记支持相关的问题 我在
  • 如何同步两个View的drawable状态

    在 Android 中 我有一个 EditText 和一个位于 EditText 旁边的按钮 每当我按下一个按钮时 我都希望另一个也以相同的状态出现 我尝试将 android clickable true 放在封闭布局上 将 android
  • 对角化符号矩阵

    我需要用 python 对角化一个符号矩阵 在 Mathematica 中这可以很容易地完成 但是当使用模块时numpy linalg我遇到问题 为了具体起见 请考虑矩阵 2 x x 3 where x是一个符号变量 我想我遇到了问题 因为
  • 为 UIFont 定义宏不起作用

    我想定义一个宏来统一我的应用程序中的所有字体 define EXO REGULAR FONT size UIFont fontWithName Exo Regular size size 而不是像这样使用这个宏 myLabel font E
  • 如何在 Espresso 中的 RecyclerView 内部断言?

    我正在使用 espresso contrib 来执行操作RecyclerView 并且它应该正常工作 例如 click on first item onView withId R id recycler view perform Recyc
  • C# 生产质量线程安全内存中 LRU 缓存是否过期?

    这也许就像求棒上的月亮一样 但是是否有 C 生产质量的线程安全内存中 LRU 缓存 带过期 或者有人有最佳实践想法来实现同样的事情吗 LRU 是 最近最少使用 http en wikipedia org wiki Cache algorit
  • ListView 中每个项目的单独首选项?

    我正在创建我的第一个 Android 应用程序 或者无论如何都在尝试 但我有一个问题 我似乎找不到答案 我想允许用户为列表视图中的每个项目输入一组单独的首选项 我的 PreferenceScreen 正在工作 但它为每个项目维护相同的首选项
  • 为什么 scanf 中需要 %hd ?

    我创建了一个非常简单的程序 带有菜单 取一个值 然后将其记忆到 局部变量值 最后与 第二个选项是程序打印该值 我的问题是 为什么只有添加 h 程序才能运行 到 scanf 参数 换句话说 存在什么样的关系 scanf 和我的本地 int 值
  • Sprite Kit:大量带有 Bit Blitting 的 sprite(1000+)

    我正在尝试使用 SpriteKit 创建一个场景 其中包含数千个精灵 500 2000 每个精灵只是一个 1x1 的白色像素 甚至不需要为它们使用纹理 立即将这么多精灵直接添加到场景中是不可能的 或者至少我这么认为 在 iPhone 6 上
  • 玩法框架2:在route中使用Array[String]

    我想生成一个像这样的网址 照片 标签 标签1 标签2 标签3 路线文件 GET photo controllers Photos list tags Array String 我在播放控制台中收到此错误 找不到 Array String 类
  • 尝试使用 ServiceController 时出现错误 MSB4062

    我在 x64 计算机上使用 Visual Studio 2010 和 TFS 2010 我正在尝试在我的构建中使用 MSBuild 社区任务目标 该目标存在于源代码管理中 因此 在我的 csproj 文件中 我导入该特定目标 但现在出现以下
  • 在项目的层次结构中找不到新元素

    我正在尝试为 Xamarin 应用程序创建一个简单的页面 但完全无法继续执行最基本的步骤 我从项目存储库中检查分支 并尝试添加新文件 当我这样做时 右键单击文件夹 添加 gt 新项目 gt 内容页面 我收到此错误 它实际上创建了 xaml
  • 在使用像数组这样的变量之前分配 array()

    我试图找到一个合适的解释性标题 但我找不到 我将尝试解释我在这里问的问题 通常 如果您不将空数组分配给变量 则可以开始为索引分配值 如下所示 hello world Hello World echo hello world 但我总是遇到这样
  • 从工作线程使用 Flask SQLAlchemy

    我有一个 python 应用程序使用烧瓶宁静 http flask restful cn readthedocs io en 0 3 5也Flask SQLAlchemy http flask sqlalchemy pocoo org 2