Add PostgreSQL production backend to eliminate SQLite lock contention.

Support DATABASE_URL with connection pooling, pg_dump backups, SQLite migration script, and deploy_postgres.sh with docs.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-01 08:11:42 +08:00
parent 39eac983ff
commit 52aca456e9
23 changed files with 1208 additions and 150 deletions
+6 -4
View File
@@ -7,12 +7,13 @@
from __future__ import annotations
import os
import sqlite3
import time
from datetime import datetime
from typing import Any, Callable, Optional, TypeVar
from zoneinfo import ZoneInfo
from db_conn import OperationalError
T = TypeVar("T")
STATUS_NORMAL = "normal"
@@ -100,12 +101,13 @@ _SCHEMA_READY = False
def _db_retry(action: Callable[[], T], *, retries: int = 8, base_delay: float = 0.03) -> T:
last: sqlite3.OperationalError | None = None
last: OperationalError | None = None
for i in range(retries):
try:
return action()
except sqlite3.OperationalError as exc:
if "locked" not in str(exc).lower():
except OperationalError as exc:
msg = str(exc).lower()
if "locked" not in msg and "serialize" not in msg and "deadlock" not in msg:
raise
last = exc
time.sleep(base_delay * (2 ** i))