32 lines
1.2 KiB
Python
32 lines
1.2 KiB
Python
"""灵核情绪状态数据访问(设计 §11.4)。"""
|
||
|
||
from sqlalchemy.ext.asyncio import AsyncSession
|
||
|
||
from app.models.personality_emotion import CharacterEmotionState
|
||
|
||
|
||
async def get_state(session: AsyncSession, character_id: str) -> CharacterEmotionState | None:
|
||
"""读取某角色当前情绪状态(单行 per character)。"""
|
||
return await session.get(CharacterEmotionState, character_id)
|
||
|
||
|
||
async def upsert_state(
|
||
session: AsyncSession, state: CharacterEmotionState
|
||
) -> CharacterEmotionState:
|
||
"""写入情绪状态(存在则更新字段,不存在则插入)。
|
||
|
||
跨方言(SQLite + Postgres)ORM 层 upsert,不依赖 ON CONFLICT。
|
||
``updated_at`` 由 SQLAlchemy ``onupdate`` 自动刷新。
|
||
"""
|
||
existing = await session.get(CharacterEmotionState, state.character_id)
|
||
if existing is not None:
|
||
existing.mood = state.mood
|
||
existing.intensity = state.intensity
|
||
existing.baseline_mood = state.baseline_mood
|
||
existing.baseline_intensity = state.baseline_intensity
|
||
existing.last_trigger_event_id = state.last_trigger_event_id
|
||
return existing
|
||
session.add(state)
|
||
await session.flush()
|
||
return state
|