Flask-SQLAlchemy查询子字符串在整个字符串中的数据库

时间:2014-10-15 11:03:40

标签: python mysql sql flask-sqlalchemy

对于不耐烦的人,我正在寻找一种执行此查询的方法: 来自Flask-SQLAlchemy模型的SELECT * FROM area WHERE '125122141113166' LIKE CONCAT(area.code, '%') ORDER BY LENGTH(area.code) DESC

以下是有关设置的更多信息: 我有下表(不相关的字段丢弃):

+----------------------------------+
|code|location                     |
+==================================+
|12  |startupzone2                 |
+----------------------------------+
|123 |startupzone2subzone3         |
+----------------------------------+
|1234|startupzone2subzone3building4|
+----------------------------------+
|126 |startupzone2subzone6         |
+----------------------------------+
|1287|startupzone2subzone8building7|
+----------------------------------+

我希望能够通过代码找到位置,但提供的搜索字符串格式为" 125122141113166"。我可以在开头使用查询来检索最相关的位置,但我想使用ORM(如果可能的话)。到目前为止,我已经读过我可以将match ... against ...与全文索引一起使用,但是当我尝试在表上创建全文索引时出现错误。 目前我正在使用上面的查询从表中提取主键并使用Area.query.get(pkey)来获取对象,但我正在寻找一种更好的方法来实现它,如果存在的话。谢谢!

1 个答案:

答案 0 :(得分:0)

由于我无法确定Flask-SQLAlchemy或SQLAlchemy是否提供了执行此操作的方法,因此我向我的类添加了以下静态方法:

@staticmethod
def match(location):
    query = "SELECT id FROM rate WHERE {0} LIKE CONCAT(area.code, '%%')  ORDER BY LENGTH(area.code) DESC LIMIT 1".format(location)
    try:
        res = db.engine.execute(query).first()
        return None if not res else Area.query.get(res[0])
    except SQLAlchemyError as e:
        print "Unable to get location for for location code {0}, reason: {1}".format(location, str(e))
    return None

我可以将它用作Area.match(位置),这不是最好但足以满足我的需求。