copy_table_same_columns.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. """
  2. 从一张表查询,插入另一张表(两表字段一致)。
  3. 用法:改下面 SOURCE_TABLE / TARGET_TABLE,在项目根执行:
  4. python ceshi/copy_table_same_columns.py
  5. 逻辑:读 information_schema 取源表列顺序,与目标表取交集后
  6. INSERT INTO 目标 SELECT 相同列 FROM 源(一条 SQL,由 MySQL 搬运数据)。
  7. """
  8. from commons.conn_mysql import MySQLPoolOnline
  9. # 修改为你要复制的表名(同一库 drug_retrieve)
  10. SOURCE_TABLE = "jd_provider_tmp"
  11. TARGET_TABLE = "retrieve_yjj_shop_info_middle"
  12. # True:重复键忽略(需表上有唯一索引);False:普通 INSERT,冲突则报错
  13. USE_INSERT_IGNORE = True
  14. # 若共同列中含 platform,用该数字覆盖源表;设为 None 则仍从源表读 platform
  15. FIXED_PLATFORM_VALUE = 7
  16. def _columns(conn, table: str) -> list:
  17. rows = conn.select_data(
  18. """
  19. SELECT COLUMN_NAME AS COLUMN_NAME
  20. FROM information_schema.COLUMNS
  21. WHERE TABLE_SCHEMA = DATABASE()
  22. AND TABLE_NAME = %s
  23. ORDER BY ORDINAL_POSITION
  24. """,
  25. (table,),
  26. )
  27. if not rows:
  28. return []
  29. return [r["COLUMN_NAME"] for r in rows]
  30. def main():
  31. conn = MySQLPoolOnline()
  32. src_cols = _columns(conn, SOURCE_TABLE)
  33. tgt_cols = _columns(conn, TARGET_TABLE)
  34. if not src_cols:
  35. print(f"源表不存在或无字段: {SOURCE_TABLE}")
  36. return
  37. if not tgt_cols:
  38. print(f"目标表不存在或无字段: {TARGET_TABLE}")
  39. return
  40. tgt_set = set(tgt_cols)
  41. common = [c for c in src_cols if c in tgt_set and c != "id"]
  42. if not common:
  43. print("源表与目标表无共同字段")
  44. return
  45. only_src = [c for c in src_cols if c not in tgt_set]
  46. only_tgt = [c for c in tgt_cols if c not in set(src_cols)]
  47. if only_src:
  48. print(f"提示:源表多出的列(目标表无,已跳过): {only_src}")
  49. if only_tgt:
  50. print(f"提示:目标表多出的列(本次不写入,走默认值): {only_tgt}")
  51. cols_sql = ", ".join(f"`{c}`" for c in common)
  52. select_parts = []
  53. for c in common:
  54. if c == "platform" and FIXED_PLATFORM_VALUE is not None:
  55. select_parts.append(str(int(FIXED_PLATFORM_VALUE)))
  56. else:
  57. select_parts.append(f"`{c}`")
  58. select_sql = ", ".join(select_parts)
  59. kw = "INSERT IGNORE" if USE_INSERT_IGNORE else "INSERT"
  60. sql = f"{kw} INTO `{TARGET_TABLE}` ({cols_sql}) SELECT {select_sql} FROM `{SOURCE_TABLE}`"
  61. n = conn.execute(sql)
  62. print(f"执行完成: {sql.strip()[:120]}...")
  63. print(f"受影响行数: {n}")
  64. if __name__ == "__main__":
  65. main()