我有一个带有几个不同 IDS 的备份表...我想按 ID 对这些行进行备份。
该函数必须由 account_id 的限制执行(选择转储(21); - 其中 21 = 函数要触及的 account_id 的数量)
每个 account_id 必须有不同的文件名。以下示例:
例子:
COPY
(
SELECT * FROM backup_table WHERE id = 1112 AND status = 1
)
TO '/var/lib/pgsql/1112.sql';
COPY
(
SELECT * FROM backup_table WHERE id = 1113 AND status = 1
)
TO '/var/lib/pgsql/1113.sql';
COPY
(
SELECT * FROM backup_table WHERE id = 1114 AND status = 1
)
TO '/var/lib/pgsql/1114.sql';
问题:
我可以创建一个函数来自动执行此操作吗?有数以千计的此类 IDS,并且手动执行需要很长时间。
更新 1:
试图做:
CREATE or REPLACE FUNCTION dump(integer)
RETURNS integer AS $$
declare
crtRow record;
begin
FOR crtRow in execute 'select account_id from backup_table WHERE migrated = 1 AND account_id = '|| $1
LOOP
COPY
(SELECT * FROM backup_table WHERE migrated = 1 AND account_id = crtRow.account_id)
TO '/var/lib/pgsql/backup/%s.sql';
end loop;
return integer;
end
$$ language 'plpgsql';
- 每个 account_Id 都有一个带有其 ID 的文件
- 调用该函数时,我想指定我想要转储的 account_Ids 的数量
然而它不起作用......
更新 2:
CREATE or REPLACE FUNCTION function_1(rows integer)
RETURNS void AS $$
declare
crtRow record;
begin
FOR crtRow in EXECUTE 'select DISTINCT(account_id) from backup_table WHERE migrated = 1 AND account_id IN '|| $1
LOOP
COPY
(SELECT * FROM backup_table WHERE migrated = 1 AND account_id = crtRow.account_id)
TO '/var/lib/pgsql/' || crtrow.account_id || '.csv';
end loop;
end
$$ language 'plpgsql';
错误:
错误:“||”处或附近的语法错误 第 12 行:到 '/var/lib/pgsql/' || crtrow.account_id |...
更新 3:amacvar 的回答
CREATE or REPLACE FUNCTION function_1(rows integer)
RETURNS void AS $$
begin
execute 'COPY
(
SELECT * FROM backup_table WHERE id = ' || rows || 'AND status = 1
)
TO ''/var/lib/pgsql/'||rows||'.sql''';
end
$$ language 'plpgsql';
上述基于 amacvar 答案的函数有效。问题是我必须指定身份证号码......
例子:
`select function_1(25)` - Where 25 = id
这对我不利,因为我有数千个 ID,无法手动指定它们。
我需要的是:
与上面相同的函数,但在调用函数时要指定 IDS 的 LIMIT:
例子:
select function_1(100)
- WHERE 100 = 要复制的 id 数量
- 我怎样才能做到这一点?
上面的脚本答案显然会起作用。
但是,假设您必须,必须,从数据库中执行它(让我们知道为什么:)),下面的代码(减去循环等)应该会让您上路。
顺便说一句,你非常接近。
编辑 1:函数循环示例和格式
执行为
请注意,此处不执行任何检查。
例如,即使表中没有 id=3,这也会创建一个零字节 3.dat
编辑 2:数千个 id 的一个更可扩展的选项是
您可以在 bash 脚本中尝试以下操作:
然后通过 crontab 在脚本中运行它。