Migrate from SQLAlchemy 1.x legacy Query API to 2.x style select/delete statements

This commit is contained in:
2026-04-06 01:06:01 +08:00
parent 356950e2c7
commit 970c2e9946
39 changed files with 372 additions and 275 deletions
+6 -3
View File
@@ -20,6 +20,7 @@
import os
from secrets import token_urlsafe
import sqlalchemy as sa
from click.testing import Result
from flask import Flask, Blueprint, render_template, redirect, Response, \
url_for
@@ -112,8 +113,8 @@ def create_app(is_testing: bool = False, is_skip_accounts: bool = False,
return auth.current_user()
def get_by_username(self, username: str) -> auth.User | None:
return auth.User.query\
.filter(auth.User.username == username).first()
return db.session.scalar(
sa.select(auth.User).where(auth.User.username == username))
def get_pk(self, user: auth.User) -> int:
return user.id
@@ -140,7 +141,9 @@ def init_db(app: Flask, is_skip_accounts: bool,
db.create_all()
from .auth import User
for username in ["viewer", "editor", "admin", "nobody"]:
if User.query.filter(User.username == username).first() is None:
user: User | None = db.session.scalar(
sa.select(User).where(User.username == username))
if user is None:
db.session.add(User(username=username))
db.session.commit()
runner: FlaskCliRunner = app.test_cli_runner()
+3 -2
View File
@@ -19,6 +19,7 @@
"""
from collections.abc import Callable
import sqlalchemy as sa
from flask import Blueprint, render_template, Flask, redirect, url_for, \
session, request, g, Response, abort
from sqlalchemy.orm import Mapped, mapped_column
@@ -91,8 +92,8 @@ def current_user() -> User | None:
if "user" not in session:
g.user = None
else:
g.user = User.query.filter(
User.username == session["user"]).first()
g.user = db.session.scalar(
sa.select(User).where(User.username == session["user"]))
return g.user
+2 -2
View File
@@ -218,8 +218,8 @@ class BaseTestData(ABC):
self._app: Flask = app
"""The Flask application."""
with self._app.app_context():
current_user: User | None = User.query\
.filter(User.username == username).first()
current_user: User | None = db.session.scalar(
sa.select(User).where(User.username == username))
assert current_user is not None
self.__current_user_id: int = current_user.id
"""The current user ID."""
+9 -8
View File
@@ -19,6 +19,7 @@
"""
import datetime as dt
import sqlalchemy as sa
from flask import Flask, Blueprint, url_for, flash, redirect, session, \
render_template, current_app, Response
from flask_babel import lazy_gettext
@@ -83,14 +84,14 @@ def __reset_database() -> None:
from accounting.account import init_accounts_command
from accounting.currency import init_currencies_command
JournalEntryLineItem.query.delete()
JournalEntry.query.delete()
CurrencyL10n.query.delete()
Currency.query.delete()
AccountL10n.query.delete()
Account.query.delete()
BaseAccountL10n.query.delete()
BaseAccount.query.delete()
db.session.execute(sa.delete(JournalEntryLineItem))
db.session.execute(sa.delete(JournalEntry))
db.session.execute(sa.delete(CurrencyL10n))
db.session.execute(sa.delete(Currency))
db.session.execute(sa.delete(AccountL10n))
db.session.execute(sa.delete(Account))
db.session.execute(sa.delete(BaseAccountL10n))
db.session.execute(sa.delete(BaseAccount))
init_base_accounts_command()
init_accounts_command(session["user"])
init_currencies_command(session["user"])