159 lines
5.1 KiB
Python
159 lines
5.1 KiB
Python
"""Build the single-file model_operations schema from versioned modules."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
BASE = Path(__file__).parent
|
|
SOURCE_DIR = BASE / "model_operations-V0.1"
|
|
OUTPUT = BASE / "model_operations-完整建表-V0.1.sql"
|
|
SOURCES = [
|
|
"10_reference_and_models.sql",
|
|
"20_monitoring_source.sql",
|
|
"30_governance_and_reviews.sql",
|
|
"40_reports_and_prompts.sql",
|
|
"50_workflows_documents_usage.sql",
|
|
]
|
|
|
|
|
|
def statements(text: str) -> list[str]:
|
|
"""Split SQL safely enough for quotes/backticks and strip line comments."""
|
|
output: list[str] = []
|
|
current: list[str] = []
|
|
quote: str | None = None
|
|
line_comment = False
|
|
index = 0
|
|
while index < len(text):
|
|
char = text[index]
|
|
next_char = text[index + 1] if index + 1 < len(text) else ""
|
|
if line_comment:
|
|
if char == "\n":
|
|
line_comment = False
|
|
current.append(" ")
|
|
index += 1
|
|
continue
|
|
if quote is None and char == "-" and next_char == "-":
|
|
line_comment = True
|
|
index += 2
|
|
continue
|
|
if quote:
|
|
current.append(char)
|
|
if char == quote:
|
|
if quote == "'" and next_char == "'":
|
|
current.append(next_char)
|
|
index += 2
|
|
continue
|
|
quote = None
|
|
index += 1
|
|
continue
|
|
if char in ("'", "`"):
|
|
quote = char
|
|
current.append(char)
|
|
elif char == ";":
|
|
statement = " ".join("".join(current).split())
|
|
if statement:
|
|
output.append(statement + ";")
|
|
current = []
|
|
else:
|
|
current.append(char)
|
|
index += 1
|
|
tail = " ".join("".join(current).split())
|
|
if tail:
|
|
output.append(tail + ";")
|
|
return output
|
|
|
|
|
|
def format_create_table(statement: str) -> str:
|
|
"""Format one CREATE TABLE compactly while keeping DBeaver-friendly lines."""
|
|
open_at = statement.find("(")
|
|
if open_at < 0:
|
|
return statement
|
|
quote: str | None = None
|
|
depth = 0
|
|
close_at = -1
|
|
for index in range(open_at, len(statement)):
|
|
char = statement[index]
|
|
next_char = statement[index + 1] if index + 1 < len(statement) else ""
|
|
if quote:
|
|
if char == quote:
|
|
if quote == "'" and next_char == "'":
|
|
continue
|
|
quote = None
|
|
continue
|
|
if char in ("'", "`"):
|
|
quote = char
|
|
elif char == "(":
|
|
depth += 1
|
|
elif char == ")":
|
|
depth -= 1
|
|
if depth == 0:
|
|
close_at = index
|
|
break
|
|
if close_at < 0:
|
|
return statement
|
|
body = statement[open_at + 1 : close_at]
|
|
parts: list[str] = []
|
|
current: list[str] = []
|
|
quote = None
|
|
depth = 0
|
|
for index, char in enumerate(body):
|
|
next_char = body[index + 1] if index + 1 < len(body) else ""
|
|
if quote:
|
|
current.append(char)
|
|
if char == quote:
|
|
if quote == "'" and next_char == "'":
|
|
continue
|
|
quote = None
|
|
continue
|
|
if char in ("'", "`"):
|
|
quote = char
|
|
current.append(char)
|
|
elif char == "(":
|
|
depth += 1
|
|
current.append(char)
|
|
elif char == ")":
|
|
depth -= 1
|
|
current.append(char)
|
|
elif char == "," and depth == 0:
|
|
parts.append(" ".join("".join(current).split()))
|
|
current = []
|
|
else:
|
|
current.append(char)
|
|
tail_part = " ".join("".join(current).split())
|
|
if tail_part:
|
|
parts.append(tail_part)
|
|
lines = [statement[:open_at].rstrip() + " ("]
|
|
for index in range(0, len(parts), 2):
|
|
chunk = ", ".join(parts[index : index + 2])
|
|
if index + 2 < len(parts):
|
|
chunk += ","
|
|
lines.append(" " + chunk)
|
|
lines.append(") " + statement[close_at + 1 :].strip())
|
|
return "\n".join(lines)
|
|
|
|
|
|
def main() -> None:
|
|
bundled: list[str] = [
|
|
"-- A 卡模型智能运维平台 · model_operations 完整建表 V0.1",
|
|
"-- 内容:仅包含新库的 24 张表,不含建库、视图、种子数据或 model_platform 现有表。",
|
|
"-- 执行前:请在 DBeaver 中选中 model_operations 作为当前活动数据库。",
|
|
"-- DBeaver:请使用“执行 SQL 脚本”(Alt/Option + X),不要选中全文后按 Ctrl/Cmd + Enter。",
|
|
"-- 如使用“执行 SQL 语句”,每次只能选中一条 CREATE TABLE 单独执行。",
|
|
"",
|
|
]
|
|
for source_name in SOURCES:
|
|
source_statements = statements((SOURCE_DIR / source_name).read_text(encoding="utf-8"))
|
|
bundled.append(f"-- ===== {source_name} =====")
|
|
for statement in source_statements:
|
|
if not statement.lower().startswith("create table "):
|
|
continue
|
|
bundled.append(format_create_table(statement))
|
|
bundled.append("")
|
|
OUTPUT.write_text("\n".join(bundled).rstrip() + "\n", encoding="utf-8")
|
|
print(f"built {OUTPUT.name}: 24 tables")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|