264 lines
8.1 KiB
Python
264 lines
8.1 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
将 compressed_group_time_issues.json 数据导入到 MySQL 数据库
|
|
"""
|
|
|
|
import json
|
|
import mysql.connector
|
|
from mysql.connector import Error
|
|
|
|
|
|
# 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 文档',
|
|
|
|
-- 索引
|
|
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 {}
|
|
|
|
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')
|
|
}
|
|
|
|
|
|
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
|
|
) VALUES (
|
|
%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']
|
|
)
|
|
|
|
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
|
|
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("-" * 50)
|
|
|
|
cursor.close()
|
|
except Error as e:
|
|
print(f"验证数据失败:{e}")
|
|
|
|
|
|
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)
|
|
|
|
# 关闭连接
|
|
connection.close()
|
|
print("\n数据库连接已关闭")
|
|
print("=" * 60)
|
|
print("导入完成!")
|
|
print("=" * 60)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|