Как избежать одиночных кавычек в Unload - PullRequest
0 голосов
/ 25 сентября 2018
    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

Так как мои столбцы строковые, я не могу пропустить одинарные кавычки, и я 'я получаю ошибку как синтаксическую ошибку около где

Также я попытался дать \ in, где условие все еще показывает ту же ошибку.

Любая помощь будет принята с благодарностью.

Спасибо

Ответы [ 5 ]

0 голосов
/ 03 мая 2019

Вы также можете использовать стиль postgres:

unload 
($$
select * from table where id='ABC'
$$)
to 's3://bucket/queries_results/20150324/table_dump/'
credentials 'aws_access_key_id=;aws_secret_access_key='
;
0 голосов
/ 03 мая 2019

Это то, что работает для наших функций Python.

Если ваш запрос содержит кавычки (например, для включения литеральных значений), поместите литерал между двумя наборами одинарных кавычек - вы также должны заключить запрос в одинарные кавычки:

UNLOAD ('select * from venue where venuestate=''NV''')

Взято из документации по красному смещению: https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html

0 голосов
/ 25 сентября 2018

Как говорит Саранг, простая замена одинарных кавычек на двойные в значениях col4 и col5 вашего запроса должна помочь.

Однако я бы посоветовал вам разбить строку на более мелкие куски, чтобы их было легче читатьи поддерживать.Таким образом, вы сможете использовать execute, как подсказывает Чепнер (и документация MySQL ):

# 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)
0 голосов
/ 05 января 2019

'(одинарные кавычки могут быть отправлены как) -> \\\\'

Я использовал это как в 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)
0 голосов
/ 25 сентября 2018

Вы можете поместить значения в двойные кавычки.'выберите col1, col2 из% s.visitation_hourly_summary_us, где col4 = "2018-07-10" и col5 = "1";'

...