#!/usr/bin/env python # -*- coding: utf-8 -*- """ 修复license表结构 """ import sys import os import sqlite3 # 添加项目路径 sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from app import create_app def fix_license_table(): """修复license表结构""" app = create_app() with app.app_context(): try: # 获取数据库路径 db_uri = app.config['SQLALCHEMY_DATABASE_URI'] if db_uri.startswith('sqlite:///'): db_path = db_uri[10:] # 移除 'sqlite:///' 前缀 print(f"数据库路径: {db_path}") # 连接到SQLite数据库 conn = sqlite3.connect(db_path) cursor = conn.cursor() # 列出所有表 cursor.execute("SELECT name FROM sqlite_master WHERE type='table'") tables = cursor.fetchall() print("=== 数据库中的所有表 ===") for table in tables: print(f"表名: {table[0]}") # 检查是否有license表 if any(table[0] == 'license' for table in tables): print("\n找到license表,检查表结构...") # 检查当前表结构 cursor.execute("PRAGMA table_info(license)") columns = cursor.fetchall() print("=== 当前License表结构 ===") for column in columns: print(f"列名: {column[1]}, 类型: {column[2]}, 是否可为空: {column[3]}, 默认值: {column[4]}, 是否为主键: {column[5]}") # 检查license_key列 license_key_info = None for column in columns: if column[1] == 'license_key': license_key_info = column break if license_key_info: current_type = license_key_info[2] print(f"\n当前license_key列类型: {current_type}") if "VARCHAR(32)" in current_type.upper(): print("需要更新license_key列类型为VARCHAR(35)") # SQLite修改表结构的方法: # 1. 创建新表 # 2. 复制数据 # 3. 删除旧表 # 4. 重命名新表 # 开始事务 cursor.execute("BEGIN TRANSACTION") # 1. 创建新表(修改license_key列长度) cursor.execute(""" CREATE TABLE license_new ( license_id INTEGER NOT NULL PRIMARY KEY, license_key VARCHAR(35) NOT NULL, product_id VARCHAR(32) NOT NULL, type INTEGER NOT NULL, status INTEGER NOT NULL, valid_days INTEGER NOT NULL, bind_machine_code VARCHAR(64), activate_time DATETIME, expire_time DATETIME, last_verify_time DATETIME, unbind_count INTEGER, create_time DATETIME, update_time DATETIME ) """) # 2. 复制数据 cursor.execute(""" INSERT INTO license_new SELECT license_id, license_key, product_id, type, status, valid_days, bind_machine_code, activate_time, expire_time, last_verify_time, unbind_count, create_time, update_time FROM license """) # 3. 删除旧表 cursor.execute("DROP TABLE license") # 4. 重命名新表 cursor.execute("ALTER TABLE license_new RENAME TO license") # 5. 重新创建索引 cursor.execute("CREATE UNIQUE INDEX ix_license_license_key ON license (license_key)") cursor.execute("CREATE INDEX ix_license_product_id ON license (product_id)") # 提交事务 conn.commit() print("✓ 成功更新license_key列类型为VARCHAR(35)") elif "VARCHAR(35)" in current_type.upper(): print("✓ license_key列已经是正确的长度") else: print(f"⚠ license_key列类型未知: {current_type}") else: print("✗ 未找到license_key列!") else: print("✗ 未找到license表!") # 关闭连接 conn.close() except Exception as e: print(f"修复数据库结构时出错: {e}") import traceback traceback.print_exc() if __name__ == "__main__": fix_license_table()