File size: 2,480 Bytes
08c964e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | import sqlite3
import json
import sys
def get_database_json():
# 读取databases.json的内容
db_json_path = '/www/server/panel/config/databases.json'
with open(db_json_path, 'r', encoding='utf-8') as f:
return json.load(f)
def create_table_if_not_exists(db_obj, table_name, create_table_sql):
# 尝试创建表,如果表不存在
try:
db_obj.execute(create_table_sql)
db_obj.commit()
print(f"【创建表】'{table_name}' 已成功创建。")
except sqlite3.OperationalError as e:
print(f"创建表时出错:{e}")
def check_and_add_missing_fields(db_obj, table_name, field_definitions):
cursor = db_obj.cursor()
# 检查现有字段
cursor.execute(f"PRAGMA table_info({table_name})")
existing_columns = {row[1]: row for row in cursor.fetchall()}
for field_def in field_definitions:
if isinstance(field_def, list) and len(field_def) > 2:
field_name, field_type = field_def[1], field_def[2]
if field_name not in existing_columns:
try:
cursor.execute(f"ALTER TABLE {table_name} ADD COLUMN {field_name} {field_type}")
db_obj.commit()
print(f"【添加字段】表 '{table_name}' 中缺少字段 '{field_name}',已成功添加。")
except sqlite3.OperationalError as e:
print(f"【错误】尝试向表 '{table_name}' 添加字段 '{field_name}' 时出错: {e}")
def update_database_for_table(db_name, table_name):
db_json = get_database_json()
db_dir = '/www/server/panel/data/db'
db_path = f"{db_dir}/{db_name}"
print(f"【处理数据库】正在处理数据库文件:{db_name}")
db_obj = sqlite3.connect(db_path)
if table_name in db_json.get(db_name, {}):
table_info = db_json[db_name][table_name]
print(f"【处理表】正在处理表:{table_name}")
create_table_if_not_exists(db_obj, table_name, table_info['sql'])
check_and_add_missing_fields(db_obj, table_name, table_info['fields'])
else:
print(f"表 '{table_name}' 在数据库 '{db_name}' 的定义中未找到。")
db_obj.close()
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage: python script.py <database_name> <table_name>")
sys.exit(1)
database_name = sys.argv[1]
table_name = sys.argv[2]
update_database_for_table(database_name, table_name)
|