我们有几个迁移脚本,它们将模式从版本更改为版本。如何继续错误的sql脚本?
有时会发生移植步骤(例如向表中添加列)已经手动完成或通过修补程序安装完成,因此迁移脚本失败。
如何阻止脚本停止发生错误(理想情况下在特定的预期错误时),而是记录一条消息并继续执行脚本?
我们使用PostgresQL 9.1,PostgresQL的解决方案以及一般的SQL解决方案都可以。
我们有几个迁移脚本,它们将模式从版本更改为版本。如何继续错误的sql脚本?
有时会发生移植步骤(例如向表中添加列)已经手动完成或通过修补程序安装完成,因此迁移脚本失败。
如何阻止脚本停止发生错误(理想情况下在特定的预期错误时),而是记录一条消息并继续执行脚本?
我们使用PostgresQL 9.1,PostgresQL的解决方案以及一般的SQL解决方案都可以。
尽管@ 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一个可能的陷阱 - 这对我来说是正确的解决方案。
我不认为你有另一种解决方案,而不是在事务之外运行整个脚本。
如果我是在那种情况下我会做:
感谢您的提示,这可能是一种方法。只有我希望能找到某些东西,我可以在某些情况下决定,我接受一个命令的错误,但希望继续并继续保留在完成的事务中,如前所述。 –
为什么不编写脚本,所以像列添加一样的任务只发生在列不存在? – HLGEM
@HLGEM:你会如何检查它是否存在?而且,这仅仅是一个例子 - 它可以发生在所有的情况下,一个命令只能运行一次而没有错误。 –
至于只有当它不存在时才添加列,那么已经有一个[在SO上的答案](http://stackoverflow.com/questions/12597465/how-to-add-column-if-not-exists- on-postgresql) –