SQLAlchemy查询列包含子字符串的位置

Dav*_*ave 27 python sqlite sqlalchemy

我正在使用SQLAlchemy和SQLite3构建一个查询,我想在其中选择一个String列包含特定子字符串的行.完成此任务的最佳方法是什么?

kar*_*eek 62

试试这个

Model.query.filter(Model.columnName.contains('sub_string'))
Run Code Online (Sandbox Code Playgroud)

  • @Wally刚刚重新审阅了这条评论,这对我来说并不是很有帮助 - 抱歉.这是更好的[sqlalchemy.orm.attributes.QueryableAttribute.contains](http://docs.sqlalchemy.org/en/latest/orm/internals.html?highlight=contains#sqlalchemy.orm.attributes.QueryableAttribute.contains) (2认同)
  • 对 Bluehorn 答案的进一步评论,但我遇到过 like(%...%) 有效但 contains() 根本不起作用的情况。还不知道为什么。 (2认同)

Pau*_*ine 30

过滤db.table.column.like('%needle%').还有ilike一个不区分大小写的搜索.

对于更高级的界面,您可以允许使用已知的"dir"通配符.

if '*' in needle or '_' in needle: 
    looking_for = needle.replace('_', '__')\
                        .replace('*', '%')\
                        .replace('?', '_')
else:
    looking_for = '%{0}%'.format(needle)

result = db.table.filter(db.table.column.ilike(looking_for))
Run Code Online (Sandbox Code Playgroud)

笔记:

  • db.table.filter并且db.table.column适用于SQLSoup(如果数据库是由另一个应用程序生成的,则SQLSoup非常有用)
  • 对于SQLAlchemy Core来说select(column_list).where(table.c.column.ilike(expr)).当您需要来自原始SQL的所有功能而无需使用字符串插值手动编写语句时使用此接口(沿着SQLSoup使用它进行内省,因此您不需要声明表)
  • 对于SQLAlchemy Declarative(Flask中使用的),它是 Model.query.filter(Model.field.ilike(expr))

  • @Wally Flask-SQLAlchemy 是一个将 SQLAlchemy 连接到 Flask 的便捷包。与 SQLAlchemy Declarative 相比,查询没有变化。 (2认同)

Blu*_*orn 13

虽然table.c.column.like("%...%")应该有效,但有更直接的方式来表达你想要的东西:

table.c.column.contains("needle")
Run Code Online (Sandbox Code Playgroud)

这通常会生成相同的SQL查询,但最好是为初学者阅读.请注意,包含似乎不会转义为"_""%".

  • like(%...%) 不是那么直接,不 - 但我有一组表(模型)将 field.contains(k) 转换为字段 LIKE '%%' || k|| 每次都是“%%” - 没有呈现正确的结果。 (2认同)

Sne*_*ran 5

@app.route('/<var>', methods=['GET'])
def getdb(var):
    look_for = '%{0}%'.format(var)
    log1 = table.query.filter(table.col.like(look_for))
Run Code Online (Sandbox Code Playgroud)

我使用过 SQLAlchemy 和 Flask(顶部的 app.route 是一个装饰器)。我使用 get API 来接收用户希望搜索的变量,并通过使用 format() 和log1 存储查询的元组。