Дополнительное соединение для защиты основного соединенияPython

Программы на Python
Ответить
Anonymous
 Дополнительное соединение для защиты основного соединения

Сообщение Anonymous »

в нашем пакете, который мы используем для подключения к базе данных и выполнения каких-либо действий с ней (например, чтения таблицы, вставки данных и т. д.), у нас есть специальный метод, который мы передаем методу pandas.to_sql для вставки данных в SQLServer с помощью SQLalchemy.
У метода есть часть (метод и комментарий были сделаны человеком, создавшим этот метод, и он больше со мной не работает):

Код: Выделить всё

# By using a new connection we secure the main connection
# from getting invalidated in the case of connection drop.
# Otherwise, the transaction for inserting the whole dataframe
# gets rolled back once the main connection is invalidated
with conn.engine.connect() as new_conn:
new_conn.execute(table.table.insert(data))
и после обновления SQLalchemy в нашем репозитории до новейшей версии эта часть кода вызывала ошибки:

Код: Выделить всё

TypeError: TableClause.insert() takes 1 positional argument but 2 were given
Чтобы это исправить, мне пришлось
переписать его как:

Код: Выделить всё

stmt = sqlalchemy.insert(table.table).values(data)
with conn.engine.connect() as new_conn:
new_conn.execute(stmt)
new_conn.commit()
и

Код: Выделить всё

stmt = sqlalchemy.insert(table.table).values(data)
with conn.engine.begin() as new_conn:
new_conn.execute(stmt)
потому что метод вставки из sqlalchemy больше не является частью объекта Table.
Но с переписанным блоком скрипт простаивает в этом блоке и даже блокирует всю базу данных (поэтому я не могу выполнить, например, SELECT в интерпретаторе SQLserver).
Он будет заблокирован/"заморожен", пока я не завершу процесс, и он заморозится независимо от размера таблицы, которую я вставка.
Если вместо этого с блокировать с помощью new_conn, я делаю:

Код: Выделить всё

stmt = sqlalchemy.inserttable.table.values(data)
conn.execute(stmt)
все работает.
Человек, который сделал это с блоком with и new_conn, был более опытным, чем я, поэтому я полагаю, что у него были некоторые причины, чтобы сделать это таким образом.
Я хотел знать, необходимо ли с новой SQLalchemy использовать new_conn поверх существующего соединения, чтобы предотвратить повреждение данных во время вставки данных.
Когда при вставке данных в SQL мы используем пакеты и многопоточность вместо метода multi из pandas

Подробнее здесь: https://stackoverflow.com/questions/798 ... connection
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»