команда flask sqlalchemy update sql raw не дает никакого ответа

#python #sqlalchemy

#python #sqlalchemy

Вопрос:

Я пытаюсь выполнить обновление с помощью flask-sqlalchemy, но когда он попадает в сценарий обновления, он ничего не возвращает. кажется, скрипт зависает или ничего не делает.

Я попытался обернуть try catch в код, который не завершается, но ошибок нет.

Я дал ему 10 минут на выполнение инструкции update, которая обновляет только 1 запись, и все же по какой-то причине она ничего не сделает.

Когда я отменяю скрипт, он выдает ошибку Ошибка канала связи (0) (SQLEndTran), но я не думаю, что это основная причина ошибки, потому что в том же скрипте у меня есть другие sql-скрипты, которые работают нормально, поэтому подключение к БД хорошее

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

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

Я также попытался сначала распечатать sql-скрипт на python перед выполнением. Я запустил команду printed sql в своем браузере sql, и она работала нормально.

Код очень прост, я не совсем уверен, почему у него возникла проблема.

 #!/usr/bin/env python3

from flask_sqlalchemy import sqlalchemy
import glob


files_directory = "/files_dir/"

sql_string = """
    select * 
    from table
    where status is null
    """

# ommited conn_string
engine1 = sqlalchemy.create_engine(conn_string)
result = engine1.execute(sql_string)

for r in result:
    engine2 = sqlalchemy.create_engine(conn_string)
    filename = r[11]
    match = glob.glob(f"{files_directory}/**/{filename}.wav")

    if not match:
        print('no match')

        script = "update table set status = 'not_found' where filename = '"   filename   "' "
        engine2.execute(script)
        engine2.dispose()

    continue

engine1.dispose()
 

Комментарии:

1. Если engine2 это не отдельная база данных, вам не нужно создавать новую engine на каждой итерации вашего цикла. Кроме того, если вы не вводите свое if not match условие, вы не удаляете engine2 .

2. да, это то, что я делал раньше. в моем коде объявлен только 1 движок, а функция dispose вызывается только в конце. Я просто добавил их, просто чтобы проверить, будет ли по-другому, но это то же самое

Ответ №1:

похоже, что если я попытаюсь перебрать 26 тыс. записей, скрипт не сработает. но когда я пытаюсь выполнить по 2 тыс. записей за один запуск, тогда скрипт будет работать. таким образом, моя строка sql станет (добавлена top 2000 в запросе)

 sql_string = """
    select top 2000 * 
    from table
    where status is null
    """
 

это руководство, да, но оно работает для меня, так как мне просто нужно запустить этот скрипт один раз. (Я имею в виду 13 раз)

Комментарии:

1. Я могу перебирать максимум 4k записей. если я попытаюсь перебрать 5 тысяч записей выше, скрипт по какой-то причине не работает.