2014-06-26 172 views
4

我们有几个迁移脚本,它们将模式从版本更改为版本。如何继续错误的sql脚本?

有时会发生移植步骤(例如向表中添加列)已经手动完成或通过修补程序安装完成,因此迁移脚本失败。

如何阻止脚本停止发生错误(理想情况下在特定的预期错误时),而是记录一条消息并继续执行脚本?

我们使用PostgresQL 9.1,PostgresQL的解决方案以及一般的SQL解决方案都可以。

+1

为什么不编写脚本,所以像列添加一样的任务只发生在列不存在? – HLGEM

+0

@HLGEM:你会如何检查它是否存在?而且,这仅仅是一个例子 - 它可以发生在所有的情况下,一个命令只能运行一次而没有错误。 –

+1

至于只有当它不存在时才添加列,那么已经有一个[在SO上的答案](http://stackoverflow.com/questions/12597465/how-to-add-column-if-not-exists- on-postgresql) –

回答

2

尽管@ LucM的回答似乎是很好的建议 - @TomasGreif指出我的回答更符合我的出处要求。

对于添加一列的给定的例子,这可以通过使用DO语句捕捉异常来完成:

DO $$ 
    BEGIN 
     BEGIN 
      ALTER TABLE mytable ADD COLUMN counter integer default 0; 
     EXCEPTION 
      WHEN duplicate_column THEN RAISE NOTICE 'counter column already exists'; 
     END; 
    END; 
$$; 

的提示引导我正确的PostgreSQL的网站,描述error codes一个可能的陷阱 - 这对我来说是正确的解决方案。

1

我不认为你有另一种解决方案,而不是在事务之外运行整个脚本。

如果我是在那种情况下我会做:

  • 执行修改元数据(下降/创建表/列...)一 交易的
  • 对中的数据进行所有修改(更新/插入/删除) 一个事务。
+0

感谢您的提示,这可能是一种方法。只有我希望能找到某些东西,我可以在某些情况下决定,我接受一个命令的错误,但希望继续并继续保留在完成的事务中,如前所述。 –