본문 바로가기

Dev./Google App Engine

Datastore - NDB API(Python) : 데이터 조회 하기(Query)

Property 값으로 데이터 필터링 하기

Model의 query 클래스를 활용한다.

query에 필터를 추가하여 여러가지 조건을 적용 할 수 있다.

예를 통해 살펴 보자

#        userid가 '123'인 데이터를 조회하고 싶은 경우
        qry = Account.query()
        qry = Account.query(Account.userid == 123)
        rslt = qry.fetch()
        
#        두가지 이상 조건을 적용 하고 싶은 경우
        qry = Account.query(Account.userid >= 123, Account.userid < 456, ...)
        rslt = qry.fetch()

        
#        query를 중첩하여 여러가지 조건을 적용 할 수도 있다.
        qry = Account.query()
        qry1 = qry.filter(Account.userid >= 123)
        qry2 = qry1.filter(Account.userid < 456)

        rslt = qry.fetch()
        rslt1 = qry1.fetch()
        rslt2 = qry2.fetch()

간단하다.




AND, OR 연산자

ndb.AND(조건1, 조건2, ...)

ndb.OR(조건1, 조건2, ...)

이런식으로 사용 할 수 있다.

#        ndb.OR
        qry = Account.query(ndb.OR(Account.userid == 123, Account.userid == 125, Account.userid == 456))
#        ndb.AND
        qry = Account.query(ndb.AND(Account.userid == 123, Account.username == 'Sandy'))




Repeated Property (List) 조회하기

repeated property의 경우 list 형태로 값을 저장 하기 때문에 여러가지 조회 형태가 있을 수 있다.

class Article(ndb.Model):
    title = ndb.StringProperty()
    contents = ndb.StringProperty()
    stars = ndb.IntegerProperty()
    tags = ndb.StringProperty(repeated = True)


        """
#        Data 세팅
        article = Article(title='Introduction to Python',
                    stars=5,
                    tags=['python'])
        article.put()
        
        article = Article(title='Perl + Python = Parrot',
                           stars=5,
                           tags=['python', 'perl'])
        article.put()
        
        article = Article(title='Introduction to Perl',
                    stars=3,
                    tags=['php', 'perl'])
        article.put()
        
        article = Article(title='Ruby + Python',
                           stars=4,
                           tags=['python', 'ruby'])
        article.put()
        
        article = Article(title='JRuby + Python',
                           stars=4,
                           tags=['python', 'jruby'])
        article.put()
        """

#        tags property에 'perl'이 입력된 데이터 검색
        qry = Article.query(Article.tags == 'perl')
#        또는
#        qry = Article.query(Article.tags.IN(['perl']))
        rslt = qry.fetch()
        
#        tags property에 'perl'과 'ruby'가 동시에 입력된 데이터 검색
        qry2 = Article.query(Article.tags.IN(['perl', 'ruby']))
#        또는 
#        qry2 = Article.query(ndb.OR(Article.tags == 'perl', Article.tags == 'ruby'))
        rslt2 = qry2.fetch()




"!=", "IN" 연산자

property != value 연산자는 

ndb.OR(property > value, property < value)로 표현 할 수 있다.

property.IN([value1, value2, ...]) 연산자는

ndb.OR(property == value1, property == value2, ...)로 표현 할 수 있다.




정열하기

query 클래스의 order 함수를 이용하면 된다.

#        제목 오름차순 정열
        qry = Article.query().order(Article.title)
        
#        제목 오름차순, 별점 내림차순
        qry = Article.query().order(Article.title, -Article.stars)

order 함수를 이용하고 local 에서(테스트 서버) 테스트 하면 자동으로 index.yaml 파일이 생성 되는 것을 확인 할 수 있다.


index.yaml 파일은 index 정보를 담고 있다. 자세한 내용은 https://developers.google.com/appengine/docs/python/config/indexconfig 링크를 참조.

(자동으로 생성되니까 일단 신경쓰지 않는다.)



부모키로 조회하기

부모키가 있는 경우 이를 이용해 데이터를 조회 할 수 있다.

key = ndb.Key(BlogPost, 12345)
qry = Comment.query(ancestor=key)

#위에 나온 다른 조건들과 같이 사용 할 수도 있다.
qry = Comment.query(Comment.tags == 'python', ancestor=key).order(Comment.date)




Structured Property로 조회하기

간단한 예를 통해 살펴보자

#        city property가 'Amsterdam'인 Address를 갖는 Contact를 조회 
        qry = Contact.query(Contact.addresses.city == 'Amsterdam')
        
#        city property가 'Amsterdam'인 Address, 또는 type property가 'work'인 Address를 갖는 Contact를 조회
        qry = Contact.query(Contact.addresses.city == 'Amsterdam', Contact.addresses.type == 'work')
        
#        city property가 'Amsterdam', type property가 'work'인 Address를 갖는 Contact를 조회
        qry = Contact.query(Contact.addresses == Address(city = 'Amsterdam', type = 'work'))




GenericProperty(Expando)로 조회 하기

Expando의 경우 entity구조를 동적으로 생성하기 때문에 일반적인 Mine.bar == 'blah' 요런 조건들이 먹히질 않는다.

bar라는 property가 미리 정의되지 않았기 때문인데, 이런 경우 아래와 같은 방법으로 조회 할 수 있다.

qry = Mine.query(ndb.GenericProperty('bar') == 'blah')


반응형