PostgreSQL COPY 命令中动态生成的表名
Posted
技术标签:
【中文标题】PostgreSQL COPY 命令中动态生成的表名【英文标题】:Dynamically-generated table-name in PostgreSQL COPY command 【发布时间】:2011-02-04 10:45:02 【问题描述】:此 PostgreSQL COPY 命令有效:
copy tablename from E'c:\\abc\\a.txt';
但我希望动态生成表名。我该怎么做?
【问题讨论】:
【参考方案1】:您需要构建一个字符串,在动态表名中连接,然后使用执行。请注意,您对 'by '' 进行了转义。这也包括一个动态名称来保存文件。您需要将sadir 替换为您正在使用的实际目录。
CREATE OR REPLACE FUNCTION dynamicCopy(tablename text, outname text) RETURNS VOID AS $$
DECLARE STATEMENT TEXT;
BEGIN
STATEMENT := 'COPY (select * from ' || quote_ident(tablename) || ') to ''savedir' || outname ||'.txt''';
EXECUTE STATEMENT;
END;
$$ LANGUAGE 'plpgsql';
编辑:
自从我第一次写这个,我发现了格式函数,我认为它通常比使用连接运算符 || 生成的 SQL 更容易阅读。更灵活。
CREATE OR REPLACE FUNCTION dynamicCopy(tablename text, outname text) RETURNS VOID AS
$BODY$
BEGIN
EXECUTE FORMAT('COPY (SELECT * FROM %s) TO ''savedir%s.csv''',
tablename,
outname);
END
$BODY$
LANGUAGE plpgsql;
完整讨论请参见官方文档:https://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN
【讨论】:
您的示例代码实际上演示了动态生成的文件名而不是动态生成的表名。此外,您没有提到您的示例代码指定逗号分隔的输出,而不是默认的制表符分隔的输出。 (您是否从其他地方复制了您的示例代码?) Ruakh,感谢您指出错误。现在使用动态表名和文件名进行编辑。是的,它是我在工作中使用的东西的一个大大简化的版本——我以后会更加小心地正确回答这个问题。 天哪,我花了一些时间才弄清楚 quot_ident 中的错字!实际上是quotE_ident!现在这个确实有意义:“pg_execute(): Query failed: ERROR: 42883: function quot_ident(text) does not exist”【参考方案2】:您可以通过 shell 脚本从多个 csv 文件复制到一个表中。
制作脚本文件:vim csvtotable
编写 csvtotable 脚本。这是我的例子:
#!/bin/sh DBNAME=postgres files=$1 for file in $files; do psql -d $DBNAME -c "\copy parent_tree(parent_id, some_text) FROM '$file' delimiters ',' csv header" done
执行脚本。
./csv2table "$(ls *.out.csv)"
显然,本地 CSV 文件应该与表格匹配。如果 csv 文件名以 .out.csv 结尾,它将从 csv 导入数据库表。
我不确定 csv 名称匹配是全局还是当前目录匹配。
参考链接:-c
命令参考https://www.postgresql.org/docs/current/app-psql.html#APP-PSQL-PATTERNS
chomd 命令:https://linuxize.com/post/chmod-command-in-linux/
bash shanebang:https://linuxize.com/post/bash-shebang/
【讨论】:
以上是关于PostgreSQL COPY 命令中动态生成的表名的主要内容,如果未能解决你的问题,请参考以下文章
求postgreSQL 的数据库的表数据,导入导出的sql语句,谢谢!