run_organize_menu.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. # -*- coding: utf-8 -*-
  2. import pymysql
  3. DB = dict(
  4. host='cq-cdb-8fjmemkb.sql.tencentcdb.com',
  5. port=27220,
  6. user='root',
  7. password='Ylrz_1q2w3e4r5t6y',
  8. database='ylrz_saas',
  9. charset='utf8mb4',
  10. autocommit=False,
  11. )
  12. FILES = [
  13. r'f:\project\Saas\ylrz_saas_his_scrm\sql\organize_tenant_sys_menu.sql',
  14. r'f:\project\Saas\ylrz_saas_his_scrm\sql\organize_tenant_sys_menu_subtree.sql',
  15. ]
  16. RESTORE_SQL = """
  17. INSERT INTO tenant_sys_menu
  18. SELECT b.*
  19. FROM tenant_sys_menu_bak b
  20. LEFT JOIN tenant_sys_menu t ON t.menu_id = b.menu_id
  21. WHERE t.menu_id IS NULL
  22. """
  23. def load_statements(path):
  24. for enc in ('utf-8', 'utf-8-sig', 'gbk'):
  25. try:
  26. with open(path, 'r', encoding=enc) as f:
  27. content = f.read()
  28. break
  29. except UnicodeDecodeError:
  30. content = None
  31. if content is None:
  32. with open(path, 'r', encoding='utf-8', errors='ignore') as f:
  33. content = f.read()
  34. lines = []
  35. for line in content.splitlines():
  36. if line.strip().startswith('--'):
  37. continue
  38. lines.append(line)
  39. return [p.strip() for p in '\n'.join(lines).split(';') if p.strip()]
  40. def main():
  41. conn = pymysql.connect(**DB)
  42. cur = conn.cursor()
  43. try:
  44. cur.execute('SELECT COUNT(*) FROM tenant_sys_menu')
  45. before = cur.fetchone()[0]
  46. cur.execute(RESTORE_SQL)
  47. restored = cur.rowcount
  48. conn.commit()
  49. cur.execute('SELECT COUNT(*) FROM tenant_sys_menu')
  50. after_restore = cur.fetchone()[0]
  51. print('restore: before=%s restored=%s after=%s' % (before, restored, after_restore))
  52. for fp in FILES:
  53. stmts = load_statements(fp)
  54. affected = 0
  55. for stmt in stmts:
  56. cur.execute(stmt)
  57. affected += cur.rowcount
  58. conn.commit()
  59. print('FILE %s: statements=%s rowcount_sum=%s' % (fp.split('\\')[-1], len(stmts), affected))
  60. checks = [
  61. ('total', 'SELECT COUNT(*) FROM tenant_sys_menu'),
  62. ('visible_roots', "SELECT COUNT(*) FROM tenant_sys_menu WHERE parent_id=0 AND visible='0' AND menu_type='M'"),
  63. ('bad_admin_visible', "SELECT COUNT(*) FROM tenant_sys_menu WHERE component LIKE 'admin/%' AND visible='0'"),
  64. ('sys_35100_children', "SELECT COUNT(*) FROM tenant_sys_menu WHERE parent_id=35100 AND visible='0' AND menu_type<>'F'"),
  65. ('sys_35101_children', "SELECT COUNT(*) FROM tenant_sys_menu WHERE parent_id=35101 AND visible='0' AND menu_type<>'F'"),
  66. ('sys_35106_children', "SELECT COUNT(*) FROM tenant_sys_menu WHERE parent_id=35106 AND visible='0' AND menu_type<>'F'"),
  67. ('qw_35001_children', "SELECT COUNT(*) FROM tenant_sys_menu WHERE parent_id=35001 AND visible='0' AND menu_type<>'F'"),
  68. ('qw_35002_children', "SELECT COUNT(*) FROM tenant_sys_menu WHERE parent_id=35002 AND visible='0' AND menu_type<>'F'"),
  69. ('store_35040_children', "SELECT COUNT(*) FROM tenant_sys_menu WHERE parent_id=35040 AND visible='0' AND menu_type<>'F'"),
  70. ('hidden_hisstore', "SELECT COUNT(*) FROM tenant_sys_menu WHERE menu_id BETWEEN 32591 AND 32643 AND visible='1'"),
  71. ('qw_path_dup', """
  72. SELECT COUNT(*) FROM (
  73. SELECT parent_id, path FROM tenant_sys_menu
  74. WHERE parent_id IN (35001,35002,35003,35004,35005,35006,35007)
  75. AND menu_type <> 'F' AND visible='0'
  76. GROUP BY parent_id, path HAVING COUNT(*)>1
  77. ) t
  78. """),
  79. ('store_path_dup', """
  80. SELECT COUNT(*) FROM (
  81. SELECT parent_id, path FROM tenant_sys_menu
  82. WHERE parent_id IN (35040,35041,35042)
  83. AND menu_type <> 'F' AND visible='0'
  84. GROUP BY parent_id, path HAVING COUNT(*)>1
  85. ) t
  86. """),
  87. ]
  88. print('VERIFY:')
  89. for name, sql in checks:
  90. cur.execute(sql)
  91. print(' %s=%s' % (name, cur.fetchone()[0]))
  92. print('EXEC_OK')
  93. except Exception as e:
  94. conn.rollback()
  95. print('EXEC_FAIL: %s' % e)
  96. raise
  97. finally:
  98. cur.close()
  99. conn.close()
  100. if __name__ == '__main__':
  101. main()