现有 PostgreSQL 应用迁移到 tursopg 前如何确认功能支持范围?

发布时间:2026/9/13 5:49:21
现有 PostgreSQL 应用迁移到 tursopg 前如何确认功能支持范围?
现有 PostgreSQL 应用迁移到 tursopg 前如何确认功能支持范围【免费下载链接】tursoA SQL database in Rust: SQLite-compatible, now also speaking Postgres (experimental). The LLVM of databases.项目地址: https://gitcode.com/GitHub_Trending/tu/turso你的 PostgreSQL 应用想在不动业务代码的前提下换用tursopg——Turso 仓库中基于 libpg_query 解析 PostgreSQL SQL、通过 PostgreSQL 线协议 v3 提供服务的实验性前端。迁移前需要回答一个问题应用实际依赖的 SQL 特性、数据类型和运维能力tursopg是否支持哪些只是“看起来支持”这篇文章给出仓库中已有的三步核对路径查兼容矩阵、起实例实测、跑上游回归测试并说明每种结果的判定方式。适用前提是你能获取本仓库源码并用 Rust 工具链构建tursopg。先理解 tursopg 的判定边界postgres/COMPAT.md是功能逐项的状态清单基于官方 PostgreSQL feature matrix 整理。状态只有三种状态含义✅ Supported特性可用且有测试覆盖 Partial有限制地可用见 notes 列❌ Not supported未实现阅读这份矩阵前必须理解一个架构事实前端用 libpg_query真正的 PostgreSQL 文法解析 SQL所以几乎所有 PostgreSQL 语法在解析阶段都能通过。支持与否由翻译器postgres/parser/translator.rs和 Turso 引擎的执行能力决定。因此一部分子句能解析、能执行但语义被静默丢弃——不报错直接产生错误结果或丢失信息。矩阵中这些行会被标注 silently ignored。这是迁移时最大的风险应用不会崩但数据是错的。用 COMPAT.md 盘点应用依赖的特性对照postgres/COMPAT.md的章节Core SQL baseline、Data Types、SQL、DDL、JSON、Partitioning、Views、Security、Transactions、VACUUM、Foreign Data Wrappers、Extensions、Network 等把应用用到的每条特性映射到对应行。重点核查两类第一类静默失效silent项。下面这些行直接来自矩阵只要应用 SQL 中出现对应写法就要单独处理特性状态矩阵中的说明DELETE ... USING PartialUSING子句被静默丢弃TRUNCATE Partial只降级为对第一张表执行 DELETECASCADE/RESTART IDENTITY被丢弃临时表CREATE TEMP TABLE❌TEMP 被静默忽略表实际是持久表CREATE INDEX ... INCLUDE❌INCLUDE 子句被静默忽略CREATE INDEX CONCURRENTLY❌CONCURRENTLY 被静默忽略LATERAL子句❌关键字被接受但静默忽略SELECT ... FOR UPDATE/SHARE❌被接受但静默忽略不产生任何锁COLLATE子句❌被静默剥离DISTINCT ON❌被接受但静默退化为普通 DISTINCT错误结果PARTITION BY/PARTITION OF❌被静默丢弃表按未分区创建INHERITS表继承❌被静默丢弃GENERATED ... AS列❌被静默忽略索引方法USING methodGIN/GiST 等❌被静默忽略所有索引都是 B-treeSET/SHOWGUC 参数透传为 PRAGMASHOW search_path返回空事务隔离级别选项✅被接受但被忽略COMMENT ON被接受但不持久化obj_description()恒返回 NULLALTER COLUMN TYPE❌能翻译但执行时报错后续使用报 no such column第二类硬不支持项。应用若依赖以下能力属于迁移阻断项矩阵明确标注为 ❌ 或不支持CREATE FUNCTION含 PL/pgSQL 等过程语言被拒绝、触发器CREATE TRIGGER 不翻译、CREATE EXTENSION、LISTEN/NOTIFY、复制Replication、备份与恢复Backup and restore、升级Upgrade、EXPLAIN完全不支持、VACUUM/ANALYZE报错拒绝、GRANT/REVOKE、游标DECLARE/FETCH/MOVE、两阶段提交、MERGE、GROUPING SETS/CUBE/ROLLUP翻译错误、可更新视图、information_schemapg_namespace 里有一行记录但没有视图、全部 contrib 扩展hstore、ltree、pg_trgm、pg_stat_statements 等。注意行为差异而非缺失的项物化视图在tursopg中是活的——基于 DBSP 增量维护底层表变更后视图自动更新REFRESH MATERIALIZED VIEW被接受但是空操作这与 PostgreSQL 的静态快照语义不同见 postgres/cli/README.md。WITH RECURSIVE按 SQLite 语义执行与 PG 的行为可能不同SEARCH/CYCLE 子句被拒绝。起一个 tursopg 实例实测应用 SQL矩阵只能告诉你特性是否支持应用自己的 SQL 是否符合这些边界要靠实测。postgres/CONTRIBUTING.md给出的操作方式是构建并启动tursopg服务器cargo run -p tursopg -- --server 127.0.0.1:5432 /tmp/regress.db这条命令在本机 5432 端口启动一个 tursopg 线协议服务器并在/tmp/regress.db创建数据库文件路径来自文档示例可自行替换端口需空闲。用应用现有的 PostgreSQL 客户端连接DSN 形如postgres://127.0.0.1:5432/regression连接前必须知道线协议的边界矩阵 Network 一节V3 client protocol 为 Partial只支持明文连接SSL 请求会得到 SSL not available 应答客户端不能要求 TLS只有 trust 认证没有密码、SCRAM 或证书校验支持 simple query 和 extended queryParse/Bind/Execute/Describe/Sync协议参数值只能是 text 格式不支持 COPY 子协议、CancelRequest、NotificationResponseExecute 的行数限制被忽略。把应用的建表 DDL、典型查询、参数化查询逐类跑一遍按三类结果记录报错的矩阵中标 ❌ 的行会拒绝或报错能跑通但结果需人工核对的静默丢弃项、物化视图活语义、递归 CTE 语义以及 COPY 导入——只支持COPY table FROM file文本格式DELIMITER、NULL string、HEADER、列列表、反斜杠转义、\.结束标记均可用且失败时原子回滚COPY ... STDIN/STDOUT、CSV 格式、COPY TO、COPY FROM ... WHERE都不支持。跑回归测试确认当前支持面仓库自带两套对照测试用来客观确认功能范围而不是依赖阅读矩阵。上游 PostgreSQL 回归测试。postgres/conformance/run.py将 PostgreSQL 源码树中原样导入的conformance/upstream/回归脚本对tursopg执行逐字节比对 psql 转写输出postgres/conformance/run.py # 整个语料 postgres/conformance/run.py boolean # 按名称跑单个测试 postgres/conformance/run.py --max-diff-lines 0 boolean # 输出完整 diff脚本会自动构建tursopg与pgregressrunner在临时目录用全新数据库和空闲端口启动服务器按 schedule 顺序执行全部测试后拆掉服务器。判定规则run.py 头部说明每个测试对照STATUS表判定——pass已认可要求输出逐字节一致出现任何 diff 或崩溃即为回归并导致运行失败fail已知失败允许失败但不影响退出码若某个已知失败测试开始通过运行会失败并要求你将其升格为passskip当前没有。退出码 0 表示所有测试都与 STATUS 一致。失败测试会把实际转写和统一 diff 写到postgres/regress/results/。阅读结果时注意STATUS 表中绝大多数上游测试当前是 fail 已知失败——这套语料的定位是防回归棘轮而非通过性证明postgres/CONTRIBUTING.md明确说语料保持原样、失败的 diff 就是待办清单。因此跑它的目的是确认某个具体行为差异是否被记录在案而不是期待一次全绿。项目自写的特性面测试。postgres/conformance/pg-sqltests/下有按特性域组织的 sqltest 文件select、table、transaction、functions、explain、search_path、errors。它们断言真实 PostgreSQL 同样表现出的行为。运行方式见postgres/conformance/Makefilemake -C postgres/conformance run # 整个 pg-sqltests 语料--backend pg make -C postgres/conformance run-one FILEpg-sqltests/select.sqltestmake run-one先构建tursopg和 sqltest runner再启动 tursopg 服务器按 PostgreSQL 线协议驱动测试CI 下自动用 release 模式本地用 debug 模式。当迁移争议集中在某一特性域比如 SELECT 语义或事务行为时这条路径比全量跑上游语料更聚焦。判定不能直接迁移的信号核对完成后的结论应落在三类事实上矩阵命中应用依赖的特性在postgres/COMPAT.md中是 ❌ 或带静默丢弃标注的 ——需要改 SQL 或放弃迁移线协议边界应用要求 TLS、密码认证、COPY 子协议、pg_stat_statements之类运维视图、多用户权限体系GRANT/REVOKE、行级安全、预定义角色均不支持——tursopg的线协议服务器信任每个连接且仅明文不是多用户生产 PG 服务器的直接替代运维能力缺失复制、备份与恢复、升级三项在矩阵中直接标注 not supported。依赖pg_upgrade、pg_dump恢复、流复制的应用没有对应路径information_schema无视图、pg_typeof未实现、部分 pg_catalog 表恒为空pg_policy、pg_trigger、pg_description等依赖这类目录自省的应用也要逐一核对 Backend 一节的清单。三步做完迁移范围就收敛为一份清单✅ 可直接跑的特性、需要改写 SQL 的静默丢弃项、以及必须保留在原 PostgreSQL 上的运维能力。回归 diffpostgres/regress/results/下和矩阵行号就是这份清单的依据。【免费下载链接】tursoA SQL database in Rust: SQLite-compatible, now also speaking Postgres (experimental). The LLVM of databases.项目地址: https://gitcode.com/GitHub_Trending/tu/turso创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考