sqlite SQLAlchemy查询,其中列包含子字符串

zed5wv10  于 2022-11-24  发布在  SQLite
关注(0)|答案(5)|浏览(213)

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

ggazkfy8

ggazkfy81#

可以使用contains运算符进行筛选:

Model.query.filter(Model.columnName.contains('sub_string'))

若要在中求反,请使用not_运算子:

Model.query.filter(not_(Model.columnName.contains('sub_string')))
9njqaruj

9njqaruj2#

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))

备注:

  • db.table.filterdb.table.column用于SQLSoup(如果数据库由另一个应用程序创建,则SQLSoup很有用)
  • 对于SQLAlchemy Core,它是select(column_list).where(table.c.column.ilike(expr))。如果您希望从原始SQL获得所有功能,而不必使用字符串插值手动编写语句,则可以使用此接口(将它与SQLSoup一起用于内省,因此您不需要声明表)
  • 对于SQLAlchemy声明式(在 flask 中使用的声明式),它是Model.query.filter(Model.field.ilike(expr))
2fjabf4q

2fjabf4q3#

虽然table.c.column.like("%...%")应该可以工作,但有一种更直接的方式来表达您的需求:

table.c.column.contains("needle")

这通常会生成相同的SQL查询,但最好是为未启动的用户读取。请注意,contains似乎不会转义**"_""%"**。

vecaoik1

vecaoik14#

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

我使用了SQLAlchemy和Flask(app.route是一个装饰器),我使用get API接收用户希望搜索的变量,并使用format()将该变量转换为另一个名为look_for的变量(因为var不能直接用于查询),log1存储查询的元组。

gupuwyp2

gupuwyp25#

下面是在最新版本的sqlalchemy中执行di的方法。

query = select(table_name).where(table_name.column.contains("value_youre_searching_for"))
results = await db.execute(query)
data = results.scalars().all()

相关问题