75 lines
2.2 KiB
Python
75 lines
2.2 KiB
Python
"""补齐 breeding 全部建表(幂等,逐句隔离)。
|
||
|
||
用正则按顶层 SQL 关键字(CREATE TABLE / CREATE INDEX / COMMENT ON / ALTER TABLE ...)
|
||
切分,避免部分 CREATE TABLE 不以分号结尾导致多表被合并成一条语句的问题。
|
||
每张 CREATE TABLE 成功/失败均打印表名与真实异常(repr 保证 ascii 安全)。
|
||
"""
|
||
import re
|
||
from pathlib import Path
|
||
|
||
from sqlalchemy import text
|
||
|
||
from app.core.database import engine
|
||
|
||
SQL_PATH = Path(r"d:\dpb\dpb\backend\sql\bre_tables.sql")
|
||
|
||
CHECK_TABLES = [
|
||
"bre_trait", "bre_tree", "bre_germplasm",
|
||
"bre_prediction", "bre_prediction_value",
|
||
"bre_combining_ability", "bre_statistics_job",
|
||
]
|
||
|
||
|
||
def classify(s: str) -> str:
|
||
u = s.upper()
|
||
if u.startswith("CREATE TABLE"):
|
||
return "CREATE"
|
||
if "CREATE INDEX" in u:
|
||
return "IDX"
|
||
if u.startswith("COMMENT"):
|
||
return "CMT"
|
||
return "OTHER"
|
||
|
||
|
||
def main() -> None:
|
||
sql = SQL_PATH.read_text(encoding="utf-8")
|
||
parts = re.split(
|
||
r"(?=(?:CREATE TABLE|CREATE INDEX|COMMENT ON|ALTER TABLE|DROP TABLE|DROP INDEX))",
|
||
sql,
|
||
flags=re.IGNORECASE,
|
||
)
|
||
stmts: list[str] = []
|
||
for p in parts:
|
||
s = p.strip().rstrip(";").strip()
|
||
if s and not s.startswith("--"):
|
||
stmts.append(s)
|
||
|
||
ok = fail = 0
|
||
with engine.connect() as conn:
|
||
for s in stmts:
|
||
kind = classify(s)
|
||
try:
|
||
conn.execute(text(s))
|
||
conn.commit()
|
||
ok += 1
|
||
if kind == "CREATE":
|
||
m = re.search(r"breed_\w+", s)
|
||
print("CREATE OK", m.group(0) if m else s[:30])
|
||
except Exception as e: # noqa: BLE001
|
||
conn.rollback()
|
||
fail += 1
|
||
if kind in ("CREATE", "IDX", "CMT"):
|
||
print(kind, "FAIL", s[:38].replace("\n", " "), "|", repr(e)[:140])
|
||
with engine.connect() as conn:
|
||
for t in CHECK_TABLES:
|
||
try:
|
||
conn.execute(text(f"select 1 from {t} limit 1"))
|
||
print("EXISTS", t)
|
||
except Exception: # noqa: BLE001
|
||
print("MISSING", t)
|
||
print(f"DDL done: ok={ok} fail={fail}")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|