python - Flask-SQLAlchemy 查询,其中子字符串在数据库中针对整个字符串

标签 python mysql sql flask-sqlalchemy

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

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

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

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

最佳答案

由于我无法确定 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(location) 这不是最好的但足以满足我的需求。

关于python - Flask-SQLAlchemy 查询,其中子字符串在数据库中针对整个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26380945/

相关文章:

python - Pyramid 架构迁移

java - 更改原始图像文件的颜色权重

mysql - 如何在不同电脑之间移动xampp?

python - python 可读性的用法

Python 嵌套数据持久化

mysql - 需要一种优雅的方式来找到数百个匹配项,而无需执行数百个查询

mysql - 如何从 sql 中仅以 A-Z 开头的字段中选择行

php - false 时继续执行代码

mysql - SQL:将多行转换为同一行中的列

mysql - 在 MySQL 中使用 LIMIT 和 OFFSET 是否比返回完整记录集更便宜?