首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL COPY命令中动态生成的表名

问PostgreSQL COPY命令中动态生成的表名
EN

Stack Overflow用户
提问于 2011-02-04 18:45:02
回答 2查看 10.5K关注 0票数 6

此PostgreSQL COPY命令有效:

代码语言:javascript
复制
copy tablename from E'c:\\abc\\a.txt';

但是我希望表名是动态生成的。我该怎么做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-12 17:50:50

您需要构建一个字符串,并在动态表名中连接起来,然后使用execute。请注意,您要对“by”进行转义。这也包括一个动态名称来保存文件。您需要用您正在使用的实际目录替换savedir。

代码语言:javascript
复制
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更容易阅读,也更灵活。

代码语言:javascript
复制
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

票数 15
EN

Stack Overflow用户

发布于 2021-12-15 14:51:23

您可以通过shell脚本从多个csv文件复制到一个表。

创建脚本文件:vim csvtotable,

  1. 编写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

  1. 执行该脚本。

./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/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4897085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档