gpt4 book ai didi

python - Flask-SQLAlchemy .like() 方法引发 NotImplementedError

转载 作者:太空宇宙 更新时间:2023-11-03 11:03:20 24 4
gpt4 key购买 nike

我在使用 like() 方法构建 Flask-SQLAlchemy 查询时遇到问题,该方法应该使用 SQL LIKE 语句构建查询。

根据 SQLAlchemy docs like 方法可以像这样在列上调用:

select([sometable]).where(sometable.c.column.like("%foobar%")) 

我有一个 ModelClass,它是 Flask-SQLAlchemy db.Model 类的子类。定义如下:

class ModelClass(db.Model):
# Some other columns ...
field1 = db.Column(db.Integer(), db.ForeignKey('my_other_class.id'))
rel1 = db.relationship("MyOtherClass", foreign_keys=[field1])

然后我有一个循环,我在其中动态构建过滤器。在循环外,我使用这些过滤器来过滤查询。我的循环内部稍作修改,如下所示:

search_term = '%{}%'.format(search_string)
my_filter = getattr(ModelClass, field_string).like(search_term)

这会在 like 方法所在的行引发错误:

NotImplementedError: <function like_op at 0x101c06668>

它会为任何文本字符串引发此错误。 python docs对于 NotImplementedError 说:

This exception is derived from RuntimeError. In user defined base classes, abstract methods should raise this exception when they require derived classes to override the method.

这不是 AttributeError,所以我认为 like 方法是存在的,但还有其他错误,我不确定是什么。

更新

现在我正在更仔细地查看模型定义,我认为问题可能是我在关系而不是 Column 类型上执行此操作。

我看到 type(getattr(ModelClass, field_string)) 给出:

<sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x102018090>

因为这不是 Column 类型,所以我查看了 field_string 的值,发现传递的值之一实际上是 rel1 .

所以我想这就是“答案”,但我仍然很困惑为什么在 rel1 上调用 .like() 没有引发 AttributeError

最佳答案

所以我已经确认问题是我试图将 .like() 方法应用于关系属性而不是列。

我更改了我的代码以直接调用子模型类,而不是尝试通过父类的关系来访问子类列。像这样:

search_term = '%{}%'.format(search_string)
my_filter = getattr(ChildModelClass, field_string).like(search_term)

关于python - Flask-SQLAlchemy .like() 方法引发 NotImplementedError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26876731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com