61 lines
2.0 KiB
Python
61 lines
2.0 KiB
Python
"""
|
||
Task 14 最终验证脚本:验证种子数据完整性和表结构。
|
||
一次性脚本,验证后可删除。
|
||
"""
|
||
import os
|
||
import sys
|
||
|
||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "apps", "backend"))
|
||
|
||
from dotenv import load_dotenv
|
||
load_dotenv(os.path.join(os.path.dirname(__file__), "..", "..", ".env"))
|
||
|
||
import psycopg2
|
||
|
||
dsn = os.environ.get("APP_DB_DSN", "")
|
||
if not dsn:
|
||
raise RuntimeError("APP_DB_DSN 未设置")
|
||
|
||
# 替换为测试库
|
||
dsn = dsn.replace("/zqyy_app", "/test_zqyy_app")
|
||
|
||
conn = psycopg2.connect(dsn)
|
||
try:
|
||
with conn.cursor() as cur:
|
||
# 验证种子数据完整性(4 条触发器配置)
|
||
cur.execute(
|
||
"SELECT job_name, job_type, trigger_condition, status "
|
||
"FROM biz.trigger_jobs ORDER BY id"
|
||
)
|
||
rows = cur.fetchall()
|
||
print(f"trigger_jobs 记录数: {len(rows)}")
|
||
for r in rows:
|
||
print(f" {r[0]} | {r[1]} | {r[2]} | {r[3]}")
|
||
assert len(rows) >= 4, f"期望至少 4 条种子数据,实际 {len(rows)}"
|
||
|
||
# 验证表结构
|
||
for tbl in ["coach_tasks", "coach_task_history", "notes", "trigger_jobs"]:
|
||
cur.execute(
|
||
"SELECT count(*) FROM information_schema.tables "
|
||
"WHERE table_schema='biz' AND table_name=%s",
|
||
(tbl,),
|
||
)
|
||
exists = cur.fetchone()[0]
|
||
status = "存在" if exists else "不存在"
|
||
print(f"biz.{tbl}: {status}")
|
||
assert exists, f"biz.{tbl} 不存在"
|
||
|
||
# 验证部分唯一索引
|
||
cur.execute(
|
||
"SELECT indexname FROM pg_indexes "
|
||
"WHERE schemaname='biz' AND indexname='idx_coach_tasks_site_assistant_member_type'"
|
||
)
|
||
idx = cur.fetchone()
|
||
print(f"部分唯一索引: {'存在' if idx else '不存在'}")
|
||
assert idx, "idx_coach_tasks_site_assistant_member_type 不存在"
|
||
|
||
conn.commit()
|
||
print("\n最终验证全部通过 ✓")
|
||
finally:
|
||
conn.close()
|