不区分大小写凡在StringProperty GQL查询子句
-
11-09-2019 - |
题
使用谷歌应用服务引擎的数据存储,是否有执行GQL查询,指定上的StringProperty数据类型,它是不区分大小写的WHERE子句的方法吗?我常常难以确定的价值将是什么情况,该文档指定的地方是对的情况下我的价值观敏感,有没有办法让这个不敏感?
例如以分贝模型将是这样的:
from google.appengine.ext import db
class Product(db.Model):
id = db.IntegerProperty()
category = db.StringProperty()
和数据看起来像这样:
id category
===================
1 cat1
2 cat2
3 Cat1
4 CAT1
5 CAT3
6 Cat4
7 CaT1
8 CAT5
我想说
gqlstring = "WHERE category = '{0}'".format('cat1')
returnvalue = Product.gql(gqlstring)
和具有returnvalue
含有
id category
===================
1 cat1
3 Cat1
4 CAT1
7 CaT1
解决方案
我不认为有这样的数据存储中的操作员。
你控制类数据的输入?如果是这样,你应该选择一个规范的形式将其存储在(全部小写或全部大写)。如果你需要存储由于某种原因,原来的话,那么你可以只存放两列 - 一个与原来,一个与标准化的一个。这样,你可以做一个正常的WHERE子句。
其他提示
数据存储区不支持不区分大小写的比较,因为可以不使用它们的索引的查询(即禁止变换值的索引)。解决的办法是你除了字符串的归一化形式存储标准之一,彼得建议。该属性的类在 AETycoon 文库可以证明是有益的,特别是,DerivedProperty。
这个线程是有帮助的,让我想用类似的方法有助于使部分搜索可能匹配。我想补充的数据存储区类型多了一个现场和标准化短语每个单词保存为一组,然后使用过滤器发生碰撞。这是用Clojure的一个例子。正常化部分应很容易转化为java的至少(感谢@raek上#clojure),而数据库交互应可转化为任何语言:
(use '[clojure.contrib.string :only [split lower-case]])
(use '[appengine-magic.services.datastore :as ds])
; initialize datastore kind entity
(ds/defentity AnswerTextfield [value, nvalue, avalue])
; normalize and lowercase a string
(defn normalize [string-to-normalize]
(lower-case
(apply str
(remove #(= (Character/getType %) Character/NON_SPACING_MARK)
(java.text.Normalizer/normalize string-to-normalize java.text.Normalizer$Form/NFKD)))))
; save original value, normalized value and splitted normalized value
(defn textfield-save! [value]
(ds/save!
(let [nvalue (normalize value)]
(ds/new* AnswerTextfield [value nvalue (split #" " nvalue)]))))
; normalized search
(defn search-normalized [value]
(ds/query :kind AnswerTextfield
:filter [(= :nvalue (normalize value))]))
; partial normalized word search
(defn search-partial [value]
(flatten
(let [coll []]
(for [splitted-value (split #" " (normalize value))]
(merge coll
(ds/query :kind AnswerTextfield
:filter [(in :avalue [splitted-value])]))))))
不隶属于 StackOverflow