使用Psycopg2将数据从S3复制到AWS Redshift时出错

时间:2018-09-04 20:44:40

标签: python postgresql amazon-redshift psycopg2

在使用psycopg2执行COPY命令时,收到错误消息:

psycopg2.ProgrammingError: unterminated quoted string at or near "'"
LINE 12:    NULL as '

这是我的原始查询:

"""copy dcm_floodlight_raw_abg_stg (COLUMN_NAMES)
from 'S3_BUCKET_PATH'
CREDENTIALS 'aws_access_key_id=KEY;aws_secret_access_key=SECRET'
gzip
DELIMITER '\t'
DATEFORMAT as 'yyyy-mm-dd'
BLANKSASNULL 
TRUNCATECOLUMNS 
FILLRECORD
MAXERROR 100
ACCEPTINVCHARS as '?'
NULL as '\0';"""

不太确定为什么会收到此错误,因为对于其他任何单引号,它都不会引发此错误。

1 个答案:

答案 0 :(得分:1)

查询有问题时,您可以使用psycopg2 mogrify function来查看字符串是否存在问题。它将尝试插入任何参数,因此可以很好地进行检查。由于我没有游标对象可以调用它,因此我这样做:

print psycopg2.extensions.adapt(YOUR_QUERY).getquoted()

在您的情况下,它给出:

>>> import psycopg2
>>> print psycopg2.extensions.adapt(YOUR_QUERY).getquoted()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: A string literal cannot contain NUL (0x00) characters.

>>> print psycopg2.extensions.adapt('\\0').getquoted()
'\\0'
>>>

因此您可以看到它不喜欢'\0'。如果您按照John Rotenstein的建议转义了反斜杠,则psycopg2将接受查询,但可能不会为您提供空值所需的内容。 documentation建议,如果可以对插值进行整理,它应该可以工作。