Migrate from duckdb to sqlite

This commit is contained in:
iacore
2026-07-14 11:57:53 +08:00
parent 8bf19a8d18
commit 216a7658ac
7 changed files with 53 additions and 40 deletions
+1 -1
View File
@@ -2,7 +2,7 @@ FROM python:3.14-slim
WORKDIR /app
RUN pip install --no-cache-dir flask duckdb gunicorn
RUN pip install --no-cache-dir flask gunicorn
COPY . .
+14 -12
View File
@@ -1,29 +1,31 @@
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = ["duckdb"]
# dependencies = []
# ///
"""Full-text search over MPI term database. Queries unified_terms_flat via DuckDB LIKE.
"""Full-text search over MPI term database (SQLite).
Module usage:
from search import search_terms
results = search_terms("空性")
results = search_terms("空性", limit=5, loc="心经", src="佛教术语")
from search import search
results = search("空性")
results = search("空性", limit=5, loc="心经", src="佛教术语")
# returns list of dicts: {zh, en, loc, source}
CLI usage:
python search.py <query> [limit]
python search.py 空性 loc:心经 src:公案
toolkit/terms-database/search.py <query> [limit]
toolkit/terms-database/search.py 空性 loc:心经 src:公案
"""
import sys
import os
import duckdb
import sqlite3
DB = os.path.join(os.path.dirname(os.path.abspath(__file__)), "termlib.duckdb")
DB = os.path.join(os.path.dirname(os.path.abspath(__file__)), "termlib.sqlite")
def _connect():
return duckdb.connect(DB, read_only=True)
con = sqlite3.connect(DB)
con.execute("PRAGMA journal_mode=WAL")
return con
def _search_rows(con, query, loc=None, src=None, limit=None):
@@ -45,7 +47,7 @@ def _search_rows(con, query, loc=None, src=None, limit=None):
where += " AND source = ?"
params.append(src)
sql = f"SELECT zh, en, loc, source FROM unified_terms_flat WHERE {where}"
sql = f"SELECT zh, en, loc, source FROM terms WHERE {where}"
if limit is not None:
sql += " LIMIT ?"
params.append(limit)
@@ -55,7 +57,7 @@ def _search_rows(con, query, loc=None, src=None, limit=None):
def search(query, loc=None, src=None, limit=20):
"""Search the terms database. Returns list of {zh, en, loc, source} dicts.
query: str — space-separated search terms (AND logic)
loc: str — filter by loc column (LIKE match)
src: str — filter by source column (exact match)
Regular → Executable
+12 -6
View File
@@ -2,21 +2,27 @@
import sys, os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import duckdb
import sqlite3
from flask import Flask, request, jsonify, render_template
import search as s
app = Flask(__name__)
def _connect():
con = sqlite3.connect(s.DB)
con.execute("PRAGMA journal_mode=WAL")
return con
def do_search(q, loc, src, limit):
with duckdb.connect(s.DB, read_only=True) as con:
rows = s.search(con, q, loc, src, limit)
return [{'zh': r[0], 'en': r[1], 'loc': r[2] or None, 'source': r[3]} for r in rows]
rows = s.search(q, loc=loc, src=src, limit=limit)
return [{'zh': r['zh'], 'en': r['en'], 'loc': r['loc'] or None, 'source': r['source']} for r in rows]
def do_sources():
with duckdb.connect(s.DB, read_only=True) as con:
with _connect() as con:
rows = con.execute(
'SELECT source, COUNT(*) AS cnt FROM unified_terms_flat GROUP BY source ORDER BY cnt DESC'
'SELECT source, COUNT(*) AS cnt FROM terms GROUP BY source ORDER BY cnt DESC'
).fetchall()
return [{'source': r[0], 'count': r[1]} for r in rows]
Binary file not shown.
Binary file not shown.