StringPropertyためのGQLクエリでは大文字小文字を区別しないwhere句
-
11-09-2019 - |
質問
のGoogle AppEngineのデータストアを使用して、大文字と小文字を区別しませんStringPropertyデータ型でWHERE句を指定するGQLクエリを実行する方法はありますか?私はいつも。ドキュメントはどこが私の値の大文字と小文字が区別されるように指定する値は中がどうなるかわからない場合、これは影響を受けないようにする方法はありますか?
インスタンスのDBモデルはこのことでしょう
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
解決
私は、データストア内のそのような演算子がないと思います。
あなたがカテゴリデータの入力を制御しますか?もしそうなら、あなたは(すべて小文字またはすべて大文字)でそれを保存するために標準的な形式を選択する必要があります。オリジナルと1、標準化された1と1 - あなたには、いくつかの理由でオリジナルケースを格納する必要がある場合は、ちょうど2つの列を格納することができます。あなたは、通常の操作を行うことができますこの方法WHERE句ます。
他のヒント
データストアは、大文字小文字を区別しない比較をサポートしていません。ピーターが示唆するように、溶液は、標準のものに加えて、あなたの文字列の正規化されたバージョンを格納することです。 AETycoon のライブラリ内のプロパティのクラスは、特に、DerivedPropertyを便利証明することができる。
このスレッドは便利だったと私は部分検索一致を可能にするために同様のアプローチに貢献したくなります。私は、データストアの種類の1つの以上のフィールドを追加し、セットとして正規化されたフレーズの各単語を保存して衝突させるフィルタで使用します。これは、Clojureの持つ例です。データベースとの対話は、任意の言語に変換する必要がありながら使いやすい、(#clojureに@raekのおかげで)少なくともJavaへの変換すべき部分を正規ます:
(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])]))))))