83 lines
2.9 KiB
Python
83 lines
2.9 KiB
Python
"""
|
||
扫描所有模板,找出所有引用的 PostgreSQL 表,列出哪些已导出 GPKG、哪些还没。
|
||
"""
|
||
import zipfile, re, os, sys
|
||
|
||
TEMPLATE_BASE = os.path.join(
|
||
os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
|
||
"app", "data", "template"
|
||
)
|
||
|
||
# 当前已导出的 GPKG 表(从 qgis_mappings.py / export_static_layers.py)
|
||
EXPORTED = {
|
||
"rivers", "sx_capital", "river", "active_fault", "sx",
|
||
"sx_street", "sx_xa_county", "sx_xa_county_boundary",
|
||
"sx_zb_county_boundary", "sx_zb_city", "sx_zb_county",
|
||
"traffic_expressway", "traffic_provincial", "traffic_railway",
|
||
"traffic_township", "traffic_trunk_line",
|
||
}
|
||
|
||
# 避难场所 OGR→PG 映射的表(已由 TemplateModifier 转换)
|
||
OGR_TABLES = {
|
||
"shelter_park", "shelter_school", "shelter_cultural",
|
||
"shelter_defence", "shelter_gymnasium", "shelter_square", "shelter_stay",
|
||
}
|
||
|
||
all_tables = {} # {table_name: set of templates}
|
||
|
||
for event_type in ["rainfall", "earthquake"]:
|
||
tdir = os.path.join(TEMPLATE_BASE, event_type)
|
||
if not os.path.isdir(tdir):
|
||
continue
|
||
for tf in sorted(os.listdir(tdir)):
|
||
if not tf.endswith(".qgz") or tf.startswith("tmp"):
|
||
continue
|
||
tpath = os.path.join(tdir, tf)
|
||
with zipfile.ZipFile(tpath, "r") as z:
|
||
for item in z.infolist():
|
||
if item.filename.endswith(".qgs"):
|
||
content = z.read(item.filename).decode("utf-8")
|
||
# 匹配 datasource 中的 table="schema"."name"
|
||
for m in re.finditer(r'table="(\w+)"\."(\w+)"', content):
|
||
tbl = m.group(2)
|
||
all_tables.setdefault(tbl, set()).add(tf)
|
||
# 也检查 provider=postgres 但没有 table= 的(如震中)
|
||
# 匹配 dbname='...' 格式
|
||
for m in re.finditer(r"dbname='([^']+)'", content):
|
||
db = m.group(1)
|
||
if db == 'xxgx_client_ya':
|
||
all_tables.setdefault(f"[外部DB: {db}]", set()).add(tf)
|
||
|
||
print("=" * 60)
|
||
print("已导出 GPKG (16):")
|
||
for t in sorted(EXPORTED):
|
||
if t in all_tables:
|
||
print(f" ✅ {t}")
|
||
print()
|
||
|
||
print("避难场所 OGR→PG (7):")
|
||
for t in sorted(OGR_TABLES):
|
||
print(f" ✅ {t}")
|
||
print()
|
||
|
||
print("未导出,需要新增:")
|
||
need_export = []
|
||
for tbl, tmps in sorted(all_tables.items()):
|
||
if tbl.startswith("[外部DB:"):
|
||
continue
|
||
if tbl in EXPORTED or tbl in OGR_TABLES:
|
||
continue
|
||
need_export.append(tbl)
|
||
print(f" ❌ {tbl} ← {', '.join(sorted(tmps))}")
|
||
print()
|
||
|
||
print("外部数据库(无法静态化):")
|
||
for tbl, tmps in sorted(all_tables.items()):
|
||
if tbl.startswith("[外部DB:"):
|
||
print(f" 🔗 {tbl} ← {', '.join(sorted(tmps))}")
|
||
print()
|
||
|
||
print(f"总结: 需要新增导出 {len(need_export)} 张表")
|
||
if need_export:
|
||
print(f" {', '.join(sorted(need_export))}")
|