SQL-алхимия: ValueError слишком много значений для распаковки?
У меня есть сайт, работающий с базой данных mysql с использованием пакета sql-alchemy, который внезапно сломался. Я провел некоторое исследование и обнаружил, что ожидаемая проблема заключается в том, что новейшее обновление sql-alchemy передает flagk-admin еще одно значение, которое ожидается от
"cls, key = identity_key(instance=obj)"
Источник
Предлагаемое исправление - отредактировать файлы, чтобы принять третий элемент, но я не могу сделать это с разрешениями, которые у меня есть в моей среде.
Другой ответ связан с репозиторием на github, но я не могу понять, как это мне помогает. Я очень новичок в этом, и я не знаю, должен ли я клонировать репо или как именно это сделать, если я это сделаю.
Любая помощь приветствуется!
Вот дамп ошибки
2018-01-22 20:01:59,593: [2018-01-22 20:01:59,592] ОШИБКА в приложении: исключение при / резервировании / добавлении [GET]
2018-01-22 20: 01: 59,594: обратная связь (последний вызов был последним):
2018-01-22 20: 01: 59,594:
Файл "fakepath / flask / app.py", строка 1982, в wsgi_app
2018-01-22 20: 01: 59,594: response = self.full_dispatch_request () 2018-01-22 20: 01: 59,594: Файл "fakepath / flask / app.py", строка 1614, в full_dispatch_request
2018-01-22 20: 01: 59,594: rv = self.handle_user_exception (e)
2018-01-22 20: 01: 59 595: файл "fakepath / flask / app.py", строка 1517, в handle_user_exception2018-01-22 20:01:59 595: ререйз (exc_type, exc_value, tb)2018-01-22 20:01:59,595: файл "fakepath / flask / _compat.py", строка 33, в ререйзе
2018-01-22 20: 01: 59 595: повышение значения2018-01-22 20: 01: 59 595: файл "fakepath / flask / app.py", строка 1612, в full_dispatch_request
2018-01-22 20: 01: 59,595: rv = self.dispatch_request ()
2018-01-22 20: 01: 59,596: файл "fakepath / flask / app.py", строка 1598, в dispatch_request2018-01-22 20:01:59,596: вернуть self.view_functionsrule.endpoint
2018-01-22 20: 01: 59,596: Файл "fakepath/flask_login/utils.py", строка 261, в decor_view
2018-01-22 20: 01: 59,596: функция возврата (* args, ** kwargs)
2018-01-22 20: 01: 59,597: файл "/home/apoalphagammawebmaster/inventory/app/auth/views.py", строка 248, в add_reservation
2018-01-22 20: 01: 59,597: форма = форма, название = "Добавить бронирование")
2018-01-22 20: 01: 59,597: файл "fakepath/flask/templating.py", строка 134, в render_template2018-01-22 20: 01: 59,597: context, ctx.app)
2018-01-22 20: 01: 59,597: Файл "fakepath/flask/templating.py", строка 116, в _render
2018-01-22 20: 01: 59,597: rv = template.render (контекст)
2018-01-22 20: 01: 59,598: Файл "fakepath/jinja2/asyncsupport.py", строка 76, в рендере
2018-01-22 20: 01: 59,598: вернуть original_render(self, *args, **kwargs)2018-01-22 20:01:59,598: Файл "fakepath/jinja2/environment.py", строка 1008, в рендере
2018-01-22 20: 01: 59,598: вернуть self.environment.handle_exception (exc_info, True)
2018-01-22 20: 01: 59,598: Файл "fakepath/jinja2/environment.py", строка 780, в handle_exception
2018-01-22 20: 01: 59 599: ререйз (exc_type, exc_value, tb)
2018-01-22 20: 01: 59 599: Файл "fakepath/jinja2/_compat.py", строка 37, в ререйзе
2018-01-22 20: 01: 59 599: повышение значения.with_traceback (tb)
2018-01-22 20: 01: 59 599: Файл "/home/apoalphagammawebmaster/inventory/app/templates/auth/reservations/reservation.html", строка 2, в коде шаблона верхнего уровня
2018-01-22 20: 01: 59,599:
{% extends "base.html"%}
2018-01-22 20: 01: 59 599: Файл "/home/apoalphagammawebmaster/inventory/app/templates/base.html", строка 48, в коде шаблона верхнего уровня
2018-01-22 20:01:59,600: {% тела блока%}
2018-01-22 20: 01: 59 600: Файл "/home/apoalphagammawebmaster/inventory/app/templates/auth/reservations/reservation.html", строка 27, в блоке "body"
2018-01-22 20: 01: 59,600: {{wtf.quick_form (форма)}}
2018-01-22 20: 01: 59,600: Файл "fakepath/jinja2/runtime.py", строка 579, в _invoke
2018-01-22 20: 01: 59,600: rv = self._func (* аргументы)
2018-01-22 20:01:59,601: Файл "fakepath/flask_bootstrap/templates/bootstrap/wtf.html", строка 205, в шаблоне
2018-01-22 20:01:59,601: {{ form_field(field,2018-01-22 20:01:59,601: Файл "fakepath/jinja2/runtime.py", строка 579, в _invoke
2018-01-22 20:01:59,601: rv = self._func (* аргументы)
2018-01-22 20:01:59,601: Файл "fakepath/flask_bootstrap/templates/bootstrap/wtf.html", строка 123, в шаблоне
2018-01-22 20:01:59,601:
{{field (class = "form-control", ** kwargs) | safe}}
2018-01-22 20:01:59,601: Файл "fakepath/wtforms/fields/core.py", строка 153, в вызове
2018-01-22 20:01:59,601: возвращение self.meta.render_field (self, kwargs)
2018-01-22 20:01:59,602:
Файл "fakepath/wtforms/meta.py", строка 56, в render_field2018-01-22 20:01:59,602: вернуть field.widget (field, ** render_kw)
2018-01-22 20:01:59,602: Файл "fakepath/wtforms/widgets/core.py", строка 287, в вызове2018-01-22 20:01:59,602: для val, метка, выбранная в field.iter_choices ():
2018-01-22 20:01:59,602: Файл "fakepath/wtforms/ext/sqlalchemy/fields.py", строка 107, в iter_choices
2018-01-22 20:01:59,602: для pk, obj в self._get_object_list ():
2018-01-22 20:01:59,602: Файл "fakepath/wtforms/ext/sqlalchemy/fields.py", строка 100, в _get_object_list
2018-01-22 20:01:59,602: self._object_list = list ((text_type (get_pk (obj)), obj) для obj в запросе)
2018-01-22 20: 01: 59,603: Файл "fakepath/wtforms/ext/sqlalchemy/fields.py", строка 100, в
2018-01-22 20:01:59,603: self._object_list = list((text_type(get_pk(obj)), obj) для obj в запросе)
2018-01-22 20: 01: 59,603: Файл "fakepath/wtforms/ext/sqlalchemy/fields.py", строка 189, в get_pk_from_identity
2018-01-22 20: 01: 59,603: cls, key = identity_key (instance = obj)
2018-01-22 20: 01: 59,603: ValueError: слишком много значений для распаковки (ожидается 2)
2 ответа
Проблема описана в ветке вопросов github - https://github.com/flask-admin/flask-admin/issues/1588
В основном, flask-admin
Пакет pip устарел, что касается последних sqlalchemy
Пип пакет. В этой конкретной области,
cls, key = identity_key(instance=obj)
sqlalchemy
сейчас возвращает 3 объекта, но flask-admin
ожидает только 2, следовательно, ошибка.
Реальное решение для этого состоит в том, чтобы ждать, пока новый flask-admin
версия загружается в pip, до этого у вас есть несколько вариантов.
- Вручную войдите и отредактируйте это
fields.py
файл - Как подробно описано в этой теме, лимит
sqlalchemy
к версии1.2.0b3
, Вы можете сделать это в вашем файле require.txt или вручную, установив обновление pip,pip install --upgrade sqlalchemy==1.2.0b3
- Как исправить это в
flask-admin
Мастер ветки в их github хранилище, установите эту версиюflask-admin
с местоположением пунктаgit+https://github.com/flask-admin/flask-admin
, Опять же, вы делаете это в вашем файле require.txt или при установке pip-обновления,pip install --upgrade git+https://github.com/flask-admin/flask-admin
,
Мое личное предпочтение и то, что я сделал, это вариант 3. Если вы просматриваете сам код, это строка, которую сопровождающие хотят удалить, во всяком случае, и как они справляются с этим лучше, и в целом с этими вещи, которые я предпочитаю идти вперед (последняя версия flask-admin
) вместо того, чтобы сдерживать вещи (откат sqlalchemy
предыдущей версии), и, конечно, лучше, чем редактирование исходного кода вручную.
У меня тоже была эта проблема. Я получил хаки (как описано выше), чтобы работать, но, глядя на обсуждения на https://github.com/wtforms/wtforms/issues/373 и https://github.com/flask-admin/flask-admin/issues/1588 Issues / 1588, похоже, что поддержка wtforms_sqlalchemy не так хороша, как wtforms_alchemy.
Итак, я установил wtforms_alchemy
pip install wtforms_alchemy
и заменил wtforms_sqlalchemy на wtform_alchemy в моем проекте
from wtforms_alchemy.fields import QuerySelectField
и мой проект работал так же.