SQLalchemy: разрешены ли "цепочечные" объекты построения? - PullRequest
1 голос
/ 17 июня 2019

Я получаю ложные ошибки в приложении 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 ()", которая преобразует запрос в список результатов и выглядит немного глупо в ретроспективе. Конечно, это пережиток того времени, когда эта штука была просто одним простым запросом без дополнительных фильтров и объединений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...