使用 Postgres 存储
当你需要可持久化、可多实例共享的存储后端时,使用 PostgreSQL。
前置条件
awaken-stores启用了postgresfeature- 有一个可连接的 PostgreSQL 实例
sqlx所需 tokio 运行时依赖已就绪
步骤
- 添加依赖:
[dependencies]
awaken-stores = { version = "...", features = ["postgres"] }
- 创建连接池:
use sqlx::PgPool;
let pool = PgPool::connect("postgres://user:pass@localhost:5432/mydb").await?;
- 创建
PostgresStore:
use std::sync::Arc;
use awaken::stores::PostgresStore;
let store = Arc::new(PostgresStore::new(pool));
默认表名:
awaken_threadsawaken_runsawaken_messages
- 使用自定义前缀:
let store = Arc::new(PostgresStore::with_prefix(pool, "myapp"));
- 接入 runtime:
use awaken::AgentRuntimeBuilder;
let runtime = AgentRuntimeBuilder::new()
.with_thread_run_store(store)
.with_agent_spec(spec)
.with_provider("anthropic", Arc::new(provider))
.build()?;
- Schema 初始化:
表会在首次访问时自动通过 ensure_schema() 创建。初始接入无需手动 migration。
验证
执行 agent 后,在数据库中查询:
SELECT id, updated_at FROM awaken_threads;
SELECT id, updated_at FROM awaken_runs;
应该能看到对应记录。
常见错误
| 错误 | 原因 | 修复 |
|---|---|---|
sqlx::Error connection refused | PostgreSQL 未启动或连接串错误 | 检查 DATABASE_URL 和数据库状态 |
首次写入报 StorageError | 数据库用户权限不足 | 授予建表和写入权限 |
| 表名冲突 | 其他应用共用了默认表名 | 用 with_prefix() 做命名空间隔离 |
相关示例
crates/awaken-stores/src/postgres.rs
关键文件
crates/awaken-stores/Cargo.tomlcrates/awaken-stores/src/postgres.rscrates/awaken-stores/src/lib.rs