我们有一个高度可定制的应用程序,该应用程序使用存储在PostgreSQL数据库中的参数来满足多个客户的需求。
例如,这是参数表的示例结构。
CREATE TABLE parameters
(
client_id VARCHAR(32) NOT NULL,
environment_key VARCHAR(32) NOT NULL,
param_name VARCHAR(255) NOT NULL,
param_value TEXT
);
此表中的示例条目可能如下所示:
CLIENT_A PRODUCTION REMOTE_SERVER "12.34.56.78"
CLIENT_B PRODUCTION REMOTE_SERVER "78.56.34.12"
CLIENT_B STAGING REMOTE_SERVER "127.0.0.1"
每个开发人员在其本地计算机上都有一个subversion工作副本签出和数据库的副本。当开发人员更改某些代码时,这不是问题,因为SVN版本控制负责处理细节(例如,在更新期间合并文件,确保构建/暂存机器具有最新副本等)。但是,当有人修改数据库中的参数时会遇到问题,因为记录不受版本控制。这导致例如一个开发者的更新参数覆盖构建/登台机器上的另一个缺失参数等。
问题:解决上述问题的最有效方法是什么?
我可以想到几种选择 - 你可能有其他选择。
答案 0 :(得分:1)
最简单的方法是将表置于版本控制之下,并稍微编辑一下makefile以确保数据库是最新的。
您可以使用pg_dump将单个表转储到磁盘。命令行选项允许您仅转储架构,仅转储数据或两者。此命令行将化学表从chemical_elements表转储到stdout。
$ pg_dump -h localhost -U postgres -t chemical_elements --data-only sandbox
开发人员可能会更新数据库本身。您可以将pg_dump的输出写入临时文件,并使用退出状态diff
或cmp
来确定受控版本和当前数据是否不同。
答案 1 :(得分:1)
另一种方法(以某种方式替代Mike的方式)是将版本添加到所有数据库更改,并且在代码-SCM和PostgreSQL之上使用Liquibase可以非常简单和透明地完成
对于最终用户(开发人员),这意味着在普通SVN提交中出现一个附加文件(Liquibase changelog)并仅通过Liquibase更新更新本地数据库
答案 2 :(得分:0)
在版本控制中保留参数数据的最终版本:
begin;
delete from parameters;
insert into parameters values ('CLIENT_A', 'PRODUCTION', 'REMOTE_SERVER', '12.34.56.78');
insert into parameters values ('CLIENT_B', 'PRODUCTION', 'REMOTE_SERVER', '78.56.34.12');
insert into parameters values ('CLIENT_B', 'STAGING', 'REMOTE_SERVER', '127.0.0.1');
commit;
在subversion中使用post-commit钩子在每次更新时应用脚本。
#!/bin/sh
# Post-commit hook for applying parameter changes to db
REPOS="$1"
REV="$2"
DB=mydb
PARAM_SCRIPT="$REPOS/sql/parameters.sql"
psql "$DB" < "$PARAM_SCRIPT"