"""migrations/columns.py — 加列迁移(老表补字段,幂等)""" def _add_column_if_missing(conn, table, column, ddl): """检查列是否存在,不存在才加(幂等)""" from flask_app import _exec, mysql, logger cur = conn.cursor(dictionary=True) cur.execute(f"SHOW COLUMNS FROM {table} LIKE %s", (column,)) exists = cur.fetchone() cur.close() if not exists: try: _exec(conn, ddl) print(f"[migrate] {table}.{column} 列已添加") except mysql.connector.Error as e: logger.debug(f"add column {table}.{column} skipped: {e}") def migrate_add_columns(): """为老表补齐后续新增的字段""" from flask_app import db conn = db() try: # tenant 字段(多工作台支持) for table in ["sales_leads", "follow_up_records", "business_proposals", "operation_projects", "product_versions", "finance_records", "project_tasks"]: _add_column_if_missing(conn, table, "tenant", f"ALTER TABLE {table} ADD COLUMN tenant VARCHAR(100) NOT NULL DEFAULT '科普·无界'") # business_proposals 扩展字段 _add_column_if_missing(conn, "business_proposals", "proposal_type", "ALTER TABLE business_proposals ADD COLUMN proposal_type VARCHAR(100) NOT NULL DEFAULT '业务方案'") _add_column_if_missing(conn, "business_proposals", "notes", "ALTER TABLE business_proposals ADD COLUMN notes VARCHAR(2000) NOT NULL DEFAULT ''") # product_versions 扩展字段 _add_column_if_missing(conn, "product_versions", "priority", "ALTER TABLE product_versions ADD COLUMN priority VARCHAR(10) NOT NULL DEFAULT 'P2'") _add_column_if_missing(conn, "product_versions", "start_date", "ALTER TABLE product_versions ADD COLUMN start_date VARCHAR(30) NOT NULL DEFAULT ''") _add_column_if_missing(conn, "product_versions", "plan_date", "ALTER TABLE product_versions ADD COLUMN plan_date VARCHAR(30) NOT NULL DEFAULT ''") _add_column_if_missing(conn, "product_versions", "dev_done_date", "ALTER TABLE product_versions ADD COLUMN dev_done_date VARCHAR(30) NOT NULL DEFAULT ''") _add_column_if_missing(conn, "product_versions", "test_date", "ALTER TABLE product_versions ADD COLUMN test_date VARCHAR(30) NOT NULL DEFAULT ''") _add_column_if_missing(conn, "product_versions", "devs", "ALTER TABLE product_versions ADD COLUMN devs VARCHAR(500) NOT NULL DEFAULT ''") _add_column_if_missing(conn, "product_versions", "testers", "ALTER TABLE product_versions ADD COLUMN testers VARCHAR(500) NOT NULL DEFAULT ''") # project_tasks 扩展字段 _add_column_if_missing(conn, "project_tasks", "status", "ALTER TABLE project_tasks ADD COLUMN status VARCHAR(50) NOT NULL DEFAULT '未开始'") _add_column_if_missing(conn, "project_tasks", "sort_order", "ALTER TABLE project_tasks ADD COLUMN sort_order INT NOT NULL DEFAULT 0") _add_column_if_missing(conn, "project_tasks", "priority", "ALTER TABLE project_tasks ADD COLUMN priority VARCHAR(10) NOT NULL DEFAULT 'P2'") # project_finances 12 个月度预算字段(确收/毛利/回款/费用) for m in ["01","02","03","04","05","06","07","08","09","10","11","12"]: for field in ["rev", "gross", "payment", "cost"]: col = f"{field}_2026_{m}" _add_column_if_missing(conn, "project_finances", col, f"ALTER TABLE project_finances ADD COLUMN {col} DOUBLE NOT NULL DEFAULT 0") conn.commit() print("[migrate] 加列迁移完成") finally: conn.close()