поэтому я пытался запросить около 200 тыс. строк из mariaDB, используя следующий код.
with engine.connect() as connection:
print("test1")
result = connection.execute(sqlalchemy.text(query))
dates = [print("test2") for row in result]
print(len(dates))
engine.dispose()
Это работает с первого раза. а потом второй раз завис после печати test1
. Затем, прервав его с помощью Ctrl + C, я могу запустить его снова. и так далее
Какова возможная причина, я неправильно обрабатываю соединение? есть ли возможный обходной путь?
База данных работает нормально с другой системой. и этого не произошло для меньшего запроса.
я нашел следующую ошибку в системном журнале: (Я скрываю некоторые детали внутри <>)
Jul 5 16:52:46 <machine_name> mysqld[1571843]: 2024-07-05 16:52:46 3094934790 [Warning] Aborted connection 3094934790 to db: '<db_name>' user: '<db_user>' host: '<db_host>' (Got an error reading communication packets)
@snakecharmerb можешь уточнить, какие замки ты имел в виду? запрос только «SELECT», поэтому БД не будет налагать блокировки для этого, верно?
вряд ли это является причиной, настройка my.cnf уже в несколько раз превышает рекомендуемое значение. в другой системе также не возникнет проблем с выполнением того же запроса.
Оказывается, проблема заключалась в том, что я не получил результат должным образом и не закрыл его.
вот как это сделать правильно
with engine.connect() as connection:
print("test1")
result = connection.execute(sqlalchemy.text(query))
while(True):
row=result.fetchone() # get one row
if row is None: # break when there is no row left
break
print(row)
result.close() # close the result
engine.dispose()
еще лучше fetchall()
метод возвращает все строки и затем закрывает результат. поэтому все, что мне нужно сделать, это:
with engine.connect() as connection:
print("test1")
result = connection.execute(sqlalchemy.text(query)).fetchall()
for row in result:
print(row[0])
engine.dispose()
Вы проверили замки?