背景
我正在编写一个 (Python) 脚本,以在我的 PostgreSQL 11.2 数据库上自动(重新)创建模式
foo
。
我希望我的脚本能够处理以下两种情况:
foo
的架构foo
的模式。问题
我不是很勇敢,并且更愿意保留这个已经存在的模式的副本,而不是简单地
DROP SCHEMA IF EXISTS foo;
。
但是,命令
ALTER SCHEMA IF EXISTS foo RENAME TO foo_backup_2019-07-29T1317210;
不存在:
# ALTER SCHEMA IF EXISTS foo RENAME TO foo_backup_2019-07-29T1317210;
ERROR: syntax error at or near "EXISTS"
LINE 1: ALTER SCHEMA IF EXISTS foo RENAME TO foo_backup_2019-07-29T1...
问题
在我的数据库中已经存在这样的模式的情况下如何重命名
?foo
您可以创建一个 SQL 过程来尝试 ALTER SCHEMA 命令并捕获您要更改的架构不存在时发生的异常...
CREATE OR REPLACE PROCEDURE public.rename_schema_if_exists(from_schema name, to_schema name)
LANGUAGE plpgsql
AS $BODY$
DECLARE
cmd text := format(E'ALTER SCHEMA %I RENAME TO %I;', from_schema, to_schema);
BEGIN
EXECUTE cmd;
EXCEPTION WHEN invalid_schema_name THEN RAISE NOTICE 'schema "%" does not exist', from_schema;
END;
$BODY$;
使用CALL执行程序
CALL rename_schema_if_exists('schema_a','schema_b');
因此,如果您要重命名的模式不存在,则基础事务不会中止。它只是记录一条消息并继续。
请注意,该过程仅捕获 invalid_schema_name 异常。任何其他错误都不会被捕获,因此将导致基础事务中止。例如,如果 to_schema 已经存在,则会抛出重复的_schema 异常,而我们的过程不会捕获该异常。如果您不希望该错误中止事务,那么您也可以修改过程以捕获该异常。