corp20250923
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
为car_owners表添加query_history_id字段,并设置为query_history表id字段的外键
|
||||
"""
|
||||
|
||||
import sqlite3
|
||||
import logging
|
||||
|
||||
# 配置日志
|
||||
handlers = [logging.FileHandler('db_update.log'), logging.StreamHandler()]
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format='%(asctime)s - %(levelname)s - %(message)s',
|
||||
handlers=handlers
|
||||
)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# 数据库文件路径
|
||||
db_path = 'car_info.db'
|
||||
|
||||
def main():
|
||||
"""
|
||||
主函数:连接数据库并为car_owners表添加query_history_id字段
|
||||
"""
|
||||
logger.info("开始为car_owners表添加query_history_id字段")
|
||||
|
||||
try:
|
||||
# 连接数据库
|
||||
conn = sqlite3.connect(db_path)
|
||||
cursor = conn.cursor()
|
||||
|
||||
# 检查car_owners表是否已经存在query_history_id字段
|
||||
cursor.execute("PRAGMA table_info(car_owners)")
|
||||
columns = cursor.fetchall()
|
||||
|
||||
has_query_history_id = any(column[1] == 'query_history_id' for column in columns)
|
||||
|
||||
if has_query_history_id:
|
||||
logger.info("car_owners表已存在query_history_id字段,无需添加")
|
||||
else:
|
||||
# 添加query_history_id字段(先不添加外键约束,确保字段可以添加成功)
|
||||
logger.info("开始添加query_history_id字段")
|
||||
cursor.execute("ALTER TABLE car_owners ADD COLUMN query_history_id INTEGER")
|
||||
conn.commit()
|
||||
logger.info("query_history_id字段添加成功")
|
||||
|
||||
# 尝试添加外键约束
|
||||
try:
|
||||
logger.info("开始添加外键约束")
|
||||
cursor.execute("""
|
||||
ALTER TABLE car_owners
|
||||
ADD CONSTRAINT fk_car_owners_query_history_id
|
||||
FOREIGN KEY (query_history_id) REFERENCES query_history(id)
|
||||
""")
|
||||
conn.commit()
|
||||
logger.info("外键约束添加成功")
|
||||
except sqlite3.Error as e:
|
||||
# 在SQLite中,某些版本不支持通过ALTER TABLE直接添加外键约束
|
||||
# 如果添加外键约束失败,记录警告信息并继续
|
||||
logger.warning(f"添加外键约束失败: {str(e)}")
|
||||
logger.warning("将创建临时表并重新创建car_owners表来添加外键约束")
|
||||
|
||||
# 创建临时表
|
||||
cursor.execute("""
|
||||
CREATE TABLE car_owners_temp (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
plate_number TEXT NOT NULL,
|
||||
phone TEXT NOT NULL,
|
||||
id_card TEXT,
|
||||
name TEXT,
|
||||
email TEXT,
|
||||
address TEXT,
|
||||
query_history_id INTEGER,
|
||||
FOREIGN KEY (query_history_id) REFERENCES query_history(id)
|
||||
)
|
||||
""")
|
||||
|
||||
# 复制数据到临时表
|
||||
cursor.execute("""
|
||||
INSERT INTO car_owners_temp (
|
||||
id, plate_number, phone, id_card,
|
||||
name, email, address
|
||||
)
|
||||
SELECT
|
||||
id, plate_number, phone, id_card,
|
||||
name, email, address
|
||||
FROM car_owners
|
||||
""")
|
||||
|
||||
# 删除原表
|
||||
cursor.execute("DROP TABLE car_owners")
|
||||
|
||||
# 重命名临时表
|
||||
cursor.execute("ALTER TABLE car_owners_temp RENAME TO car_owners")
|
||||
|
||||
# 提交更改
|
||||
conn.commit()
|
||||
logger.info("通过重建表的方式成功添加外键约束")
|
||||
|
||||
# 关闭数据库连接
|
||||
conn.close()
|
||||
logger.info("数据库连接已关闭,操作完成")
|
||||
|
||||
except sqlite3.Error as e:
|
||||
logger.error(f"数据库操作失败: {str(e)}")
|
||||
# 如果发生异常,尝试回滚
|
||||
if 'conn' in locals() and conn:
|
||||
try:
|
||||
conn.rollback()
|
||||
logger.info("事务已回滚")
|
||||
except sqlite3.Error as rollback_error:
|
||||
logger.error(f"回滚失败: {str(rollback_error)}")
|
||||
except Exception as e:
|
||||
logger.error(f"程序执行出错: {str(e)}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user