#python #sqlalchemy #amazon-redshift
Вопрос:
Я создал соединение с помощью redshift-коннектора и нахожу ряд возможных проблем. Все, что я пытаюсь сделать, это настроить (надежную) функцию в моей библиотеке, которая создаст курсор и выполнит переданную инструкцию sql с включенной автоматической фиксацией, нам нужно как минимум поддерживать delete from
и select from
.
Настройка подключения:
conn = redshift_connector.connect(
host=db_host,
port=5439,
database=db_name,
user=db_user,
password=db_pass
)
Обратите внимание, что в моей библиотеке мы используем декоратор @property следующим образом:
@property
def conn(self):
conn = redshift_connector.connect(
...
)
Затем, когда я попытаюсь следовать инструкциям здесь https://pypi.org/project/redshift-connector/ при выполнении инструкций sql я сталкиваюсь с множеством проблем. На самом деле, пожалуй, единственное, что я видел в работе, — это select
.
Например,
cursor = conn.cursor()
res = cursor.execute("delete from schema.table where col = "val"
res.close()
В результате ничего не удаляется.
Тогда, если я это сделаю
conn.autocommit = True
cursor = conn.cursor()
res = cursor.execute("delete from schema.table where col = "val"
res.close()
Я получаю 3 блокировки, созданные в Redshift, предоставлено разрешение ShareRowExclusiveLock:True, предоставлено разрешение AccessShareLock:True, предоставлено разрешение ShareRowExclusiveLock:False, и оператор execute зависает, пока я не удалю блокировки. После удаления блокировок, в зависимости от того, завершу ли я правильную блокировку или нет, инструкция execute либо завершится успешно, либо произойдет ошибка.
Прекращение всех блокировок приводит к тому, что при последующем выполнении ничего не удаляется.
Моя текущая теория заключается в том, что redshift-connector не создает и не удаляет блокировки правильно или эффективно.
В качестве примечания я обнаружил, что не могу поменять местами в sqlalchemy-redshift, последняя версия awswrangler, похоже, ожидает redshift-коннектор по какой-то неизвестной причине (не уверен, почему кто-то подумал, что было бы забавно изобрести колесо). Использование sqlalchemy postgresql psycopg2 или redshift psycopg2 приводит к ошибке атрибута, связанной с автоматической фиксацией. Также может показаться, что awswrangler не поддерживает и не работает с sqlalchemy’s execution_options(autocommit=True)
.
Я также добавлю, что страница pypi предполагает, что есть тег redshift_connector, но его нет.
Я был бы признателен за любую помощь здесь, если бы кто-нибудь знал, как заставить sqlalchemy работать с awswrangler, что было бы предпочтительнее.
Комментарии:
1. Насколько велик стол и как долго вы ждали?
2. Очень маленькая таблица, фактически созданная из фрейма данных 2×2 с числами,
df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
3. Я только что протестировал и обнаружил, что могу использовать sqlalchemy до тех пор , пока мне не требуются эксклюзивные блокировки, т. Е. До тех пор, пока мне это не требуется
autocommit=True
, поэтому такие операторы, какdelete from
кажется, работают. Однако это означало бы загрузку двух библиотек соединителей и использование другой функции в зависимости от желаемого действия.4. «ФИКСАЦИЯ» — это сохранение результатов. Если вы закроете соединение без фиксации результатов, в базе данных не будет никаких изменений. Автоматическая фиксация-это режим подключения, который добавляет ФИКСАЦИЮ после каждого оператора. Вот почему вы не видели никаких изменений без него. Вам необходимо явно указать ФИКСАЦИЮ, если вы не находитесь в режиме автоматической фиксации, чтобы изменения были сохранены.
5. @BillWeiner Я включил автоматическую фиксацию с помощью redshift-коннектора, однако результаты по-прежнему крайне непредсказуемы. Вы предлагаете мне добавить sqlalchemy.engine.execute(‘commit;»)?