59 lines
2.1 KiB
Python
59 lines
2.1 KiB
Python
|
|
"""只读比对脚本:逐列比对 pms_dev(测试) 与 pms(生产) 的**全部**列定义
|
|||
|
|
|
|||
|
|
比对维度:COLUMN_TYPE / IS_NULLABLE / COLUMN_DEFAULT / EXTRA / COLUMN_COMMENT
|
|||
|
|
另外单独统计两库是否还残留 `TIMESTAMP` 列(本项目禁止:sqlx 只能把它解码成 DateTime<Utc>,
|
|||
|
|
而 Rust 侧时间列全是 NaiveDateTime/Option<NaiveDateTime> ⇒ 接口 500)。
|
|||
|
|
|
|||
|
|
用法: python .tmp-schema-align/compare_full.py
|
|||
|
|
只发 SELECT,不做任何写入。
|
|||
|
|
"""
|
|||
|
|
import pymysql
|
|||
|
|
|
|||
|
|
COLSQL = """
|
|||
|
|
SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE,
|
|||
|
|
IFNULL(CAST(COLUMN_DEFAULT AS CHAR),'<NULL>'),
|
|||
|
|
IFNULL(CAST(EXTRA AS CHAR),''),
|
|||
|
|
IFNULL(CAST(COLUMN_COMMENT AS CHAR),'')
|
|||
|
|
FROM information_schema.COLUMNS
|
|||
|
|
WHERE TABLE_SCHEMA=%s AND TABLE_NAME IN (
|
|||
|
|
SELECT TABLE_NAME FROM information_schema.TABLES
|
|||
|
|
WHERE TABLE_SCHEMA=%s AND TABLE_TYPE='BASE TABLE')
|
|||
|
|
ORDER BY TABLE_NAME, ORDINAL_POSITION
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
|
|||
|
|
def snap(db):
|
|||
|
|
c = pymysql.connect(host="10.8.0.252", user="root", password="Hbhyg731024@", database=db)
|
|||
|
|
cur = c.cursor()
|
|||
|
|
cur.execute(COLSQL, (db, db))
|
|||
|
|
rows = {(r[0], r[1]): r[2:] for r in cur.fetchall()}
|
|||
|
|
c.close()
|
|||
|
|
return rows
|
|||
|
|
|
|||
|
|
|
|||
|
|
dev, prd = snap("pms_dev"), snap("pms")
|
|||
|
|
keys = sorted(set(dev) | set(prd))
|
|||
|
|
|
|||
|
|
print("=" * 118)
|
|||
|
|
print("两库列定义比对:pms_dev(测试) vs pms(生产) 共 %d 列" % len(keys))
|
|||
|
|
print("=" * 118)
|
|||
|
|
diffs = []
|
|||
|
|
for k in keys:
|
|||
|
|
d, p = dev.get(k), prd.get(k)
|
|||
|
|
if d != p:
|
|||
|
|
diffs.append((k, d, p))
|
|||
|
|
|
|||
|
|
if not diffs:
|
|||
|
|
print("✅ 全部 %d 列的 类型/可空性/默认值/EXTRA/注释 完全一致" % len(keys))
|
|||
|
|
else:
|
|||
|
|
print("❌ 仍有 %d 列不一致:" % len(diffs))
|
|||
|
|
for k, d, p in diffs:
|
|||
|
|
print(" %-32s dev=%s" % (f"{k[0]}.{k[1]}", d))
|
|||
|
|
print(" %-32s prd=%s" % ("", p))
|
|||
|
|
|
|||
|
|
print()
|
|||
|
|
ts_dev = sorted(k for k, v in dev.items() if v[0].startswith("timestamp"))
|
|||
|
|
ts_prd = sorted(k for k, v in prd.items() if v[0].startswith("timestamp"))
|
|||
|
|
print("pms_dev 残留 TIMESTAMP 列: %d %s" % (len(ts_dev), [f"{t}.{c}" for t, c in ts_dev]))
|
|||
|
|
print("pms 残留 TIMESTAMP 列: %d %s" % (len(ts_prd), [f"{t}.{c}" for t, c in ts_prd]))
|