Files
aiagent/backend/scripts/migrate_add_workspace.py
renjianbo beff3fac8d fix: delete agent 500 error + dynamic personality + deployment guide
- Fix delete agent 500: clean up FK records (agent_llm_logs, permissions,
  schedules, executions, team_members) and unbind goals/tasks before delete
- Remove hardcoded personality templates in Android, replace with dynamic
  system prompt generation from name + description
- Set promptSectionsEnabled=false to bypass PromptComposer for personality
- Add Tencent Cloud Linux deployment guide (Docker Compose)
- Accumulated backend service updates, frontend UI fixes, Android app changes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-29 01:17:21 +08:00

115 lines
4.0 KiB
Python

"""
数据迁移脚本:创建默认工作区,将所有现有数据归入默认工作区。
运行方式: cd backend && ./venv/Scripts/python scripts/migrate_add_workspace.py
"""
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
import uuid
from datetime import datetime
from app.core.database import SessionLocal, engine
from app.core.config import settings
def migrate():
db = SessionLocal()
try:
# 1. 创建默认工作区
from app.models.workspace import Workspace, WorkspaceMembership
from app.models.user import User
# 检查是否已有默认工作区
existing = db.query(Workspace).filter(Workspace.is_default == 1).first()
if existing:
print(f"默认工作区已存在: {existing.id} ({existing.name})")
default_ws_id = existing.id
default_ws = existing
else:
# 找到第一个 admin 用户作为 owner
admin_user = db.query(User).filter(User.role == "admin").first()
if not admin_user:
admin_user = db.query(User).first()
if not admin_user:
print("错误: 数据库中没有用户,请先创建管理员账户")
return
default_ws = Workspace(
id=str(uuid.uuid4()),
name="默认工作区",
description="系统自动创建的默认工作区,包含所有历史数据",
is_default=1,
owner_id=admin_user.id,
max_members=200,
status="active",
created_at=datetime.utcnow(),
updated_at=datetime.utcnow(),
)
db.add(default_ws)
db.flush()
default_ws_id = default_ws.id
print(f"已创建默认工作区: {default_ws_id} ({default_ws.name})")
# 2. 将所有现有用户加入默认工作区
all_users = db.query(User).all()
added_count = 0
for user in all_users:
existing_membership = db.query(WorkspaceMembership).filter(
WorkspaceMembership.workspace_id == default_ws_id,
WorkspaceMembership.user_id == user.id,
).first()
if not existing_membership:
membership = WorkspaceMembership(
id=str(uuid.uuid4()),
workspace_id=default_ws_id,
user_id=user.id,
role="admin", # 现有用户默认给admin角色
joined_at=datetime.utcnow(),
)
db.add(membership)
added_count += 1
db.flush()
print(f"已将 {added_count} 个用户加入默认工作区")
# 3. 回填所有 Tier 1 表的 workspace_id
tables_to_backfill = [
("agents", "user_id"),
("workflows", "user_id"),
("goals", "creator_id"),
("knowledge_bases", "user_id"),
("data_sources", "user_id"),
("model_configs", "user_id"),
("tools", "user_id"),
("agent_schedules", "user_id"),
("workflow_templates", "user_id"),
("orchestration_templates", "user_id"),
("executions", None), # No user_id, backfill all
("tasks", None),
]
from sqlalchemy import text
for table, _user_col in tables_to_backfill:
result = db.execute(
text(f"UPDATE {table} SET workspace_id = :ws_id WHERE workspace_id IS NULL"),
{"ws_id": default_ws_id}
)
print(f" {table}: 已回填 {result.rowcount}")
db.commit()
print("\n迁移完成!")
print(f" 默认工作区: {default_ws_id}")
print(f" 成员数: {len(all_users)}")
print(f" 所有现有数据已归入默认工作区")
except Exception as e:
db.rollback()
print(f"迁移失败: {e}")
raise
finally:
db.close()
if __name__ == "__main__":
migrate()