我想让我的数据库处于版本控制之下.

我总是希望在其中至少有some个数据(正如alumb次提到的:用户类型和管理员).我还经常需要大量生成的测试数据集合来进行性能测量.

我如何将版本控制应用于我的数据库?

推荐答案

马丁·福勒(Martin Fowler)写了一篇我最喜欢的关于这个主题的文章,http://martinfowler.com/articles/evodb.html.我 Select 不像alumb和其他人建议的那样将模式转储置于版本控制之下,因为我想要一种简单的方法来升级我的生产数据库.

对于只有一个生产数据库实例的web应用程序,我使用两种技术:

Database Upgrade Scripts

包含将架构从版本N移动到N+1所需的DDL的序列数据库升级脚本.(这些将放入您的版本控制系统中.)A_VERSION_HISTORY_TABLE,类似于

create table VersionHistory (
    Version int primary key,
    UpgradeStart datetime not null,
    UpgradeEnd datetime
    );

每次运行升级脚本时获取与新版本对应的新条目.

这确保了很容易看到存在什么版本的数据库模式,并且数据库升级脚本只运行一次.同样,这些是not个数据库转储.相反,每个脚本代表从一个版本移动到下一个版本所需的changes.它们是您应用于生产数据库以"升级"它的脚本.

Developer Sandbox Synchronization

  1. 用于备份、清理和收缩生产数据库的脚本.在每次升级到生产数据库后运行此命令.
  2. 用于在开发人员 workstation 上恢复(并在必要时调整)备份的脚本.每个开发人员在每次升级到生产数据库后都会运行此脚本.

A caveat: My automated tests run against a schema-correct but empty database, so this advice will not perfectly suit your needs.

Database相关问答推荐

如何使用用户定义的字符串索引数据框?

从 GCP 机密管理器中读取 .DER 值并将其保存到 .DER 文件

MySQL FIND_IN_SET 的对面

在 SQL Server 中找出调用存储过程

什么是范围锁( range-locks)?

阿拉伯字符串上的 WHERE 子句匹配问题

按请求的可变事务隔离级别

在表上插入或更新违反外键约束

从 activerecord 获取索引哈希

Sitecore - 将项目从 Web 移动到 Master?

数据库设计—应该避免一对一的关系吗?

将所有数据库列设置为 NOT NULL 是一种好习惯吗?

如何用 SQL 思考?

SQLite同时读写

MySQL 错误 - #1062 - Duplicate entry ' ' for key 2

当另一个进程修改数据库时Hibernate二级缓存失效

寻找示例数据库设计的好方法

MySQL相对于其他数据库的缺点

postgreSQL 同时将列类型从 int 更改为 bigint

如何安装/更新到 Postgres 9.4?