我无法使用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>
它会针对任何文本字符串引发此错误。 NotImplementedError
的Python docs说:
此异常派生自RuntimeError。在用户定义的基础中 类,抽象方法应该引发这种异常 要求派生类重写方法。
这不是AttributeError
,所以我认为like
方法存在,但其他错误并且我不确定是什么。
更新
现在我正在更仔细地查看模型定义,我认为问题可能是我在关系而不是Column
类型上执行此操作。
我看到type(getattr(ModelClass, field_string))
给出了:
<sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x102018090>
由于这不是Column
类型,因此我查看了field_string
的值,并看到传递的值之一实际上是rel1
。
所以我猜这是“答案”,但我仍然感到困惑,为什么在.like()
上调用rel1
没有提出AttributeError
。
答案 0 :(得分:2)
所以我确认问题是我试图将.like()
方法应用于关系属性而不是列。
我更改了我的代码以直接调用子模型类,而不是尝试从父级访问子类列以访问子类列。像这样:
search_term = '%{}%'.format(search_string)
my_filter = getattr(ChildModelClass, field_string).like(search_term)