#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 将 compressed_group_time_issues.json 数据导入到 MySQL 数据库 """ import json import mysql.connector from mysql.connector import Error import re from datetime import datetime from pathlib import Path # MySQL 连接配置 DB_CONFIG = { 'host': '127.0.0.1', 'port': 3306, 'user': 'root', 'password': 'root123456', 'database': 'testdb', 'charset': 'utf8mb4' } # JSON 文件路径 JSON_FILE_PATH = 'server/jsons/compressed_group_time_issues.json' # 建表 SQL CREATE_TABLE_SQL = """ CREATE TABLE IF NOT EXISTS compressed_group_time_issues ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键', row_index INT COMMENT '行索引', -- Group1 字段 group1_latest_extracted_mtime DOUBLE COMMENT 'group1 最新提取文件的 mtime', group1_title VARCHAR(1000) COMMENT 'group1 标题', group1_url VARCHAR(1000) COMMENT 'group1 URL', group1_time VARCHAR(100) COMMENT 'group1 时间', group1_file_name VARCHAR(1000) COMMENT 'group1 第一个文件名', group1_file_mtime DOUBLE COMMENT 'group1 第一个文件 mtime', group1_file_datetime VARCHAR(50) COMMENT 'group1 第一个文件 datetime', -- Group2 字段 group2_latest_extracted_mtime DOUBLE COMMENT 'group2 最新提取文件的 mtime', group2_title VARCHAR(1000) COMMENT 'group2 标题', group2_url VARCHAR(1000) COMMENT 'group2 URL', group2_time VARCHAR(100) COMMENT 'group2 时间', group2_file_name VARCHAR(1000) COMMENT 'group2 第一个文件名', group2_file_mtime DOUBLE COMMENT 'group2 第一个文件 mtime', group2_file_datetime VARCHAR(50) COMMENT 'group2 第一个文件 datetime', -- 来源信息 source_folder VARCHAR(500) COMMENT '来源文件夹', word_doc VARCHAR(500) COMMENT '关联的 word 文档', -- 新增字段 21cn_son_file_datetime VARCHAR(50) COMMENT 'group1_latest_extracted_mtime 的日期时间格式', xkw_son_file_datetime VARCHAR(50) COMMENT 'group2_latest_extracted_mtime 的日期时间格式', 21ID VARCHAR(100) COMMENT 'group1_url 中的数字部分', xkwID VARCHAR(100) COMMENT 'group2_url 中的数字部分', -- 索引 INDEX idx_row_index (row_index), INDEX idx_source_folder (source_folder) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='压缩组时间问题数据表'; """ def create_connection(): """创建数据库连接""" try: connection = mysql.connector.connect(**DB_CONFIG) if connection.is_connected(): print(f"成功连接到 MySQL 数据库") print(f"数据库版本:{connection.get_server_info()}") return connection except Error as e: print(f"连接 MySQL 失败:{e}") return None def create_table(connection): """创建表""" try: cursor = connection.cursor() cursor.execute(CREATE_TABLE_SQL) connection.commit() print("表 'compressed_group_time_issues' 创建成功!") cursor.close() except Error as e: print(f"创建表失败:{e}") def load_json_data(file_path): """加载 JSON 数据""" try: with open(file_path, 'r', encoding='utf-8') as f: data = json.load(f) print(f"成功加载 JSON 文件,共 {len(data)} 条记录") return data except FileNotFoundError: print(f"文件不存在:{file_path}") return None except json.JSONDecodeError as e: print(f"JSON 解析错误:{e}") return None def flatten_record(record): """ 扁平化记录 """ # 获取 group1 的第一个文件 group1_files = record.get('group1', {}).get('files', []) group1_first_file = group1_files[0] if group1_files else {} # 获取 group2 的第一个文件 group2_files = record.get('group2', {}).get('files', []) group2_first_file = group2_files[0] if group2_files else {} # 计算新字段 group1_mtime = record.get('group1_latest_extracted_mtime') group1_datetime = datetime.fromtimestamp(group1_mtime).strftime('%Y-%m-%d %H:%M:%S') if group1_mtime else None group2_mtime = record.get('group2_latest_extracted_mtime') group2_datetime = datetime.fromtimestamp(group2_mtime).strftime('%Y-%m-%d %H:%M:%S') if group2_mtime else None group1_url = record.get('group1', {}).get('url', '') group1_id = None if group1_url: match = re.search(r'/(\d+)\.shtml$', group1_url) if match: group1_id = match.group(1) group2_url = record.get('group2', {}).get('url', '') group2_id = None if group2_url: match = re.search(r'/(\d+)\.html$', group2_url) if match: group2_id = match.group(1) return { 'row_index': record.get('row_index'), # Group1 字段 'group1_latest_extracted_mtime': record.get('group1_latest_extracted_mtime'), 'group1_title': record.get('group1', {}).get('title'), 'group1_url': record.get('group1', {}).get('url'), 'group1_time': record.get('group1', {}).get('time'), 'group1_file_name': group1_first_file.get('name'), 'group1_file_mtime': group1_first_file.get('mtime'), 'group1_file_datetime': group1_first_file.get('datetime'), # Group2 字段 'group2_latest_extracted_mtime': record.get('group2_latest_extracted_mtime'), 'group2_title': record.get('group2', {}).get('title'), 'group2_url': record.get('group2', {}).get('url'), 'group2_time': record.get('group2', {}).get('time'), 'group2_file_name': group2_first_file.get('name'), 'group2_file_mtime': group2_first_file.get('mtime'), 'group2_file_datetime': group2_first_file.get('datetime'), # 来源信息 'source_folder': record.get('source_folder'), 'word_doc': record.get('word_doc'), # 新增字段 '21cn_son_file_datetime': group1_datetime, 'xkw_son_file_datetime': group2_datetime, '21ID': group1_id, 'xkwID': group2_id } def insert_data(connection, data): """插入数据""" insert_sql = """ INSERT INTO compressed_group_time_issues ( row_index, group1_latest_extracted_mtime, group1_title, group1_url, group1_time, group1_file_name, group1_file_mtime, group1_file_datetime, group2_latest_extracted_mtime, group2_title, group2_url, group2_time, group2_file_name, group2_file_mtime, group2_file_datetime, source_folder, word_doc, 21cn_son_file_datetime, xkw_son_file_datetime, 21ID, xkwID ) VALUES ( %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s ) """ try: cursor = connection.cursor() inserted_count = 0 for record in data: flattened = flatten_record(record) values = ( flattened['row_index'], flattened['group1_latest_extracted_mtime'], flattened['group1_title'], flattened['group1_url'], flattened['group1_time'], flattened['group1_file_name'], flattened['group1_file_mtime'], flattened['group1_file_datetime'], flattened['group2_latest_extracted_mtime'], flattened['group2_title'], flattened['group2_url'], flattened['group2_time'], flattened['group2_file_name'], flattened['group2_file_mtime'], flattened['group2_file_datetime'], flattened['source_folder'], flattened['word_doc'], flattened['21cn_son_file_datetime'], flattened['xkw_son_file_datetime'], flattened['21ID'], flattened['xkwID'] ) cursor.execute(insert_sql, values) inserted_count += 1 if inserted_count % 50 == 0: print(f"已插入 {inserted_count} 条记录...") connection.commit() print(f"成功插入 {inserted_count} 条记录!") cursor.close() return inserted_count except Error as e: print(f"插入数据失败:{e}") connection.rollback() return 0 def verify_data(connection): """验证导入的数据""" try: cursor = connection.cursor() # 查询总记录数 cursor.execute("SELECT COUNT(*) FROM compressed_group_time_issues") count = cursor.fetchone()[0] print(f"\n验证:表中总记录数 = {count}") # 查询前 2 条记录作为示例 cursor.execute(""" SELECT row_index, group1_title, group2_title, source_folder, 21cn_son_file_datetime, xkw_son_file_datetime, 21ID, xkwID FROM compressed_group_time_issues LIMIT 2 """) rows = cursor.fetchall() print("\n示例数据:") for row in rows: print(f" row_index={row[0]}") print(f" group1_title={row[1][:50]}...") print(f" group2_title={row[2][:50]}...") print(f" source_folder={row[3]}") print(f" 21cn_son_file_datetime={row[4]}") print(f" xkw_son_file_datetime={row[5]}") print(f" 21ID={row[6]}") print(f" xkwID={row[7]}") print("-" * 50) cursor.close() except Error as e: print(f"验证数据失败:{e}") def export_table_to_excel(connection, output_path: Path): """将数据库表导出为 Excel 文件""" try: import pandas as pd except ImportError: print("请先安装 pandas 和 openpyxl:pip install pandas openpyxl") return False try: cursor = connection.cursor() cursor.execute("SELECT * FROM compressed_group_time_issues") rows = cursor.fetchall() columns = cursor.column_names cursor.close() df = pd.DataFrame(rows, columns=columns) output_path.parent.mkdir(parents=True, exist_ok=True) df.to_excel(output_path, index=False) print(f"成功导出 Excel 文件:{output_path}") return True except Exception as e: print(f"导出 Excel 失败:{e}") return False def main(): """主函数""" print("=" * 60) print("开始导入 compressed_group_time_issues.json 到 MySQL") print("=" * 60) # 1. 创建数据库连接 connection = create_connection() if not connection: return # 2. 创建表 create_table(connection) # 3. 加载 JSON 数据 data = load_json_data(JSON_FILE_PATH) if not data: connection.close() return # 4. 插入数据 insert_data(connection, data) # 5. 验证数据 verify_data(connection) # 6. 导出 Excel excel_path = Path('server/jsons/compressed_group_time_issues.xlsx') export_table_to_excel(connection, excel_path) # 关闭连接 connection.close() print("\n数据库连接已关闭") print("=" * 60) print("导入完成!") print("=" * 60) if __name__ == '__main__': main()