Подтвердить что ты не робот

Копирование данных с красным смещением S3 на AWS с использованием python и psycopg2

У меня возникают проблемы с выполнением команды копирования для загрузки данных из S3 в Amazon Redshift из python.
У меня есть следующая команда копирования:

copy moves from 's3://<my_bucket_name>/moves_data/2013-03-24/18/moves'
credentials 'aws_access_key_id=<key_id>;aws_secret_access_key=<key_secret>'
removequotes
delimiter ',';

Когда я выполняю эту команду с помощью SQL Workbench/j, все работает так, как ожидалось, однако, когда я пытаюсь выполнить это с помощью python и psycopg2, команда проходит ОК, но данные не загружаются и не возникает ошибка.
попробовал следующие два варианта (предположим, что соединение psycopg2 в порядке, потому что оно есть):

cursor.execute(copy_command)  
cursor.copy_expert(copy_command, sys.stdout)

оба передаются без предупреждения, но данные не загружаются

Идеи?

Спасибо

4b9b3361

Ответ 1

Я использовал эту точную настройку (psycopg2 + redshift + COPY) успешно. Вы сделали это позже? SQL Workbench по умолчанию использует автоматическую фиксацию, в то время как psycopg2 по умолчанию открывает транзакцию, поэтому данные не будут отображаться до тех пор, пока вы не назовете commit() в своем соединении.

Полный рабочий процесс:

conn = psycopg2.connect(...)
cur = conn.cursor()
cur.execute("COPY...")
conn.commit()

Я не верю, что copy_expert() или любая из команд cursor.copy_ * работают с Redshift.

Ответ 2

Сначала убедитесь, что транзакция выполнена.

conn = psycopg2.connect(conn_string)
cur = conn.cursor()
cur.execute(copy_cmd_str)
conn.commit()

вы также можете обеспечить транзакцию-фиксацию следующим образом (обеспечение освобождения ресурсов),

with psycopg2.connect(conn_string) as conn:
    with conn.cursor() as curs:
        curs.execute(copy_cmd_str)

Когда соединение выходит из блока with, если исключение не было возбуждено блоком, транзакция завершается. В случае исключения транзакция откатывается.

Во-вторых, даже выполнение фиксации не помогает, когда загружаемые данные занимают много времени и превышают connect_timeout (и не могут совершать). Поэтому, когда явная фиксация не помогает, попробуйте увеличить время ожидания.

Ответ 3

Синтаксис должен быть похож на операторы DDL

# Create table
c.execute('''CREATE TABLE stocks
             (date text, trans text, symbol text, qty real, price real)''')