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

时间:2014-11-11 23:45:30

标签: python sqlalchemy flask-sqlalchemy

我无法使用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

1 个答案:

答案 0 :(得分:2)

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

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

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