"""只读比对脚本:逐列比对 pms_dev(测试) 与 pms(生产) 的**全部**列定义 比对维度:COLUMN_TYPE / IS_NULLABLE / COLUMN_DEFAULT / EXTRA / COLUMN_COMMENT 另外单独统计两库是否还残留 `TIMESTAMP` 列(本项目禁止:sqlx 只能把它解码成 DateTime, 而 Rust 侧时间列全是 NaiveDateTime/Option ⇒ 接口 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),''), 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]))