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

我在使用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)

这会在类似方法的行中引发错误:

NotImplementedError: <function like_op at 0x101c06668>

它会为任何文本字符串引发此错误.用于NotImplementedError的Python docs说:

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,所以我认为类似的方法存在,但其他的东西是错的,我不知道是什么.

更新

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

我看到那个类型(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)
点赞