135 lines
5.9 KiB
Python
135 lines
5.9 KiB
Python
#!/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() |