"""初始化预置数据 Revision ID: e411428f00c0 Revises: ee0a189f1532 Create Date: 2025-12-26 11:02:24.080526 """ from typing import Sequence, Union from datetime import datetime from alembic import op import sqlalchemy as sa from sqlalchemy import table, column, String, Integer, Float, Text, Boolean, DateTime # revision identifiers, used by Alembic. revision: str = 'e411428f00c0' down_revision: Union[str, None] = 'ee0a189f1532' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: """插入预置数据""" # ==================== 1. 插入关系类型数据 ==================== relationship_types_table = table( 'relationship_types', column('name', String), column('category', String), column('reverse_name', String), column('intimacy_range', String), column('icon', String), column('description', Text), ) relationship_types_data = [ # 家庭关系 {"name": "父亲", "category": "family", "reverse_name": "子女", "intimacy_range": "high", "icon": "👨", "description": "父子/父女关系"}, {"name": "母亲", "category": "family", "reverse_name": "子女", "intimacy_range": "high", "icon": "👩", "description": "母子/母女关系"}, {"name": "兄弟", "category": "family", "reverse_name": "兄弟", "intimacy_range": "high", "icon": "👬", "description": "兄弟关系"}, {"name": "姐妹", "category": "family", "reverse_name": "姐妹", "intimacy_range": "high", "icon": "👭", "description": "姐妹关系"}, {"name": "子女", "category": "family", "reverse_name": "父母", "intimacy_range": "high", "icon": "👶", "description": "子女关系"}, {"name": "配偶", "category": "family", "reverse_name": "配偶", "intimacy_range": "high", "icon": "💑", "description": "夫妻关系"}, {"name": "恋人", "category": "family", "reverse_name": "恋人", "intimacy_range": "high", "icon": "💕", "description": "恋爱关系"}, # 社交关系 {"name": "师父", "category": "social", "reverse_name": "徒弟", "intimacy_range": "high", "icon": "🎓", "description": "师徒关系(师父视角)"}, {"name": "徒弟", "category": "social", "reverse_name": "师父", "intimacy_range": "high", "icon": "📚", "description": "师徒关系(徒弟视角)"}, {"name": "朋友", "category": "social", "reverse_name": "朋友", "intimacy_range": "medium", "icon": "🤝", "description": "朋友关系"}, {"name": "同学", "category": "social", "reverse_name": "同学", "intimacy_range": "medium", "icon": "🎒", "description": "同学关系"}, {"name": "邻居", "category": "social", "reverse_name": "邻居", "intimacy_range": "low", "icon": "🏘️", "description": "邻居关系"}, {"name": "知己", "category": "social", "reverse_name": "知己", "intimacy_range": "high", "icon": "💙", "description": "知心好友"}, # 职业关系 {"name": "上司", "category": "professional", "reverse_name": "下属", "intimacy_range": "low", "icon": "👔", "description": "上下级关系(上司视角)"}, {"name": "下属", "category": "professional", "reverse_name": "上司", "intimacy_range": "low", "icon": "💼", "description": "上下级关系(下属视角)"}, {"name": "同事", "category": "professional", "reverse_name": "同事", "intimacy_range": "medium", "icon": "🤵", "description": "同事关系"}, {"name": "合作伙伴", "category": "professional", "reverse_name": "合作伙伴", "intimacy_range": "medium", "icon": "🤜🤛", "description": "合作关系"}, # 敌对关系 {"name": "敌人", "category": "hostile", "reverse_name": "敌人", "intimacy_range": "low", "icon": "⚔️", "description": "敌对关系"}, {"name": "仇人", "category": "hostile", "reverse_name": "仇人", "intimacy_range": "low", "icon": "💢", "description": "仇恨关系"}, {"name": "竞争对手", "category": "hostile", "reverse_name": "竞争对手", "intimacy_range": "low", "icon": "🎯", "description": "竞争关系"}, {"name": "宿敌", "category": "hostile", "reverse_name": "宿敌", "intimacy_range": "low", "icon": "⚡", "description": "宿命之敌"}, ] op.bulk_insert(relationship_types_table, relationship_types_data) print(f"✅ 已插入 {len(relationship_types_data)} 条关系类型数据") # ==================== 2. 插入全局写作风格预设 ==================== # 注意:这里需要从 WritingStyleManager 获取预设配置 # 为了避免导入应用代码,我们直接硬编码预设风格 writing_styles_table = table( 'writing_styles', column('user_id', String), column('name', String), column('style_type', String), column('preset_id', String), column('description', Text), column('prompt_content', Text), column('order_index', Integer), ) writing_styles_data = [ { "user_id": None, # NULL 表示全局预设 "name": "自然流畅", "style_type": "preset", "preset_id": "natural", "description": "自然流畅的叙事风格,适合现代都市、现实题材", "prompt_content": """写作风格要求: 1. 语言简洁明快,贴近现代口语 2. 多用短句,节奏流畅 3. 注重情感细节的自然流露 4. 避免过度修饰和复杂句式""", "order_index": 1 }, { "user_id": None, "name": "古典优雅", "style_type": "preset", "preset_id": "classical", "description": "古典文雅的写作风格,适合古装、仙侠题材", "prompt_content": """写作风格要求: 1. 使用文言、半文言或典雅的白话 2. 适当运用古典诗词意象 3. 注重意境营造和韵味 4. 对话和描写保持古典美感""", "order_index": 2 }, { "user_id": None, "name": "现代简约", "style_type": "preset", "preset_id": "modern", "description": "现代简约风格,适合轻小说、网文快节奏叙事", "prompt_content": """写作风格要求: 1. 语言直白简练,信息密度高 2. 多用对话推进情节 3. 避免冗长描写,突出关键动作 4. 节奏明快,适合快速阅读""", "order_index": 3 }, { "user_id": None, "name": "文艺细腻", "style_type": "preset", "preset_id": "literary", "description": "文艺细腻风格,注重心理描写和氛围营造", "prompt_content": """写作风格要求: 1. 注重心理活动和情感细节 2. 善用环境描写烘托氛围 3. 语言优美,富有文学性 4. 适当使用比喻、象征等修辞手法""", "order_index": 4 }, { "user_id": None, "name": "紧张悬疑", "style_type": "preset", "preset_id": "suspense", "description": "紧张悬疑风格,适合推理、惊悚题材", "prompt_content": """写作风格要求: 1. 营造紧张压迫的氛围 2. 多用短句加快节奏 3. 善于设置悬念和伏笔 4. 注重细节描写,为推理埋下线索""", "order_index": 5 }, { "user_id": None, "name": "幽默诙谐", "style_type": "preset", "preset_id": "humorous", "description": "幽默诙谐风格,适合轻松搞笑题材", "prompt_content": """写作风格要求: 1. 语言活泼风趣,善用俏皮话 2. 注重对话的喜剧效果 3. 适当夸张和反转制造笑点 4. 保持轻松愉快的基调""", "order_index": 6 }, ] op.bulk_insert(writing_styles_table, writing_styles_data) print(f"✅ 已插入 {len(writing_styles_data)} 条全局写作风格预设") def downgrade() -> None: """删除预置数据""" # 删除写作风格预设(只删除全局预设) op.execute("DELETE FROM writing_styles WHERE user_id IS NULL") print("✅ 已删除全局写作风格预设") # 删除关系类型 op.execute("DELETE FROM relationship_types") print("✅ 已删除关系类型数据")