database - 如何利用 PostgreSQL DDL 解析器?

标签 database postgresql metadata ddl

用于创建我的 PostgreSQL 数据库的 DDL/SQL 脚本受版本控制。理论上,对数据库模型的任何更改都会在源代码存储库中进行跟踪。

但在实践中,实时数据库的结构会发生“即时”更改,如果任何客户端脚本无法插入/选择/等数据,我将负责解决问题。

如果我可以运行一个快速测试来验证数据库仍然对应于 repo 中的创建脚本,即仍然是“官方”版本,那将对我有很大帮助。

我开始使用 pgTAP为此目的,到目前为止,它工作得很好。但是,每当对数据库进行受控的、批准的更改时,测试脚本也需要更改。

因此,我考虑自动创建测试脚本。一种通用的方法是

  1. 运行脚本来创建数据库
  2. 访问服务器上的数据库元数据
  3. 使用该元数据生成测试代码

我宁愿不必创建数据库,而是直接读取数据库创建脚本。我试图在谷歌上搜索一种方法来利用 DDL 解析器并获得某种我可以使用的元数据表示,但到目前为止,我已经了解了很多关于 PostgreSQL 内部的知识,但无法真正找到解决问题的方法。

有人能想出一种方法来解析 PostgreSQL DDL 脚本吗?

最佳答案

这是我确保实时数据库模式与版本控制下的模式定义匹配的方法:作为数据库模式“构建”例程的一部分,设置一个临时数据库实例,加载所有模式创建脚本按照预期的方式运行,然后运行 ​​pg_dump -s,并将其与生产数据库的模式转储进行比较。根据您的具体情况,您可能需要对最终产品运行一些 sed 以获得精确匹配,但这通常是可能的。

您可以完全自动化此过程。在 SCM 检查(使用构建机器人、持续集成服务器或类似工具)上运行数据库“构建”,并通过 cron 作业从事件实例中获取转储。当然,通过这种方式,每次有人 checkin 数据库更改时您都会收到警报,因此您必须稍微调整一下细节。

那里没有涉及 pgTAP。我喜欢 pgTAP 并将其用于单元测试数据库功能等(也在 CI 服务器上完成),但不用于验证模式属性,因为上述过程使它变得不必要。 (此外,从他们应该测试的内容自动生成测试似乎有点像错误的方法。)

关于database - 如何利用 PostgreSQL DDL 解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6834031/

相关文章:

database - flywaydb如何组织多数据库环境的迁移文件?

python - 强制python在不重新启动代码的情况下接受来自数据库的变量更改

postgresql - Postgres Gin 索引读取性能

metadata - 如何从llvm.dbg.declare获取IR值

sql - 将动态生成的数据透视表获取到临时表中

c - 如何使用 c 设置 sqlite pragma?

sql - 无法自然加入工作

macos - 尝试在 OSX 上设置 postgres

python - 如何使用Python从mp3元数据中提取 "Encoded by"?

xml - XML <? 的目的是什么? ?> 代币?