记录一下那天晚上的排查过程。langgraph 0.2 配 langgraph-checkpoint-postgres 2.0,用 PostgresSaver.from_conn_string 建好 saver 后第一次 graph.invoke 报 relation "checkpoints" does not exist,数据库能连上但里面是空的。

刚开始盯着「数据库账号没有建表权限,setup 静默失败」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。没有调用 saver.setup(),建表语句从没执行过。另一种情况是连接串指向的库与预期不一致,表建在了别的库。

少数情况下是复用了已关闭的连接,setup 在失效连接上执行。

上来先看连接串实际连到哪个库

psql "$PG_URL" -c "select current_database(), current_user;"

手动执行一次 setup 建表

python -c "from langgraph.checkpoint.postgres import PostgresSaver;from psycopg import connect;c=connect('$PG_URL');PostgresSaver(c).setup();print('setup done')"

随后确认四张表是否都建好

psql "$PG_URL" -c "\dt checkpoints*"

带上 thread_id 再跑一次图,验证状态能落库

python -c "print({'configurable':{'thread_id':'t-1'}})"

怎么算真的好了,看的是同一批现象。setup 后能看到 checkpoints、checkpoint_blobs、checkpoint_writes 三张表,图执行两次后按 thread_id 能查到两轮状态。

检查点是显式建表的,不会自动迁移,换库或换账号之后第一件事就是跑一次 setup,否则错误会以“表不存在”这种最不直观的形式出现。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189