对于不耐烦的人,我正在寻找一种执行此查询的方法:
来自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)
来获取对象,但我正在寻找一种更好的方法来实现它,如果存在的话。谢谢!
答案 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(位置),这不是最好但足以满足我的需求。