pg_mentat

在 PostgreSQL 内提供兼容 Datomic 的数据模型与 Datalog 查询引擎

概览

扩展包名版本分类许可证语言
pg_mentat1.5.7FEATApache-2.0Rust
ID扩展名BinLibLoadCreateTrustReloc模式
2980pg_mentatmentat
相关扩展pg_fts pg_tre pg_infer rum pg_trgm fuzzystrmatch vector postgis

The PIGSTY package omits optional mentatd and installs no user-facing binary; listed integrations are soft dependencies. Effective build uses pgrx 0.19.1, migrated from upstream 0.17.0.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.5.71817161514pg_mentat-
RPMPIGSTY1.5.71817161514pg_mentat_$v-
DEBPIGSTY1.5.71817161514postgresql-$v-pg-mentat-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
d13.x86_64
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
d13.aarch64
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
u22.x86_64
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
u22.aarch64
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
u24.x86_64
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
u24.aarch64
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
u26.x86_64
u26.aarch64
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7
PIGSTY 1.5.7

构建

您可以使用 pig build 命令构建 pg_mentat 扩展的 RPM / DEB 包:

pig build pkg pg_mentat         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_mentat 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_mentat;          # 当前活跃 PG 版本安装
pig ext install -y pg_mentat -v 18  # PG 18
pig ext install -y pg_mentat -v 17  # PG 17
pig ext install -y pg_mentat -v 16  # PG 16
pig ext install -y pg_mentat -v 15  # PG 15
pig ext install -y pg_mentat -v 14  # PG 14
dnf install -y pg_mentat_18       # PG 18
dnf install -y pg_mentat_17       # PG 17
dnf install -y pg_mentat_16       # PG 16
dnf install -y pg_mentat_15       # PG 15
dnf install -y pg_mentat_14       # PG 14
apt install -y postgresql-18-pg-mentat   # PG 18
apt install -y postgresql-17-pg-mentat   # PG 17
apt install -y postgresql-16-pg-mentat   # PG 16
apt install -y postgresql-15-pg-mentat   # PG 15
apt install -y postgresql-14-pg-mentat   # PG 14

创建扩展

CREATE EXTENSION pg_mentat;

用法

来源:

pg_mentat 在 PostgreSQL 内实现与 Datomic 兼容的数据模型和 Datalog 查询引擎。它将不可变事实存储为有类型的 datom,并通过 SQL 函数提供模式事务、Datalog 查询、pull 表达式、时间旅行、事务历史和永久切除功能。它适用于需要这种模型的应用;并非关系表或 SQL 的透明替代品。

安装并定义模式

CREATE EXTENSION pg_mentat;

SELECT mentat.t('[
  {:db/ident       :person/name
   :db/valueType   :db.type/string
   :db/cardinality :db.cardinality/one}
  {:db/ident       :person/age
   :db/valueType   :db.type/long
   :db/cardinality :db.cardinality/one}
]');

推荐使用的便捷别名位于 mentat 模式中。新属性必须先通过模式事务写入,随后事实才能使用它们。

写入并查询数据

SELECT mentat.t('[
  {:person/name "Alice" :person/age 30}
  {:person/name "Bob"   :person/age 25}
]');

SELECT mentat.q('
  [:find ?name ?age
   :where [?e :person/name ?name]
          [?e :person/age ?age]
          [(> ?age 28)]]
');

mentat.t(edn) 执行 ACID 事务并返回事务报告。mentat.q(query, inputs) 将 Datalog 查询编译为 PostgreSQL 执行计划。请使用 EDN 参数和输入绑定,不要把应用字符串插入查询文本。

Pull、历史记录与假设事务

SELECT mentat.pull('[*]', 10001);
SELECT mentat.log('default', 1000001, 1000010);
SELECT mentat.diff('default', 1000003, 1000007);

SELECT mentat.mentat_with('[
  {:person/name "Alice" :person/age 31}
]');

mentat.pull 返回实体形态的 JSON。mentat.logmentat.diff 提供事务历史,mentat.mentat_with 则评估事务但不持久化。查询还可以使用文档所述的数据库参数,以某个事务时点或从某个事务之后开始求值。

永久切除有意与通常的不可变历史机制分开:

SELECT mentat.mentat_excise('default', 10042, NULL);

执行切除前请检查目标实体和备份;该操作会永久移除 datom,适用于隐私擦除等要求。

重要对象

  • mentat.t(edn):写入模式或数据事务。
  • mentat.q(query, inputs):执行 Datalog。
  • mentat.pull(pattern, eid)mentat.pull_many(pattern, eids):以实体形态读取数据。
  • mentat.entity(eid)mentat.schema():检查实体或当前模式。
  • mentat.log(...)mentat.diff(...):检查事务历史。
  • mentat.stats()mentat.storage()mentat.cache_stats():运行状态检查。
  • mentat.subscribe(...):通过 PostgreSQL LISTEN/NOTIFY 提供响应式查询通知。

该扩展在 mentat 模式下的窄表中存储有类型的 datom,包括引用、整数、字符串、布尔、浮点、时刻、关键字、UUID 和字节值。

要求与注意事项

  • 上游 v1.5.7 支持 PostgreSQL 13-18。当前 Pigsty 软件包面向 PostgreSQL 14-18,并使用 pgrx 0.19.1 重新构建;上游标签源码声明使用 pgrx 0.17。请将打包后的二进制作为兼容性边界。
  • 该扩展不可重定位,也不要求 shared_preload_libraries
  • 可选的 mentatd HTTP/Datomic 线协议守护进程是上游配套程序,不包含在 Pigsty pg_mentat 软件包中。仅通过 SQL 使用扩展并不需要它。
  • Datalog 编译、递归 pull、全文属性、订阅和历史记录可能呈现截然不同的成本特征。请使用文档所述的 explain 辅助函数检查生成的 SQL,并在代表性数据上进行基准测试。
  • 切除操作绕过通常的不可变历史模型。请限制权限并审计其使用。

最后修改:2026-08-09: update extension count (30409e7)