如何对 Postgres sql 中的过程、视图和函数执行版本控制

Ren*_*dre 14 database postgresql

我想对我的数据库进行版本控制。

我目前通过 git 控制我的前端应用程序,但是我正在创建我的数据库,并且希望对我的表、函数和过程进行版本控制,我该如何为数据库实现此目的?也就是说,我将在一个函数中进行更改,但我想保存我正在执行的前一个函数,以防出现任何问题我可以再次放置前一个函数。

Anc*_*ron 10

用于数据库结构版本控制(包括可选数据迁移)的主要工具有:

但是,您问题的具体情况超出了现有工具目前所能提供的范围。

如果您需要数据库中某个对象的两个或多个版本以供并行使用(例如表、触发器等的逐步迁移),您最好使用以下任一方法:

  1. 嵌入到对象中的命名方案,例如my_cool_function_v2vs.my_cool_function_v3

...或者:

  1. 为每个主要版本使用不同的数据库模式(如果您遵循语义版本方法),例如CREATE FUNCTION my_schema_v2.my_cool_function不会与my_schema_v1.my_cool_function

在这两种情况下,您通常必须在需要时管理引用较新的版本。对于第二种方法,可以使用 schema 进一步简化search_path,您可以修改该 schema 以选择包含新版本对象的新模式,例如:

SET search_path TO my_schema_v2, my_schema_v1, public;
Run Code Online (Sandbox Code Playgroud)

动态地(对于在实时系统中进行测试而不影响实际应用程序/用户很有用),一旦您确信基础知识已设置完毕,请将其包含到 PostgreSQL 配置 ( postgresql.conf) 中,以便新模式成为每个新连接的标准:

search_path = 'my_schema_v2, my_schema_v1, public'
Run Code Online (Sandbox Code Playgroud)

迁移所有新对象并且一切正常后,您可以my_schema_v1从其中删除旧对象search_path,也DROP ... CASCADE可以立即删除所有旧对象。

然而,模式方法的一个缺点是,如果您总是在所有模式中创建所有对象(函数、触发器、表……),那么当与search_path. 因此,我会为不同的对象创建不同的模式,例如data_v1数据(表、索引等)和func_v1其他事物(函数、过程等)。这样,您就可以独立于数据来发展结构,但同时,您也可以开始发展表结构,并自动从功能的修复/改进中受益,还可以测试更改是否向前兼容。