refactor: remove engine; breaks migrations until individual refactor

This commit is contained in:
Jann Stute
2026-08-28 14:59:05 +02:00
parent e2b54ef3ff
commit 27bd1622b7
3 changed files with 33 additions and 37 deletions
@@ -504,10 +504,9 @@ class Library:
) -> LibraryStatus:
logger.info("[Library] Opening SQLite Library", library_dir=library_dir)
self.engine = self.__get_engine(library_dir, in_memory, sql_filename)
# migrate if necessary
try:
migrations = DBMigrations(library_dir, sql_filename, self.engine)
migrations = DBMigrations(library_dir, sql_filename)
# save backup if patches will be applied
if migrations.required:
@@ -517,7 +516,8 @@ class Library:
except MigrationError as e:
return LibraryStatus(success=False, message=e.args[0])
# everything is fine, set the library path
# open up-to-date library
self.engine = self.__get_engine(library_dir, in_memory, sql_filename)
self.library_dir = library_dir
return LibraryStatus(success=True, library_path=library_dir)
@@ -9,7 +9,7 @@ from typing import override
import structlog
import ujson
from sqlalchemy import Engine, and_, delete, select, text, update
from sqlalchemy import and_, delete, select, text, update
from sqlalchemy.orm import Session
from tagstudio.core.constants import IGNORE_NAME, TAG_ARCHIVED, TS_FOLDER_NAME
@@ -47,9 +47,8 @@ class DBMigration:
class DBMigrations:
def __init__(self, library_dir: Path, sql_filename: str, engine: Engine) -> None:
def __init__(self, library_dir: Path, sql_filename: str) -> None:
self.library_dir = library_dir
self.engine = engine # TODO: remove
self._connection = sqlite3.connect(
str(library_dir / TS_FOLDER_NAME / sql_filename), autocommit=False
)
@@ -106,34 +105,30 @@ class DBMigrations:
MigrationTo300, # changes: deletes folders
MigrationTo400, # changes: add category_exclusions
]
with Session(self.engine) as session:
for migration in migrations:
if self.loaded_db_version < migration.version and (
migration.initial_version is None
or self.initial_db_version < migration.initial_version
):
logger.info(f"[Library][Migration][{migration.version}] Starting DB Migration")
# any error causes transaction to rollback
migration.run(
session,
self.library_dir,
lambda msg, v=migration.version: f"[Library][Migration][{v}] {msg}",
for migration in migrations:
if self.loaded_db_version < migration.version and (
migration.initial_version is None
or self.initial_db_version < migration.initial_version
):
logger.info(f"[Library][Migration][{migration.version}] Starting DB Migration")
# any error causes transaction to rollback
migration.run(
None, # TODO: remove session param once all Migrations have been updated
self.library_dir,
lambda msg, v=migration.version: f"[Library][Migration][{v}] {msg}",
)
self.loaded_db_version = migration.version
try:
self._set_version(DB_VERSION_CURRENT_KEY, migration.version)
logger.info(f"[Library][Migration][{migration.version}] Completed DB Migration")
except Exception as e:
logger.info(
f"[Library][Migration][{migration.version}] "
"Couldn't update version, continuing without commit",
error=e,
)
self.loaded_db_version = migration.version
try:
self._set_version(DB_VERSION_CURRENT_KEY, migration.version)
logger.info(
f"[Library][Migration][{migration.version}] Completed DB Migration"
)
except Exception as e:
logger.info(
f"[Library][Migration][{migration.version}] "
"Couldn't update version, continuing without commit",
error=e,
)
session.flush()
else:
session.commit()
else:
self._connection.commit()
assert self.loaded_db_version >= DB_VERSION, (
"Ran all migrations, but the DB is still not on the newest version"
+4 -3
View File
@@ -6,6 +6,7 @@ from sqlite3 import Connection
def list_tables(con: Connection) -> list[str]:
cur = con.cursor()
res = cur.execute("SELECT name FROM sqlite_master WHERE type == 'table';")
return [row[0] for row in res.fetchall()]
return [
row[0]
for row in con.execute("SELECT name FROM sqlite_master WHERE type == 'table'").fetchall()
]