用于创建PostgreSQL数据库的DDL / SQL脚本受版本控制。理论上,在源代码库中跟踪对数据库模型的任何更改。
但实际上,实时数据库的结构会“动态”更改,如果任何客户端脚本无法插入/选择/等数据,我将负责解决问题。
如果我可以运行一个快速测试来验证数据库是否仍然与repo中的创建脚本相对应,那么这对我有很大的帮助,即仍然是“官方”版本。
我开始使用pgTAP用于此目的,到目前为止,它的效果很好。但是,每当对数据库进行受控的,批准的更改时,测试脚本也需要更改。
因此,我考虑自动创建测试脚本。一般的方法可能是
我希望不必创建数据库,而是直接读取数据库创建脚本。我尝试谷歌一种方式来利用DDL解析器并获得我可以使用的某种元数据表示,但到目前为止,我已经学到了很多关于PostgreSQL内部的知识,但是无法找到解决问题的方法。
有人能想出解析PostgreSQL DDL脚本的方法吗?
答案 0 :(得分:3)
这是确保实时数据库模式与版本控制下的模式定义匹配的方法:作为数据库模式的“构建”例程的一部分,设置临时数据库实例,在所有模式创建脚本中加载它的意图,然后运行pg_dump -s
,并将其与生产数据库的模式转储进行比较。根据您的具体情况,您可能需要在最终产品上运行一点sed
以获得完全匹配,但通常是可能的。
您可以完全自动执行此过程。在SCM检查上运行数据库“build”(使用构建机器人,持续集成服务器或类似服务器),并通过cron作业从实例中获取转储。当然,这样每次有人检查数据库更改时都会收到警报,所以你必须稍微调整一下这些细节。
那里没有涉及pgTAP。我喜欢pgTAP并将其用于单元测试数据库函数等(也在CI服务器上完成),但不用于验证模式属性,因为上述过程使得不必要。 (另外,从他们应该测试的内容中自动生成测试看起来有点像错误的方法。)
答案 1 :(得分:2)
这里有很多数据库元数据需要关注。我已经在相关的数据库内部工作了几年,我不会考虑你正在考虑的项目是否可行,而不需要花费几个月的编程时间来获得一个粗略的alpha质量工具来处理一些您关心支持的特定变更子集。如果这很容易,那么在数据库中构建DDL Triggers的开放项目将不会有很长的时间(例如:人们已经想要它十年)了,这就是你想在这里拥有的东西
在实践中,人们使用两种流行的技术来使这类问题更容易处理:
实际上,采用其中任何一种方法并直接推导出你想要的pgTAP脚本都是它自己的挑战。如果所做的更改足够小,您可以在某种程度上实现自动化。至少从一个合理规模的问题开始,从这个角度来看。