此PostgreSQL COPY命令有效:
copy tablename from E'c:\\abc\\a.txt';但是我希望表名是动态生成的。我该怎么做呢?
发布于 2011-03-12 17:50:50
您需要构建一个字符串,并在动态表名中连接起来,然后使用execute。请注意,您要对“by”进行转义。这也包括一个动态名称来保存文件。您需要用您正在使用的实际目录替换savedir。
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';编辑:
自从我第一次写这篇文章以来,我已经发现了format函数,我认为它通常比使用连接操作符||生成的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
发布于 2021-12-15 14:51:23
您可以通过shell脚本从多个csv文件复制到一个表。
创建脚本文件:vim 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/
https://stackoverflow.com/questions/4897085
复制相似问题