簡體   English   中英

使用SQLAlchemy查詢空字符串或Null

[英]Query for empty string or Null using SQLAlchemy

我對數據庫設計和網頁設計還很陌生,所以請多多包涵。

我有一個Flask應用程序,需要使用flask-sqlalschemy根據URL中傳遞的參數在數據庫中進行搜索,例如:

.../index?part_number=123*321$description1=&description2=TestText

星號將被解釋為一個或多個字符,而**將被解釋為單個字符。 因此,我將它們替換為%和_,並終止所有特殊字符。

我的問題是:在數據庫中,某些字段將為空字符串,而某些字段將為Null。 但是我需要將它們都解釋為空字符串,以便當arg為空或*時將它們返回。

我知道我可以按照.like(part_number == None | part_number == '%') 但是,我只想在搜索字符串為*的情況下執行此操作,但是當我有10個不同的args(所有和)在一起時,如何以一種巧妙的方式做到這一點?

這是相關代碼的摘要。 我不太確定如何制作一個可以本身運行以進行測試的小程序。

filter_args = ['part_number', 'description1', 'description2']  # actual code has ~10 args
filters = dict()
for arg in filter_args:
  filter_str = request.args.get(arg, type=str, default='*')  # get filter arg from url

  filter_str = '*' if filter_str == '' else filter_str  # if the filter string is empty, search for all

  #  Replace * by % and ** by _ and terminate special chars
  filter_str = filter_str.replace('\\', '\\\\')
  filter_str = filter_str.replace('%', '\%')
  filter_str = filter_str.replace('_', '\_')
  filter_str = filter_str.replace('**', '_')
  filter_str = filter_str.replace('*', '%')
  filters[filter_name] = filter_str

parts = Part.query.filter(
  Part.part_number.ilike(filters['part_number']),  # and
  Part.description1.ilike(filters['description1']),  # and
  Part.description2.ilike(filters['description2'])
).order_by(Part.part_number)

COALESCE函數返回第一個參數表達式的值,該值不等於NULL(如果所有值都等於NULL,則返回NULL)。 因此,如果您想將NULL零件號視為空字符串,則可以

func.coalesce(Part.part_number, '').ilike(filters['part_number'])

當我遇到這個問題時,我正在尋找一種過濾null或空字符串的方法。 雖然Ilja的答案對於OP問題的具體內容是正確的,但我想我會補充說,合並函數也適用於我的情況。 如果OP正在尋找part_number為None或為空的行:

Pat.query.filter(func.coalesce(Part.part_number, '') == '')

暫無
暫無

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

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