Commit 5843eac
src/database/turso.py
@@ -36,14 +36,14 @@ async def turso_db_url(
@cache.memoize(ttl=0)
async def turso_create_table(
- table_name: str | float,
+ table_name: str,
columns: str,
*,
idx_cols: list[str] | None = None,
idx_prefix: str = "idx_",
fts_on_col: str | None = None,
fts_index_col: str = "segmented",
- fts_tabme_name: str | None = None,
+ fts_name: str | None = None,
db_name: str = "bennybot",
username: str = DB.TURSO_USERNAME,
api_token: str = DB.TURSO_API_TOKEN,
@@ -122,19 +122,19 @@ async def turso_create_table(
-- fts_index_col 是我们要索引的列
-- tokenize='unicode61' 使用 unicode61 分词器, 对多种语言支持更好
"""
- if fts_tabme_name is None:
- fts_tabme_name = f"fts_{table_name}"
+ fts_table = f"fts_{table_name}" if fts_name is None else f"fts_{fts_name}"
+
statements = []
- if fts_tabme_name not in virtual_tables:
+ if fts_table not in virtual_tables:
logger.debug(f"Creating FTS5 virtual table for {table_name}")
- sql = f"CREATE VIRTUAL TABLE IF NOT EXISTS '{fts_tabme_name}' USING fts5({fts_index_col}, content='{table_name}', content_rowid={fts_on_col}, tokenize='unicode61');"
+ sql = f"CREATE VIRTUAL TABLE IF NOT EXISTS '{fts_table}' USING fts5({fts_index_col}, content='{table_name}', content_rowid={fts_on_col}, tokenize='unicode61');"
statements.append({"type": "execute", "stmt": {"sql": sql}})
"""将现有数据从原表复制到 FTS 表
注意, 我们在这里插入的是 rowid (它会对应到 content_rowid=fts_on_col 指定的列) 和 content
从原表中选择 fts_on_col 和 segmented 列。fts_on_col 列的值会被插入到 FTS 表中对应原表 rowid (或 content_rowid) 的位置。
"""
- sql = f"INSERT INTO '{fts_tabme_name}' (rowid, {fts_index_col}) SELECT {fts_on_col}, {fts_index_col} FROM '{table_name}' WHERE {fts_on_col} NOT IN (SELECT rowid FROM '{fts_tabme_name}');"
+ sql = f"INSERT INTO '{fts_table}' (rowid, {fts_index_col}) SELECT {fts_on_col}, {fts_index_col} FROM '{table_name}' WHERE {fts_on_col} NOT IN (SELECT rowid FROM '{fts_table}');"
statements.append({"type": "execute", "stmt": {"sql": sql}})
# 列出所有触发器
@@ -151,20 +151,21 @@ async def turso_create_table(
为了让 FTS 表与原表保持同步, 需要在原表上创建触发器。
在原表插入、删除、更新时, 同步更新 FTS 表
"""
+ trigger_prefix = f"trigger_{table_name}" if fts_name is None else f"trigger_{fts_name}"
# 创建触发器, 在原表插入数据时, 同步从 FTS 表插入
- if f"trigger_{table_name}_ai" not in triggers:
- sql = f"CREATE TRIGGER IF NOT EXISTS 'trigger_{table_name}_ai' AFTER INSERT ON '{table_name}' BEGIN INSERT INTO '{fts_tabme_name}' (rowid, {fts_index_col}) VALUES (NEW.{fts_on_col}, NEW.{fts_index_col}); END;"
+ if f"{trigger_prefix}_ai" not in triggers:
+ sql = f"CREATE TRIGGER IF NOT EXISTS '{trigger_prefix}_ai' AFTER INSERT ON '{table_name}' BEGIN INSERT INTO '{fts_table}' (rowid, {fts_index_col}) VALUES (NEW.{fts_on_col}, NEW.{fts_index_col}); END;"
statements.append({"type": "execute", "stmt": {"sql": sql}})
# 创建触发器, 在原表删除数据时, 同步从 FTS 表删除
- if f"trigger_{table_name}_ad" not in triggers:
- sql = f"CREATE TRIGGER IF NOT EXISTS 'trigger_{table_name}_ad' AFTER DELETE ON '{table_name}' BEGIN DELETE FROM '{fts_tabme_name}' WHERE rowid = OLD.{fts_on_col}; END;"
+ if f"{trigger_prefix}_ad" not in triggers:
+ sql = f"CREATE TRIGGER IF NOT EXISTS '{trigger_prefix}_ad' AFTER DELETE ON '{table_name}' BEGIN DELETE FROM '{fts_table}' WHERE rowid = OLD.{fts_on_col}; END;"
statements.append({"type": "execute", "stmt": {"sql": sql}})
# 创建触发器, 在原表更新数据时, 同步更新 FTS 表
# FTS5 的更新通常是先删除旧的, 再插入新的
- if f"trigger_{table_name}_au" not in triggers:
- sql = f"CREATE TRIGGER IF NOT EXISTS 'trigger_{table_name}_au' AFTER UPDATE ON '{table_name}' BEGIN DELETE FROM '{fts_tabme_name}' WHERE rowid = OLD.{fts_on_col} AND OLD.{fts_index_col} <> NEW.{fts_index_col}; INSERT INTO '{fts_tabme_name}' (rowid, {fts_index_col}) SELECT NEW.{fts_on_col}, NEW.{fts_index_col} WHERE OLD.{fts_index_col} <> NEW.{fts_index_col}; END;"
+ if f"{trigger_prefix}_au" not in triggers:
+ sql = f"CREATE TRIGGER IF NOT EXISTS '{trigger_prefix}_au' AFTER UPDATE ON '{table_name}' BEGIN DELETE FROM '{fts_table}' WHERE rowid = OLD.{fts_on_col} AND OLD.{fts_index_col} <> NEW.{fts_index_col}; INSERT INTO '{fts_table}' (rowid, {fts_index_col}) SELECT NEW.{fts_on_col}, NEW.{fts_index_col} WHERE OLD.{fts_index_col} <> NEW.{fts_index_col}; END;"
statements.append({"type": "execute", "stmt": {"sql": sql}})
await turso_exec(
statements,
src/history/turso.py
@@ -223,7 +223,7 @@ async def get_table_name(client: Client, chat_id: str | int) -> str:
idx_cols=INDEX_NAMES,
idx_prefix=f"idx_{slim_cid}_",
fts_on_col="mid",
- fts_tabme_name=f"fts_{slim_cid}",
+ fts_name=slim_cid,
**TURSO_KWARGS,
)
return table_name