Я получаю ложные ошибки в приложении Flask / SQLAlchemy, которые мне не удалось воспроизвести. Но в журналах ошибок Apache я вижу большие дампы стека, которые заканчиваются так:
"Can't reconnect until invalid "
sqlalchemy.exc.InvalidRequestError: Can't reconnect until invalid transaction is rolled back
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
[ .... many lines of stack trace .... ]
"Can't reconnect until invalid "
sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) Can't reconnect until invalid transaction is rolled back
[SQL: SELECT chart.id AS chart_id, chart.anltyp AS chart_anltyp, chart.anlnum AS chart_anlnum, chart.przsrt AS chart_przsrt, chart.tst_art_num AS chart_tst_art_num, chart.regel AS chart_regel, chart.name AS chart_name, chart.anl_name AS chart_anl_name, chart.aktiv AS chart_aktiv_
FROM chart INNER JOIN clientview ON chart.anltyp = clientview.anltyp AND chart.anlnum = clientview.anlnum_
WHERE clientview.id = %s AND chart.aktiv != %s]
[parameters: [{}]]
Я не могу понять, что из оператора SQL является причиной или следствием этой ошибки, но то, что мне кажется странным, это бит "parameters: [{}]". Кажется, что для оператора SQL требуются параметры, но их выполнение не выполняется, чего не должно быть, потому что это генерируется SQLALchemy ORM. Код в вопросе:
charts = db.query(Chart)
if not new_view:
charts = charts.join(View).filter(View.id == view_id)
charts = charts.filter(Chart.aktiv != 0).all()
charts.sort(key=key_anlage)
Интересно, я что-то напутал, переназначив вещи в "графики". Я, вероятно, неоднократно создавал и уничтожал объект запроса. Код, конечно, легко реорганизуется (с некоторой избыточностью), например:
if not new_view:
charts = db.query(Chart).join(View).\
filter(View.id == view_id).\
filter(Chart.aktiv != 0).all()
else:
charts = db.query(Chart).\
filter(Chart.aktiv != 0).all()
charts.sort(key=key_anlage)
Я только что сделал это, и пока ошибка не повторялась, но я могу быть уверен только через день или два. Итак, мои вопросы:
1) Что может быть причиной того, что SQLAlchemy испускает оператор с пустыми параметрами?
2) Если бы это был мой код, какой был бы более разумный способ условного добавления объединений в оператор?
Может быть, это функция "chart = chart.all ()", которая преобразует запрос в список результатов и выглядит немного глупо в ретроспективе. Конечно, это пережиток того времени, когда эта штука была просто одним простым запросом без дополнительных фильтров и объединений.