# -*- 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()