Postgresql 将多个postgres脚本合并到一个文件中
我有两个文件,它们在Postgres中执行时都可以正常工作 文件1Postgresql 将多个postgres脚本合并到一个文件中,postgresql,Postgresql,我有两个文件,它们在Postgres中执行时都可以正常工作 文件1 CREATE TABLE ContractStatusEnum ( id SERIAL PRIMARY KEY, description VARCHAR(4000) NOT NULL ); *文件2 但是,如果我只是将它们放在一个文件中,它将失败 错误:在“DO”处或附近出现语法错误 第6行:$$开始吗 在MS SQL上,我可以通过在两个脚本之间放置GO语句来创建新的上
CREATE TABLE ContractStatusEnum (
id SERIAL PRIMARY KEY,
description VARCHAR(4000) NOT NULL
);
*文件2
但是,如果我只是将它们放在一个文件中,它将失败
错误:在“DO”处或附近出现语法错误第6行:$$开始吗
在MS SQL上,我可以通过在两个脚本之间放置
GO
语句来创建新的上下文来解决这个问题。有没有关于如何在Postgres 9中执行此操作的线索?只需将片段连接起来即可。不需要/或GO
。(在psql的交互模式下,可能需要一个\g)
编辑:删除WHERE子句(此处甚至无效)。表上的PK约束将避免多次初始化
另一种连接方式是通过包含。您可以创建一个“主”脚本,并从中包含片段。当您想“注释”整个部分时,它很有用
-- Master script.
\i tables_create.sql
\i procedures_and_functions.sql
\i populate_the_tables.sql
\i do_some_checks.sql
-- EOF
只需连接片段。不需要/或
GO
。(在psql的交互模式下,可能需要一个\g)
编辑:删除WHERE子句(此处甚至无效)。表上的PK约束将避免多次初始化
另一种连接方式是通过包含。您可以创建一个“主”脚本,并从中包含片段。当您想“注释”整个部分时,它很有用
-- Master script.
\i tables_create.sql
\i procedures_and_functions.sql
\i populate_the_tables.sql
\i do_some_checks.sql
-- EOF
您需要用分号终止
DO
块
以下是我的作品:
DO $$ BEGIN
IF NOT EXISTS (SELECT * FROM ContractStatusEnum WHERE id = 1) THEN
INSERT INTO ContractStatusEnum (id, description) VALUES
(1, 'Ordered'),
(2, 'Active'),
(3, 'Stopped'),
(4, 'Canceled'),
(10, 'Inactive');
END IF;
END $$
;
我将语句保存在f1.sql(创建表)和f2.sql(do块)中:
您需要用分号终止
DO
块
以下是我的作品:
DO $$ BEGIN
IF NOT EXISTS (SELECT * FROM ContractStatusEnum WHERE id = 1) THEN
INSERT INTO ContractStatusEnum (id, description) VALUES
(1, 'Ordered'),
(2, 'Active'),
(3, 'Stopped'),
(4, 'Canceled'),
(10, 'Inactive');
END IF;
END $$
;
我将语句保存在f1.sql(创建表)和f2.sql(do块)中:
Do
仅在pgplsql中有效。你可以省略do。只需连接片段(可能每个语句都以分号结尾。IF NOT EXISTS
语法无效:请改用WHERE子句。IF NOT EXISTS
语句在postgres中执行第二个文件时运行良好,无需连接。语句是否应在pgplsql中运行完整脚本?是的,您甚至可以将stdin重定向到psql并使用管道或“Do
仅在pgplsql中有效。您可以省略Do。只需连接片段即可(可能每个语句都以分号结尾。IF NOT EXISTS
语法无效:请改用WHERE子句。IF NOT EXISTS
语句在postgres中执行第二个文件时运行良好,无需连接。语句是否应在pgplsql中运行完整脚本?是的,您甚至可以将stdin重定向到psql并使用管道或“我知道我可以通过省略pgplsql来摆脱它,但我有更复杂的脚本需要在该模式下运行。我认为pgplsql在过程/函数之外是无效的。我当然不想要它。@wildplasser:它在DO
blockOops中肯定是有效的。我得到了纠正。我从未使用过它;插入将失败。”由于PK约束。(这似乎是一个表创建+初始化脚本)我知道我可以通过省略pgplsql来摆脱它,但我有更复杂的脚本需要在该模式下运行。我认为pgplsql在过程/函数之外是无效的。我当然不想要它。@wildplasser:它在DO
blockOops中肯定是有效的。我得到了纠正。我从未使用过它;插入将失败PK约束的原因。(这似乎是表创建+初始化脚本)
psql (9.1.3)
Type "help" for help.
postgres=> \i f1.sql
CREATE TABLE
postgres=> \i f2.sql
DO
postgres=>