如何有效地控制存储在数据库中的应用程序参数?

时间:2014-04-13 01:07:06

标签: postgresql svn configuration parameters

我们有一个高度可定制的应用程序,该应用程序使用存储在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版本控制负责处理细节(例如,在更新期间合并文件,确保构建/暂存机器具有最新副本等)。但是,当有人修改数据库中的参数时会遇到问题,因为记录不受版本控制。这导致例如一个开发者的更新参数覆盖构建/登台机器上的另一个缺失参数等。

问题:解决上述问题的最有效方法是什么?

我可以想到几种选择 - 你可能有其他选择。

  1. 不要在数据库中存储参数。将它们存储在某种版本控制的文件中(例如,XML,JSON,TXT等)。
  2. 为PostgreSQL创建脚本或C插件,将每条记录的内容转储到工作副本。

3 个答案:

答案 0 :(得分:1)

最简单的方法是将表置于版本控制之下,并稍微编辑一下makefile以确保数据库是最新的。

您可以使用pg_dump将单个表转储到磁盘。命令行选项允许您仅转储架构,仅转储数据或两者。此命令行将化学表从chemical_elements表转储到stdout。

$ pg_dump -h localhost -U postgres -t chemical_elements --data-only sandbox 

开发人员可能会更新数据库本身。您可以将pg_dump的输出写入临时文件,并使用退出状态diffcmp来确定受控版本和当前数据是否不同。

答案 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"