Skip to content

Flask-SQLAlchemy example

This is a quick example of how to use alchemical_queues.tasks in a Flask context. We'll use the file tasks.py from the main tutorial.

Flask-SQLAlchemy version

Alchemical Queues requires SQLAlchemy 2.x. Make sure you use Flask-SQLAlchemy 3.0 or newer, since earlier releases only support SQLAlchemy 1.x.

from alchemical_queues.tasks import task

@task
def add_numbers(taskinfo, a, b):
    print(f"Running {a}+{b}")
    return a + b

The minimal Flask app looks like this:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from alchemical_queues import AlchemicalQueues
from tasks import add_numbers


db = SQLAlchemy()
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///project.db"
db.init_app(app)

queues = AlchemicalQueues()

with app.app_context():
    db.create_all()
    queues.set_engine(db.engine)
    queues.create_all()


@app.route("/<int:a>/<int:b>")
def add_some_numbers(a: int, b: int):
    task_queue = queues.get_task_queue("task-queue")
    entry = add_numbers(a, b).schedule(task_queue)
    return f"task: {entry.entry_id}"


@app.route("/result/<int:entry>")
def result(entry: int):
    task_queue = queues.get_task_queue("task-queue")
    task = add_numbers.retrieve(task_queue, entry)

    if not task.done:
        return "No result yet"
    else:
        return f"result: {task.result}"


if __name__ == "__main__":
    app.run()

The worker can be run like this:

alchemical_worker "sqlite:///project.db" task-queue