Merge branch 'refactor/backend-architecture' into development
This commit is contained in:
@@ -1,49 +1,33 @@
|
||||
"""
|
||||
一键执行 chapter_sections 迁移:先执行 SQL 建表/加列,再回填数据并删列。
|
||||
|
||||
依赖:.env 中 DATABASE_URL,以及 psycopg、python-dotenv。
|
||||
依赖:.env 中 DATABASE_URL,以及 python-dotenv。
|
||||
用法(在 api 目录下):
|
||||
python -m scripts.run_chapter_sections_migration
|
||||
"""
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
import uuid
|
||||
from pathlib import Path
|
||||
|
||||
# 仅加载 .env,不导入 database(避免 asyncpg 等依赖)
|
||||
# 配置由 app.core.config 加载;DB 使用 psycopg 同步驱动
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
os.chdir(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
from dotenv import load_dotenv
|
||||
load_dotenv()
|
||||
|
||||
import psycopg
|
||||
from sqlalchemy import create_engine, text
|
||||
from sqlalchemy.engine import Engine
|
||||
from urllib.parse import urlsplit
|
||||
from app.core.config import settings
|
||||
from app.core.db import ensure_psycopg_url
|
||||
from app.core.logging import get_logger, setup_logging
|
||||
|
||||
logging.basicConfig(level=logging.INFO, format="%(message)s")
|
||||
logger = logging.getLogger(__name__)
|
||||
setup_logging()
|
||||
logger = get_logger(__name__)
|
||||
|
||||
|
||||
def get_engine() -> Engine:
|
||||
migration_url = os.getenv("MIGRATION_DATABASE_URL")
|
||||
database_url = os.getenv("DATABASE_URL", "postgresql://postgres:postgres@localhost:5432/life_echo")
|
||||
url = migration_url or database_url
|
||||
# region agent log
|
||||
logger.info(
|
||||
"DEBUG migration env selection: migration_present=%s database_present=%s selected=%s selected_host=%s migration_host=%s database_host=%s",
|
||||
bool(migration_url),
|
||||
bool(database_url),
|
||||
"MIGRATION_DATABASE_URL" if migration_url else "DATABASE_URL",
|
||||
urlsplit(url).hostname or "<missing-host>",
|
||||
urlsplit(migration_url).hostname if migration_url else "<empty>",
|
||||
urlsplit(database_url).hostname or "<missing-host>",
|
||||
)
|
||||
# endregion agent log
|
||||
return create_engine(url.replace("postgresql://", "postgresql+psycopg://"), pool_pre_ping=True)
|
||||
url = (settings.migration_database_url or "").strip() or settings.database_url
|
||||
return create_engine(ensure_psycopg_url(url), pool_pre_ping=True)
|
||||
|
||||
|
||||
def run_sql_migration(engine: Engine):
|
||||
@@ -89,7 +73,7 @@ def run_sql_migration(engine: Engine):
|
||||
|
||||
|
||||
def run_data_migration(engine: Engine):
|
||||
from services.memoir_images.parser import split_narrative_to_sections
|
||||
from app.features.memoir.memoir_images.parser import split_narrative_to_sections
|
||||
|
||||
with engine.connect() as conn:
|
||||
r = conn.execute(text("""
|
||||
|
||||
Reference in New Issue
Block a user