6

我开始使用 PostgreSQL 为我的项目构建一个新数据库。(顺便说一下,我是 PostgreSQL 和数据库的新手。)

我认为我的开发工作流程非常糟糕,这里是其中的一部分:

  1. 使用 pgAdmin 创建表/视图/函数。
  2. 在保存代码之前确定文件的名称。
    目标是能够通过运行所有保存的脚本自动重新创建数据库,
    出于依赖性原因,我需要知道运行这些脚本的顺序。
    所以我为每个文件添加了一个数字来指示顺序。例如:001_create_role_user.ddl、002_create_database_project.ddl、013_user_table.ddl
  3. 保存代码。
  4. 使用 GIT 将文件提交到存储库。

以下是我能想到的一些坏事:

  • 我很容易忘记我做了什么改变。例如,创建新类型,或编辑评论
  • 很难确定文件的名称(顺序)。
  • 更改代码会很麻烦,尤其是当新代码更改顺序时。

所以我的工作流程很糟糕。我想知道其他 Postgres 开发人员的工作流程是什么样的。

有没有什么好的工具(免费或便宜)来编辑和保存脚本?好的IDE也许?

如果我可以为数据库创建自动化单元测试,那就太好了。

有什么工具可以重建数据库?CI服务器工具?

基本上,我正在寻找任何建议、良好做法或数据库开发的好工具。

(对不起,这个问题可能不适合问答形式,但我不知道在哪里可以问这个问题。)

4

5 回答 5

2

好吧,您的问题实际上与任何数据库开发人员都非常相关,如果我理解正确,还有另一种方法可以达到您想要的结果。

值得一提的一件有趣的事情是,您将不同更改分离到不同文件中的想法是 Ruby On Rails 的迁移概念。您甚至可以使用 rake 实用程序来跟踪像您这样的工作流程。

但现在我认为可能是你的解决方案。PostgreSQL 和其他真诚的,具有特定的实用程序来处理您可能需要的数据和模式。

pg_dumpall命令行可执行文件会将整个数据库转储到一个文件或控制台中,psql实用程序可以简单地“重新加载”到同一个数据库或另一个(原始)数据库中。

因此,如果您只想保留正在运行的数据库集群的当前模式(无数据!),您可以作为 postgres-process 所有者用户:

$ pg_dumpall --schema-only > schema.sql

现在schema.sql将包含完全相同的用户/数据库/表/触发器/等,但不包含数据。如果你想要一个“完整备份”风格的转储(这是对数据库进行完整备份的一种方法),只需从命令行中删除“--schema-only”选项。

您可以将文件重新加载到另一个文件中(应该是处女,您可能会将数据库与其他数据搞砸):

$ psql -f schema.sql postgres

现在,如果您只想转储一个数据库、一个表等,您应该使用 pg_dump 实用程序。

$ pg_dump --schema-only <database> > database-schema.sql

然后,将数据库重新加载到正在运行的 postgresql 服务器中:

$ psql <database> < database-schema.sql

至于版本控制,您可以将 schema.sql 文件保留在其下,并在每次 vc 提交之前将数据库再次转储到该文件中。因此,在某些特定的版本控制状态下,您将拥有代码和与之配套的工作数据库模式。

哦,我提到的所有工具都是免费的,而且 pg_dump 和 pg_dumpall 都带有标准的 PostgreSQL 安装。

希望有帮助,

马可

于 2013-07-31T04:10:46.720 回答
2

查看liquibase。我们在我工作的公司中使用它来设置我们的 PostgreSQL 数据库。它是开源的,易于使用,您最终得到的更改日志文件可以添加到源代码控制中。每个变更集都有一个 id,因此每个变更集只运行一次。您最终会得到两个额外的表,用于在数据库运行时跟踪对数据库的更改。

虽然它与数据库无关,但您可以直接在每个变更集中使用 PostgreSQL SQL,并且每个变更集都可以有自己的注释。

使用它的唯一警告是,一旦将变更集应用于数据库,您必须提醒自己和其他人不要重复使用变更集。对已应用的变更集的任何更改都会导致不同的校验和(甚至是空格),这可能导致 liquibase 中止其更新。这可能会导致现场数据库更新失败,因此对任何更改日志的每次更新都应首先在本地进行测试。相反,所有更改,无论多么微小,都应该插入到具有新 id 的新更改集中。他们有一个名为“validCheckSum”的变更集子标签,可以让您解决这个问题,但我认为最好尝试强制始终制作新的变更集。

例如,以下是用于创建表创建视图的文档链接。

于 2013-08-10T05:42:09.663 回答
1

我是一名 DBA,我的工作流程几乎与@Ireeder 建议的一样......但除了使用脚本外壳来维护更新的 ddl 脚本外,我还使用了一个名为 dbmaintain DBMaintain的工具

DbMaintain 需要一些配置,但这并不痛苦……它保持对执行哪些脚本以及执行顺序的控制。主要好处是,如果已经执行的脚本 sql 发生更改,它默认会抱怨,或者只执行该脚本(如果配置为这样做)......当您在环境中添加新脚本时,类似的行为会起作用。 .. 它只执行那个新脚本。

部署和维护最新的开发和生产环境是完美的……不必每次都执行所有脚本(如 Ireeder 建议的那个 shell)或必须手动执行每个新脚本。

于 2013-08-07T05:36:04.003 回答
1

你不远了。我是一名 Java 开发人员,而不是 DBA,但随着项目的发展,构建数据库对于我所在的团队来说是一项重要任务,以下是我认为它做得最好的方式:

  1. 所有数据库更改都由 DDL(SQL 创建、更改或删除语句)纯文本脚本驱动。通过数据库客户端没有更改。使用支持语法高亮的文本编辑器,如 vim 或 notepad++,因为高亮可以帮助您在运行脚本之前发现错误。
  2. 在每个 DDL 脚本的开头使用一个数字来定义脚本运行的顺序。基本脚本的数字较小。随着项目的增长,使用alter new alter scripts 更改表,不要在初始脚本中重新定义表。
  3. 使用脚本和 psql 客户端从最低到最高加载 DDL 脚本。这是我们使用的 bash 脚本。您可以将其用作 Windows 上 .bat 脚本的基础。

#!/bin/bash

导出 PGDATABASE=your_db 导出

导出 PGUSER=your_user 导出

导出 PGPASSWORD=your_password

对于 $( 中的 SQL_SCRIPT 查找 ./ -name "*.sql" -print | sort);

echo "**** $SQL_SCRIPT ****"
  psql -q < $SQL_SCRIPT    

完毕

  1. 随着项目的增长,使用新的 alter 脚本来更改表,不要在初始脚本中重新定义表。

  2. 所有脚本都签入源代码管理。每个版本都有标记,因此您可以在将来重新生成该版本的数据库。

  3. 对于单元测试和 CI,大多数 CI 服务器可以运行脚本来删除和重新创建模式。PostGresql 单元测试的一个经常被引用的框架是pgTAP

于 2013-07-31T04:12:46.510 回答
0

如果更改有槽,您可以创建执行 DDL 更改的脚本并转储预期的数据库新状态(版本)。

pg_dump -f database-dump-production-yesterday.sql // all commands to create populate a startup

今天需要介绍一个新表的新功能

psql -f change-production-for-today.sql // DDL and DML commands to make database reflect the new state
pg_dump --schema -f dump-production-today.sql // all new commands to create database for today app
psql -i sql-append-table-needed-data-into-dump.sql -f dump-production-today.sql

从现在开始,所有开发人员都应该使用新的数据库创建脚本。

于 2013-08-08T22:27:40.937 回答