![](/img/trans.png)
[英]Python - Postgres query using sqlalchemy returns "Empty Dataframe"
[英]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.