【问题标题】:PostgreSQL development workflowPostgreSQL 开发工作流程
【发布时间】:2013-07-31 03:15:10
【问题描述】:

我开始使用 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服务器工具?

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

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

【问题讨论】:

    标签: database postgresql workflow development-environment


    【解决方案1】:

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

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

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

    以下是 creating a tablecreating a view 的文档链接。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      $ 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 安装。

      希望对你有帮助,

      马可

      【讨论】:

        【解决方案3】:

        离你不远了。我是一名 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

        for SQL_SCRIPT in $( find ./ -name "*.sql" -print | sort);

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

        完成

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

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

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            【解决方案5】:

            如果更改有槽位,您可以创建执行 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
            

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

            【讨论】:

              猜你喜欢
              • 2015-12-16
              • 2011-09-23
              • 2019-07-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-11-06
              相关资源
              最近更新 更多