【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 ] ]
|
举例
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'
|
> 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')]
|
差异点说明
-
使用元命令“\copy”或python psycopg2“copy_from/copy_to”,只需要普通用户即可执行,但错误处理能力有限,只能整体成功或整体失败,且加载的是客户端文件;
-
指定服务器文件的SQL的copy语法:
> 一旦指定服务器的文件,该copy命令只允许拥有sysadmin权限执行,不论是否存在LOG ERRORS
-
通过标准输入进行数据加载的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
- 点赞
- 收藏
- 关注作者
评论(0)