使用 Sqitch Rework 命令更改表

Posted

技术标签:

【中文标题】使用 Sqitch Rework 命令更改表【英文标题】:Altering Table with Sqitch Rework command 【发布时间】:2016-01-29 14:11:24 【问题描述】:

我已经尝试过多次关注Sqitch's 'postgres tutorial',只是我没有更改函数(使用CREATE OR REPLACE FUNCTION),而是更改表中的字段名称以查看它的效果将在部署后进行锻炼。但它最终会出现以下错误。有人可以指点我正确的方向吗?

$ sqitch verify
Verifying sqtest_db
  * appschema .... ok
  * contact ...... ok
Undeployed change:
  * contact
Verify successful


$ sqitch deploy
Deploying changes to sqtest_db
  + contact .. psql:deploy/contact.sql:10: ERROR:  relation "contact" already exists
not ok
"/usr/local/bin/psql" unexpectedly returned exit value 3

Deploy failed

这是我在tagged 之前和tagged 之后的部署查询

在标记数据库之前

BEGIN;
CREATE TABLE sq_schema.contact
  (
    log_date DATE NOT NULL,
    emp_name CHARACTER VARYING(100) DEFAULT ''
  );
COMMIT;

标记数据库

sqitch rework contact --requires appschema -n 'Added CONTACT table'

标记后

BEGIN;

CREATE TABLE sq_schema.contact
  (
    log_date DATE NOT NULL,

    -- Change field name,
    employee_name CHARACTER VARYING(100) DEFAULT ''
  );

COMMIT;

【问题讨论】:

Sqitch的作者在Github回答了我上面的问题。解决方案是改为添加ALTER TABLE 文件。 【参考方案1】:

Rework 旨在对idempotent 进行更改,例如CREATE OR REPLACE FUNCTIONCREATE TABLE 语句不是幂等的。如果您想在表格中添加一列,我建议:

    如果您尚未发布数据库,只需修改原始更改中的CREATE TABLE 语句和sqitch rebase 以恢复所有更改并使用更新的表重新部署。这是进行开发时的理想选择。

    否则,添加一个名为$table_$column 或类似名称的新更改,并使用ALTER TABLE 语句添加新列。如果您已经发布了数据库,则可以采用这种方法,但如果您愿意,也可以在发布之前这样做。

【讨论】:

您好!幂等性如何与还原更改一起工作?幂等更改的要求是否意味着可以在不破坏任何内容的情况下恢复它们?例如,如果在原始问题中将列添加到带有ALTER_TABLE 的表中,那么应该如何执行恢复操作:是否应该仅恢复更改表的这一位更改以删除新列,或者它应该工作作为常规恢复,只是DROP 整个表? ALTER TABLE 不是幂等的:如果运行两次,第二次就会失败。在这种情况下,您还希望使用还原脚本ALTER TABLE 来删除该列,以便将其保持在与从未发生部署相同的状态。 IOW,幂等性与正常的添加/恢复更改无关,仅与返工更改有关。 您好!谢谢你的澄清!我有一个项目,其中一些默认数据(角色和权限)由 sqitch 部署。当我尝试对数据部署进行sqitch rework 的更改以添加新数据时,我遇到了一些问题。现在我发现我做错了。

以上是关于使用 Sqitch Rework 命令更改表的主要内容,如果未能解决你的问题,请参考以下文章

使用 sqitch 中的 mysql 查询验证表不存在

sqitch:跨多个环境部署更改

将更改部署到 azure 时,sqitch deploy 命令失败

用 sqitch 恢复特定的变化?

如何使用 sqitch postgresql 验证更改列数据类型更改?

有没有办法删除添加到 sqitch 的迁移?