문제

Google Appengine DataStore를 사용하면 Case Property Datatype의 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
도움이 되었습니까?

해결책

나는 데이터 스토어에 그런 연산자가 있다고 생각하지 않습니다.

카테고리 데이터의 입력을 제어합니까? 그렇다면 표준 형태를 선택하여 (모든 소문자 또는 모든 대문자) 보관해야합니다. 어떤 이유로 원래 케이스를 저장 해야하는 경우, 하나는 원래의 열이 있고 하나는 표준화 된 하나를 보관할 수 있습니다. 그렇게하면 조항을 할 수 있습니다.

다른 팁

Datastore는 쿼리를 사용하는 색인을 사용할 수 없기 때문에 Case Consensitive 비교를 지원하지 않습니다 (값을 변환하는 인덱스를 제외하고). 해결책은 Peter가 제안한 것처럼 표준 외에 정규화 된 문자열 버전을 저장하는 것입니다. 속성 클래스 Aetycoon 도서관은 특히 파생물로 도움이 될 수 있습니다.

이 스레드는 도움이되었으며 부분 검색 일치를 가능하게하기 위해 비슷한 접근 방식으로 기여하고 싶습니다. DataStore Kind에 하나 더 필드를 추가하고 각 단어를 정규화 된 문구에 세트로 저장 한 다음 필터에 사용하여 충돌합니다. 이것은 clojure의 예입니다. Normalize Part는 적어도 #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])]))))))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top