conn_string = "dbname='{}' port='{}' user='{}' password='{}' host='{}'"\
.format(dbname,port,user,password,host_url)
sql="""UNLOAD ('select col1,col2 from %s.visitation_hourly_summary_us where col4= '2018-07-10' and col5= '1';') TO 's3://%s/%s/%s.csv' \
credentials 'aws_access_key_id=%s;aws_secret_access_key=%s' \
MANIFEST GZIP ALLOWOVERWRITE;Commit;""" \
% (schema_name,s3_bucket_name, schema,table,aws_access_key_id,\
aws_secret_access_key)
con = psycopg2.connect(conn_string)
cur = con.cursor()
cur.execute(sql)
我正在尝试执行上述脚本以读取表,然后在S3中创建文件
由于我的列是字符串,所以我无法跳过单引号,并且在
附近出现语法错误此外,我尝试在条件仍然显示相同错误的地方给\。
任何帮助将不胜感激。
谢谢
答案 0 :(得分:2)
正如Sarang所说,只需在查询的col4和col5值中用双引号替换单引号即可解决问题。
但是我建议您将字符串分解为较小的块,以便于阅读和维护。这样,您应该能够按照chepner的建议使用execute
(和MySQL documentation):
# Create the inner SQL statement. Notice the single quotes for the general
# string and the double quotes for the col4 and col5 values
sql_stmt = ('SELECT col1, col2 '
'FROM %s.visitation_hourly_summary_us '
'WHERE col4 = "2018-07-10" AND col5= "1";' % schema_name)
# Format the s3 path
s3_target = 's3://%s/%s/%s.csv' % (s3_bucket_name, schema, table)
# Format credentials string
s3_credentials = 'aws_access_key_id=%s;aws_secret_access_key=%s' % (
aws_access_key_id, aws_secret_access_key)
# Create a tuple with all preformatted strings
data = (sql_stmt, s3_target, s3_credentials)
# Format the s3 query skeleton
s3_stmt = ("UNLOAD ('%s') TO '%s' "
"CREDENTIALS '%s' "
"MANIFEST GZIP ALLOWOVERWRITE;Commit;")
con = psycopg2.connect(conn_string)
cur = con.cursor()
cur.execute(s3_stmt, data)
答案 1 :(得分:1)
'(单引号可以作为发送)-> \\\\'
我在R和python中都使用过 请找到解决方法
如果您的SQL QUERY是
从sample_table中选择*,其中register_date ='2018-12-31'
然后执行卸载命令
sql= """unload ('Select * from tnltemp.otpsuccess_details where register_date=\\\\'2018-12-31\\\\' ')
to 's3://my-bucket/migration/exported_sample_table_' credentials
'aws_access_key_id=12234123;aws_secret_access_key=12345'
DELIMITER AS ','
NULL AS ''
parallel off;""""
cur = con.cursor()
cur.execute(sql)
答案 2 :(得分:1)
您还可以使用postgres样式:
.ansible/plugins/modules
答案 3 :(得分:0)
您可以将值放在双引号中。 '从%s.visitation_hourly_summary_us中选择col1,col2,其中col4 =“ 2018-07-10”和col5 =“ 1”;'
答案 4 :(得分:0)
这对我们的python函数有效。
如果您的查询包含引号(例如,用于括起文字值), 将文字放在两组单引号之间,您必须 还将查询括在单引号之间
UNLOAD ('select * from venue where venuestate=''NV''')
来自redshift文档: https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html