【GaussDB(DWS)】导入导出之copy使用详解

举报
wzhyalfa 发表于 2020/11/30 23:36:13 2020/11/30
【摘要】 数据导入导出之copy使用方式,【数仓实践】GaussDB(DWS)导入导出之copy使用详解


收集了四种copy使用方式

 1. gsql元命令\copy

1
2
3
4
5
\copy { table [ ( column_list ) ] | ( query ) } 
      from to } { filename | stdin | stdout | pstdin | pstdout } [ with ] [ binary ] [ oids ] 
      [ delimiter [ as 'character' ] [ null as 'string' ] [ csv [ header ] 
      [ quote [ as 'character' ] [ escape as 'character' 
      force quote column_list | * ] [ force not null column_list ] ]

举例

image.png

 2. Sql语法的copy指令

1
2
3
4
5
6
7
8
9
10
11
12
13
COPY table_name [ ( column_name [, ...] ) ] 
    FROM 'filename' | STDIN }
    [ [ USING ] DELIMITERS 'delimiters' ]
    [ WITHOUT ESCAPING ]
    [ LOG ERRORS ]
    [ LOG ERRORS data ]
    [ REJECT LIMIT 'limit' ]
    [ [ WITH ] ( option [, ...] ) ]
    | copy_option
    | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [  ...] ]
     
可选参数option子句语法有:
FORMAT 'format_name'| OIDS [ boolean ]| DELIMITER 'delimiter_character'NULL 'null_string'| HEADER [ boolean ]| FILEHEADER 'header_file_string'| FREEZE [ boolean ]| QUOTE 'quote_character'ESCAPE 'escape_character'| EOL 'newline_character'| NOESCAPING [ boolean ]| FORCE_QUOTE { ( column_name [, ...] ) | * }| FORCE_NOT_NULL ( column_name [, ...] )| ENCODING 'encoding_name'| IGNORE_EXTRA_DATA [ boolean ]| FILL_MISSING_FIELDS [ boolean ]| COMPATIBLE_ILLEGAL_CHARS [ boolean ]| DATE_FORMAT 'date_format_string'| TIME_FORMAT 'time_format_string'| TIMESTAMP_FORMAT 'timestamp_format_string'| SMALLDATETIME_FORMAT 'smalldatetime_format_string'

image.png

> LOG ERRORS  参数是一旦copy from存在非法记录时,记录到public.pgxc_copy_error_log错误表中,该表通过"SELECT copy_error_log_create() "创建错误日志表

> LOG ERRORS DATA与LOG ERRORS差别在于是否登记错误行数据信息(rawrecord)

> REJECT LIMIT 'limit',其中'limit'取值在1-INTMAX,若不限制该值则填写'unlimited'

> 未指定LOG ERRORS时,一旦存在出错行记录,直接报错

 3. java的CopyManager接口

> 执行时需要加载GaussDB(DWS) JDBC驱动

> 其实际使用是的copy xxx from/to STDIN/STDOUT标准输入或标准输出进行文件的加载、导出

 4. python psycopg2的copy_from/copy_to方法(有限使用)

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python
import psycopg2
 
***
with open('dat.txt''r') as f:
  cur.copy_from(f, 'wzy1',sep=',')
  sql="SELECT * from wzy1"
  cur.execute(sql)
  print(cur.fetchall())
  #[(1, 'a'), (2, 'b'),(3, 'c')]


差异点说明

  1.  使用元命令“\copy”或python psycopg2“copy_from/copy_to”,只需要普通用户即可执行,但错误处理能力有限,只能整体成功或整体失败,且加载的是客户端文件;

  2. 指定服务器文件的SQL的copy语法:

    > 一旦指定服务器的文件,该copy命令只允许拥有sysadmin权限执行,不论是否存在LOG ERRORS

  3. 通过标准输入进行数据加载的SQL的copy语法:

    > 普通用户也可以使用copy from STDIN命令

    > 若希望使用错误日志表,则需提前在public创建日志表,且给对应普通用户赋权,然后就可以正常使用

    管理员:select copy_error_log_create();  grant insert,select on public.pgxc_copy_error_log to wzy;

    普通用户:copy wzy.wzy1 from STDIN log errors reject limit 'unlimited' with (delimiter ',') ;

    即实现: gsql -d postgres -p 25308 -ar -U wzy -W xxx  -c "copy wzy1 from STDIN log errors reject limit 'unlimited' with (delimiter ',')" < dat.txt

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。