179 lines
8.1 KiB
Python
179 lines
8.1 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
直接創建資料表腳本
|
|
"""
|
|
|
|
import pymysql
|
|
|
|
def create_tables():
|
|
"""創建所有需要的資料表"""
|
|
|
|
# 資料表 DDL
|
|
tables = {
|
|
'dt_users': '''
|
|
CREATE TABLE IF NOT EXISTS dt_users (
|
|
id INT PRIMARY KEY AUTO_INCREMENT,
|
|
username VARCHAR(100) NOT NULL UNIQUE COMMENT 'AD帳號',
|
|
display_name VARCHAR(200) NOT NULL COMMENT '顯示名稱',
|
|
email VARCHAR(255) NOT NULL COMMENT '電子郵件',
|
|
department VARCHAR(100) COMMENT '部門',
|
|
is_admin BOOLEAN DEFAULT FALSE COMMENT '是否為管理員',
|
|
last_login TIMESTAMP NULL COMMENT '最後登入時間',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_username (username),
|
|
INDEX idx_email (email)
|
|
) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
''',
|
|
|
|
'dt_translation_jobs': '''
|
|
CREATE TABLE IF NOT EXISTS dt_translation_jobs (
|
|
id INT PRIMARY KEY AUTO_INCREMENT,
|
|
job_uuid VARCHAR(36) NOT NULL UNIQUE COMMENT '任務唯一識別碼',
|
|
user_id INT NOT NULL COMMENT '使用者ID',
|
|
original_filename VARCHAR(500) NOT NULL COMMENT '原始檔名',
|
|
file_extension VARCHAR(10) NOT NULL COMMENT '檔案副檔名',
|
|
file_size BIGINT NOT NULL COMMENT '檔案大小(bytes)',
|
|
file_path VARCHAR(1000) NOT NULL COMMENT '檔案路徑',
|
|
source_language VARCHAR(50) DEFAULT NULL COMMENT '來源語言',
|
|
target_languages JSON NOT NULL COMMENT '目標語言陣列',
|
|
status ENUM('PENDING', 'PROCESSING', 'COMPLETED', 'FAILED', 'RETRY') DEFAULT 'PENDING',
|
|
progress DECIMAL(5,2) DEFAULT 0.00 COMMENT '處理進度(%)',
|
|
retry_count INT DEFAULT 0 COMMENT '重試次數',
|
|
error_message TEXT NULL COMMENT '錯誤訊息',
|
|
total_tokens INT DEFAULT 0 COMMENT '總token數',
|
|
total_cost DECIMAL(10,4) DEFAULT 0.0000 COMMENT '總成本',
|
|
processing_started_at TIMESTAMP NULL COMMENT '開始處理時間',
|
|
completed_at TIMESTAMP NULL COMMENT '完成時間',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_user_id (user_id),
|
|
INDEX idx_job_uuid (job_uuid),
|
|
INDEX idx_status (status),
|
|
INDEX idx_created_at (created_at),
|
|
FOREIGN KEY (user_id) REFERENCES dt_users(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
''',
|
|
|
|
'dt_job_files': '''
|
|
CREATE TABLE IF NOT EXISTS dt_job_files (
|
|
id INT PRIMARY KEY AUTO_INCREMENT,
|
|
job_id INT NOT NULL COMMENT '任務ID',
|
|
file_type ENUM('ORIGINAL', 'TRANSLATED') NOT NULL COMMENT '檔案類型',
|
|
language_code VARCHAR(50) NULL COMMENT '語言代碼(翻譯檔案)',
|
|
filename VARCHAR(500) NOT NULL COMMENT '檔案名稱',
|
|
file_path VARCHAR(1000) NOT NULL COMMENT '檔案路徑',
|
|
file_size BIGINT NOT NULL COMMENT '檔案大小',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_job_id (job_id),
|
|
INDEX idx_file_type (file_type),
|
|
FOREIGN KEY (job_id) REFERENCES dt_translation_jobs(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
''',
|
|
|
|
'dt_translation_cache': '''
|
|
CREATE TABLE IF NOT EXISTS dt_translation_cache (
|
|
id INT PRIMARY KEY AUTO_INCREMENT,
|
|
source_text_hash VARCHAR(64) NOT NULL COMMENT '來源文字hash',
|
|
source_language VARCHAR(50) NOT NULL COMMENT '來源語言',
|
|
target_language VARCHAR(50) NOT NULL COMMENT '目標語言',
|
|
source_text TEXT NOT NULL COMMENT '來源文字',
|
|
translated_text TEXT NOT NULL COMMENT '翻譯文字',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE KEY uk_cache (source_text_hash, source_language, target_language),
|
|
INDEX idx_languages (source_language, target_language)
|
|
) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
''',
|
|
|
|
'dt_api_usage_stats': '''
|
|
CREATE TABLE IF NOT EXISTS dt_api_usage_stats (
|
|
id INT PRIMARY KEY AUTO_INCREMENT,
|
|
user_id INT NOT NULL COMMENT '使用者ID',
|
|
job_id INT NULL COMMENT '任務ID',
|
|
api_endpoint VARCHAR(200) NOT NULL COMMENT 'API端點',
|
|
prompt_tokens INT DEFAULT 0 COMMENT 'Prompt token數',
|
|
completion_tokens INT DEFAULT 0 COMMENT 'Completion token數',
|
|
total_tokens INT DEFAULT 0 COMMENT '總token數',
|
|
prompt_unit_price DECIMAL(10,8) DEFAULT 0.00000000 COMMENT '單價',
|
|
prompt_price_unit VARCHAR(20) DEFAULT 'USD' COMMENT '價格單位',
|
|
cost DECIMAL(10,4) DEFAULT 0.0000 COMMENT '成本',
|
|
response_time_ms INT DEFAULT 0 COMMENT '回應時間(毫秒)',
|
|
success BOOLEAN DEFAULT TRUE COMMENT '是否成功',
|
|
error_message TEXT NULL COMMENT '錯誤訊息',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_user_id (user_id),
|
|
INDEX idx_job_id (job_id),
|
|
INDEX idx_created_at (created_at),
|
|
FOREIGN KEY (user_id) REFERENCES dt_users(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (job_id) REFERENCES dt_translation_jobs(id) ON DELETE SET NULL
|
|
) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
''',
|
|
|
|
'dt_system_logs': '''
|
|
CREATE TABLE IF NOT EXISTS dt_system_logs (
|
|
id INT PRIMARY KEY AUTO_INCREMENT,
|
|
level ENUM('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL') NOT NULL,
|
|
module VARCHAR(100) NOT NULL COMMENT '模組名稱',
|
|
user_id INT NULL COMMENT '使用者ID',
|
|
job_id INT NULL COMMENT '任務ID',
|
|
message TEXT NOT NULL COMMENT '日誌訊息',
|
|
extra_data JSON NULL COMMENT '額外資料',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_level (level),
|
|
INDEX idx_module (module),
|
|
INDEX idx_user_id (user_id),
|
|
INDEX idx_created_at (created_at),
|
|
FOREIGN KEY (user_id) REFERENCES dt_users(id) ON DELETE SET NULL,
|
|
FOREIGN KEY (job_id) REFERENCES dt_translation_jobs(id) ON DELETE SET NULL
|
|
) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
'''
|
|
}
|
|
|
|
try:
|
|
# 建立資料庫連線
|
|
connection = pymysql.connect(
|
|
host='mysql.theaken.com',
|
|
port=33306,
|
|
user='A060',
|
|
password='WLeSCi0yhtc7',
|
|
database='db_A060',
|
|
charset='utf8mb4'
|
|
)
|
|
|
|
cursor = connection.cursor()
|
|
|
|
print("Creating database tables...")
|
|
|
|
# 依序創建表格
|
|
for table_name, sql in tables.items():
|
|
print(f"Creating table: {table_name}")
|
|
cursor.execute(sql)
|
|
print(f" - {table_name} created successfully")
|
|
|
|
# 創建預設管理員用戶
|
|
print("\nCreating default admin user...")
|
|
admin_sql = '''
|
|
INSERT IGNORE INTO dt_users (username, display_name, email, department, is_admin)
|
|
VALUES ('ymirliu', 'ymirliu', 'ymirliu@panjit.com.tw', 'IT', TRUE)
|
|
'''
|
|
cursor.execute(admin_sql)
|
|
|
|
if cursor.rowcount > 0:
|
|
print(" - Default admin user created")
|
|
else:
|
|
print(" - Default admin user already exists")
|
|
|
|
# 提交更改
|
|
connection.commit()
|
|
connection.close()
|
|
|
|
print("\n=== Database initialization completed ===")
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"Database initialization failed: {e}")
|
|
return False
|
|
|
|
if __name__ == '__main__':
|
|
create_tables() |