簡體   English   中英

SQLAlchemy 查詢,其中列包含 substring

[英]SQLAlchemy query where a column contains a substring

我正在使用 SQLAlchemy 和 SQLite3 構建一個查詢,其中我想要 select 行,其中字符串列包含特定的 substring。 實現這一目標的最佳方法是什么?

嘗試這個

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

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 Declarative(在Flask中使用的),它是Model.query.filter(Model.field.ilike(expr))

雖然table.c.column.like("%...%")應該可以工作,但有更直接的方式來表達你想要的東西:

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

這通常會生成相同的SQL查詢,但最好是為初學者閱讀。 請注意,包含似乎不會轉義為“_”“%”

@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來接收用戶希望搜索的變量,並且我正在轉換該變量以將其存儲在另一個名為look_for的變量中(因為var不能直接在查詢中使用),使用format()和log1存儲查詢的元組。

這是在 sqlalchemy 的最新版本中 di 的一種方法

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM