Was*_*sdo 2 python mysql sqlalchemy sqlalchemy-migrate flask-sqlalchemy
我有一个运行mysql数据库的网站使用sql-alchemy包突然崩溃了.我做了一些研究,发现预期的问题是最新的sql-alchemy更新正在向flask-admin交付一个比预期更多的值
"cls, key = identity_key(instance=obj)"
Run Code Online (Sandbox Code Playgroud)
来源
建议的修复是编辑文件以接受第三个项目,但我无法使用我在环境中的权限执行此操作.
另一个答案链接到github上的回购,但我无法弄清楚这对我有什么帮助.我对此非常陌生,我不知道是否应该克隆回购或者如果我是这样做的话.
任何帮助表示赞赏!
这是错误转储
2018-01-22 20:01:59,593:[2018-01-22 20:01:59,592]应用程序中的错误:/ reservation/add [GET]
2018-01-22 20:01:59,594:Traceback(大多数情况下)最近的呼叫最后):
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年1月22日20:01:59594:文件"fakepath /烧瓶/ app.py",线1614,在full_dispatch_request
2018年1月22日20:01:59594: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:reraise(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:return self.view_functionsrul e.endpoint 2018-01-22
20:01:59,596:文件"fakepath/flask_login/utils.py",第261行,在decorated_view
2018-01-22 20:01:59,596:return func(*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:form = form, title ='Add Reservation')
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(context)
2018-01- 22 20:01:59,598:文件"fakepath/jinja2/asyncsupport.py",第76行,渲染
2018-01-22 20:01:59,598:return original_render(self,*args,**kwargs)2018-01- 22 20:01:59598:文件"fakepath/Jinja2的/ environment.py",线路1008,在渲染
2018年1月22日20:01:59598:返回self.environment.handle_exception(exc_info,真)
2018年1月22日20:01:59,598:文件"fakepath/jinja2/environment.py",第780行 ,在
handle_exception 2018-01-22 20:01:59,599:reraise(exc_type,exc_value,tb)2018-01-22
20:01:59,599:文件"fakepath/jinja2/_compat.py",第37行,再加入
2018年-01-22 20:01:59,599:raise value.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:{%block body%}
2018-01-22 20:01:59,600:文件"/ home /apoalggammawebmaster/inventory/app/templates/auth/reservations/reservation.html",第27行,在块"body"
2018-01-22 20:01:59,600:{{wtf.quick_form(form)}}
2018-01 -22 20:01:59,600:文件"fakepath/jinja2/runtime.py",第579行,在_invoke 2018-01-22
20:01:59,600:rv = self._func(*arguments)2018-01-22
20 :01:59,601:文件"fakepath/flask_bootstrap/templates/boots trap/wtf.html",第205行,在模板
2018-01-22 20:01:59,601:{{form_field(字段,2018-01-22 20:01:59,601:文件"fakepath/jinja2/runtime.py" ,第579行,在_invoke 2018-01-22
20:01:59,601:rv = self._func(*arguments)
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:File "fakepath/wtforms/fields/core.py",第153行, 电话
2018-01-22 20:01:59,601:return 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:return field.widget(field,**render_kw)2018-01-22
20:01:59,602:File" fakepath/wtforms/widgets/core.py",第287行,电话 2018-01-22 20:01:59,602:for val,label,field in 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:for pk,obj in sel f._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行,in
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)
这个问题在github问题线程中有所涉及 - https://github.com/flask-admin/flask-admin/issues/1588
基本上,flask-adminpip包已经过时了,就最新的sqlalchemypip包而言.在那个特定的地区,
cls, key = identity_key(instance=obj)
Run Code Online (Sandbox Code Playgroud)
sqlalchemy现在返回3个对象,但flask-admin只是期望2,因此错误.
在真正该解决方案是等到新flask-admin版本被上传到画中画,在那之前,你几个选项.
fields.py文件sqlalchemy版本1.2.0b3.您可以在requirements.txt文件中执行此操作,也可以使用pip upgrade install手动执行此操作,pip install --upgrade sqlalchemy==1.2.0b3flask-admin位于其github存储库的主分支中,因此请安装flask-admin该分区的pip位置git+https://github.com/flask-admin/flask-admin.再次,您可以在requirements.txt文件中执行此操作,或使用pip upgrade install执行此操作pip install --upgrade git+https://github.com/flask-admin/flask-admin.我个人的偏好,以及我所做的,是选项3.如果你仔细查看代码本身,那么维护人员想要移除的是一条线,无论如何,以及他们如何处理它更好,一般来说这些事情,我更喜欢前进(最新版本flask-admin),而不是把东西拿回来(回滚sqlalchemy到以前的版本),当然比手动编辑原始代码更好.