使用 vsql 导出数据
可以使用 vsql 执行简单的数据导出任务,方法是更改其输出格式选项,以使输出适用于导入到其他系统(例如,Tab 分隔文件或逗号分隔文件)。可以从 vsql 会话中设置这些选项,或者也可以通过传递到 vsql 命令的命令行参数设置这些选项(这样可使导出过程适合通过编写脚步来实现自动化)。设置了 vsql 选项以使其采用目标系统可读取的格式输出数据之后,您可以运行查询并将结果捕获到文本文件。
下表列出了可用于更改 vsql 的输出格式的元命令和命令行选项。
以下示例演示了在输出中禁用填充和列标题,并演示了在交互式会话中设置字段分隔符以将表转储到制表符分隔的文本文件。
=> SELECT * FROM my_table;
a | b | c
---+-------+---
a | one | 1
b | two | 2
c | three | 3
d | four | 4
e | five | 5
(5 rows)
=> \a
Output format is unaligned.
=> \t
Showing only tuples.
=> \pset fieldsep '\t'
Field separator is " ".
=> \o dumpfile.txt
=> select * from my_table;
=> \o
=> \! cat dumpfile.txt
a one 1
b two 2
c three 3
d four 4
e five 5
注意
使用此技术在空字符串和 NULL 之间来回转换时,您可能会遇到问题。可以通过显式设置 null 值以使其输出诸如 NULLNULLNULL 等唯一字符串来防止任何混乱(例如,\pset null 'NULLNULLNULL'
)。然后,在导入结束后将该唯一字符串转换回 null 值。例如,如果要将文件复制回 Vertica 数据库,您应向 COPY 语句提供实参 NULL 'NULLNULLNULL'
。
如果已登录到数据库节点之一,您可以通过向 vsql 传递正确的参数直接从命令行创建相同的输出文件:
$ vsql -U username -F $'\t' -At -o dumpfile.txt -c "SELECT * FROM my_table;"
Password:
$ cat dumpfile.txt
a one 1
b two 2
c three 3
d four 4
e five 5
如果要将 null 值转换为如前文所述的唯一字符串,您可以添加实参 -P null='NULLNULLNULL'
(或所选的任何唯一字符串)。
通过将 -w
vsql 命令行选项添加到示例命令行,您可以在批处理脚本中使用命令以将数据导出自动化。但是,该脚本将包含纯文本格式的数据库密码。如果采用此方法,您应防止该批处理脚本受到未经授权的访问,还应让脚本使用具有受限访问权限的数据库用户帐户。
若要将字段分隔符值设置为一个控制字符,请使用 shell 的控制字符转义符号。在 Bash 中,可以使用美元符号 ($) 后跟加单引号的字符串的形式在实参中指定控制字符。此字符串可以包含 C 字符串转义(例如 \t 表示制表符)或反斜线 (\),后跟要使用的字符的八进制值。
以下示例演示了如何将分隔符字符设置为制表符 (\t)、垂直制表符 (\v) 以及垂直制表符的八进制值 (\013)。
$ vsql -At -c "SELECT * FROM testtable;"
A|1|2|3
B|4|5|6
$ vsql -F $'\t' -At -c "SELECT * FROM testtable;"
A 1 2 3
B 4 5 6
$ vsql -F $'\v' -At -c "SELECT * FROM testtable;"
A
1
2
3
B
4
5
6
$ vsql -F $'\013' -At -c "SELECT * FROM testtable;"
A
1
2
3
B
4
5
6