Копирование данных с красным смещением 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)
оба передаются без предупреждения, но данные не загружаются
Идеи?
Спасибо
Ответы
Ответ 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)''')