我最近将SQLAlchemy和FormAlchemy更新为最新版本,并且发生了一件奇怪的事情。
我使用Mako模板显示模型中的数据。
的Python:
class Asset(object):
id = Column(Integer, primary_key=True, nullable=False)
...
@hybrid_property
def underscore_name(self):
return "x_underscore_name_x"
Mako模板:
<li>Item: ${Asset.underscore_name}</li>
在升级之前,网页呈现文本为:
Item: x_underscore_name_x
升级后显示:
Item: Asset.underscore_name
重要!正在执行该方法,但返回的结果未在网页上呈现。有什么想法吗?
修改
负责此行为的库是SQL Alchemy&gt; = 1.1.0。版本1.0.19没有此问题。让我们看看开发人员的回应是什么。
答案 0 :(得分:0)
Michael Bayer对报道的问题#4214发表了评论: 显示hybrid_property名称而不是返回值
Asset.underscore_name的值是一个SQL表达式,因为http://docs.sqlalchemy.org/en/latest/changelog/migration_11.html#hybrid-properties-and-methods-now-propagate-the-docstring-as-well-as-info中描述的更改是从Core理解的返回对象的 clause_element ()方法派生的。您在上面说明的混合没有正确编写,因为它没有返回Core SQL表达式对象:
performSegue(withIdentifier: "nextScreen", sender: nil)
如果要查找类绑定属性以返回字符串,只需指定它:
s = Session()
print(s.query(Asset.underscore_name))
sqlalchemy.exc.InvalidRequestError: SQL expression, column, or mapped entity expected - got ''x_underscore_name_x''
或者如果你希望它是一个可以在类级别调用的方法,使用@classproperty,这里有一个配方:https://stackoverflow.com/a/5191224/34549和SQLAlchemy有一个你可以复制的方法: https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/util/langhelpers.py#L1140
IMO这里没有错误,因为这不是@hybrid_property的正确用法
非常感谢迈克尔!