generated from gilles/template-webapp
import ali
This commit is contained in:
@@ -83,13 +83,85 @@ async def get_db() -> AsyncGenerator[AsyncSession, None]:
|
||||
async def init_db() -> None:
|
||||
"""Initialise la base de données.
|
||||
|
||||
Crée toutes les tables définies dans les modèles.
|
||||
Crée toutes les tables définies dans les modèles + FTS5 pour la recherche.
|
||||
À utiliser uniquement en développement ou pour les tests.
|
||||
En production, utiliser Alembic pour les migrations.
|
||||
"""
|
||||
async with engine.begin() as conn:
|
||||
await conn.run_sync(Base.metadata.create_all)
|
||||
|
||||
# Initialisation de la recherche full-text FTS5
|
||||
await init_fts5()
|
||||
|
||||
|
||||
async def init_fts5() -> None:
|
||||
"""Crée la table virtuelle FTS5 et les triggers de synchronisation.
|
||||
|
||||
FTS5 permet une recherche full-text performante sur les items.
|
||||
Les triggers maintiennent l'index à jour automatiquement.
|
||||
"""
|
||||
from sqlalchemy import text
|
||||
|
||||
async with engine.begin() as conn:
|
||||
# Supprimer l'ancienne table FTS5 si elle existe (pour recréation propre)
|
||||
await conn.execute(text("DROP TRIGGER IF EXISTS fts_items_insert"))
|
||||
await conn.execute(text("DROP TRIGGER IF EXISTS fts_items_update"))
|
||||
await conn.execute(text("DROP TRIGGER IF EXISTS fts_items_delete"))
|
||||
await conn.execute(text("DROP TABLE IF EXISTS fts_items"))
|
||||
|
||||
# Table virtuelle FTS5 indexant nom, description, marque, modèle, notes
|
||||
await conn.execute(text("""
|
||||
CREATE VIRTUAL TABLE fts_items USING fts5(
|
||||
name,
|
||||
description,
|
||||
brand,
|
||||
model,
|
||||
notes,
|
||||
serial_number,
|
||||
content='items',
|
||||
content_rowid='id',
|
||||
tokenize='unicode61 remove_diacritics 2'
|
||||
)
|
||||
"""))
|
||||
|
||||
# Trigger INSERT : ajouter dans FTS5 quand un item est créé
|
||||
await conn.execute(text("""
|
||||
CREATE TRIGGER fts_items_insert
|
||||
AFTER INSERT ON items
|
||||
BEGIN
|
||||
INSERT INTO fts_items(rowid, name, description, brand, model, notes, serial_number)
|
||||
VALUES (NEW.id, NEW.name, NEW.description, NEW.brand, NEW.model, NEW.notes, NEW.serial_number);
|
||||
END
|
||||
"""))
|
||||
|
||||
# Trigger UPDATE : mettre à jour FTS5 quand un item est modifié
|
||||
await conn.execute(text("""
|
||||
CREATE TRIGGER fts_items_update
|
||||
AFTER UPDATE ON items
|
||||
BEGIN
|
||||
INSERT INTO fts_items(fts_items, rowid, name, description, brand, model, notes, serial_number)
|
||||
VALUES ('delete', OLD.id, OLD.name, OLD.description, OLD.brand, OLD.model, OLD.notes, OLD.serial_number);
|
||||
INSERT INTO fts_items(rowid, name, description, brand, model, notes, serial_number)
|
||||
VALUES (NEW.id, NEW.name, NEW.description, NEW.brand, NEW.model, NEW.notes, NEW.serial_number);
|
||||
END
|
||||
"""))
|
||||
|
||||
# Trigger DELETE : supprimer de FTS5 quand un item est supprimé
|
||||
await conn.execute(text("""
|
||||
CREATE TRIGGER fts_items_delete
|
||||
AFTER DELETE ON items
|
||||
BEGIN
|
||||
INSERT INTO fts_items(fts_items, rowid, name, description, brand, model, notes, serial_number)
|
||||
VALUES ('delete', OLD.id, OLD.name, OLD.description, OLD.brand, OLD.model, OLD.notes, OLD.serial_number);
|
||||
END
|
||||
"""))
|
||||
|
||||
# Remplir FTS5 avec les données existantes
|
||||
await conn.execute(text("""
|
||||
INSERT INTO fts_items(rowid, name, description, brand, model, notes, serial_number)
|
||||
SELECT id, name, description, brand, model, notes, serial_number FROM items
|
||||
"""))
|
||||
|
||||
|
||||
async def close_db() -> None:
|
||||
"""Ferme proprement les connexions à la base de données.
|
||||
|
||||
Reference in New Issue
Block a user