psql \ copy中的变量替换

时间:2014-07-10 07:53:23

标签: postgresql command-line dynamic-sql psql variable-subsitution

是否可以在PSQL控制台导出文件中,当前日期在文件名末尾? 导出文件的名称应该是这样的 table_20140710.csv 是否可以动态执行此操作? - 日期的格式可能与上述不同,但并不重要。

这就是我的意思:

\set curdate current_date
\copy (SELECT * FROM table) To 'C:/users/user/desktop/table_ ' || :curdate  || '.csv' WITH DELIMITER AS ';' CSV HEADER

2 个答案:

答案 0 :(得分:3)

动态构建\copy命令并将其存储在文件中。然后使用\i

执行它

首先设置元组仅输出

\t

将输出设置为文件

\o 'C:/users/user/desktop/copy_command.txt'

构建\copy命令

select format(
    $$\copy (select * from the_table) To 'C:/users/user/desktop/table_%s.csv' WITH DELIMITER AS ';' CSV HEADER$$
    , current_date
);

将输出恢复为stdout

\o

从文件

执行生成的命令
\i 'C:/users/user/desktop/copy_command.txt'

答案 1 :(得分:0)

不扩展变量的 orig_df <- as.data.frame(orig_df) included_rows <- rep(FALSE, nrow(orig_df)) seen_ids <- c() for(i in 1:nrow(orig_df)){ # Skip row if we have seen either ID already #if(orig_df[i, 'New_ID'] %in% seen_ids) next if(orig_df[i, 'New_ID.1'] %in% seen_ids) next # If both ids are new, we save them as seen and include the entry seen_ids <- c(seen_ids, orig_df[i, 'New_ID'] , orig_df[i, 'New_ID.1'] ) included_rows[i] <- TRUE } filtered_df <- orig_df[included_rows,] 元命令的例外是(同时)documented

<块引用>

与大多数其他元命令不同,该行的其余部分始终被视为 \copy 的参数,并且在参数中既不执行变量插值,也不执行反引号扩展。

要解决此问题,您可以分多个步骤构建、存储和执行命令(类似于 Clodoaldo Neto 提供的解决方案):

structure(list(New_ID = c("a", "a", "a", "d", "d", "d"), New_ID.1 = c("a", 
"b", "c", "d", "e", "f")), class = "data.frame", row.names = c(NA, 
-6L))

a|a
a|b
a|c
d|d
d|e
d|f

有了这个,您需要加倍(转义)嵌入的元命令中的 \copy。请记住,\set filename 'my fancy dynamic name' \set command '\\copy (SELECT * FROM generate_series(1, 5)) to ' :'filename' :command 将所有进一步的参数连接到第二个参数,因此在参数之间引用空格。您可以在执行前使用 \ 显示命令 (\set)。

作为本地 :command 命令的替代方法,您还可以使用 SQL 构建命令服务器端(最佳方式取决于动态内容的来源):

\echo :command