使用with_polymorphic对模型进行查询时,SQLAlchemy在字符串形式的order_by映射参数下抛出异常

1 投票
1 回答
2163 浏览
提问于 2025-04-17 23:38

我在使用SQLA继承时遇到了一个问题(我在这里有一个带有__mapper_args__的混合类)。

要重现这个问题:

  • 模型应该有一个__mapper_arg__属性,并且order_by参数设置为任意字符串。
  • 在查询这个模型时,添加with_polymorphic('*')调用。
class User(Base):
    id = Column(Integer, primary_key=True)
    name = Column(String)

    __mapper_args__ = {'order_by': 'User.name'}

按照这个方式,一切都运行得很好,除了当我们在查询中添加with_polymorphic('*')时。

db.query(User).with_polymorphic('*')

这会导致异常

File "/python2.7/dist-packages/sqlalchemy/sql/visitors.py", line 267, in clone
    'no_replacement_traverse' in elem._annotations:
AttributeError: 'str' object has no attribute '_annotations'

我觉得这可能是个bug。不过因为在SQLA 0.7-0.9版本中都能重现这个问题,我对自己遇到这个问题的方式有些怀疑。也许我做错了什么?

这个问题在一个小测试案例中被重现。


附言:

最初我在我的项目中需要这个混合类:

class DocMixin(object):

    id = Column(Integer)
    title = Column(String(255))

    @declared_attr
    def __mapper_args__(cls):
        return {'order_by': 'title'}

1 个回答

0

order_by这个参数里,不要用字符串,直接用列名就可以了。把'User.name'改成name,你的例子就能通过测试了。

撰写回答