본문 바로가기

Python

Python으로 Firestore Database (클래스를 통한 입출력)

앞서 dictionary 에 담아 CRUD를 구현한 내용을 포스팅하였습니다.

클래스를 통한 입출력

 

Cloud firesotre는 클래스로 문서작성을 지원하므로 아래 예제에서는 클래스를 통한 입출력 예제를 테스트해 보겠습니다.

[이전 포스팅] : Python으로 Firestore Database 다루기 (설정 / CRUD)

[예제 원문] : Firesore 데이터 추가 및 관리

city.py

class City(object):
    def __init__(self, name, state, country, capital=False, population=0,
        regions=[]):
        self.name = name
        self.state = state
        self.country = country
        self.capital = capital
        self.population = population
        self.regions = regions

    @staticmethod
    def from_dict(source):
        city = City(source[u'name'], source[u'state'], source[u'country'])

        if u'capital' in source:
            city.capital = source['capital']
        
        if u'population' in source:
            city.population = source['population']

        if u'regions' in source:
            city.regions = source[u'regions']
        return city
        

    def to_dict(self):
        dest = {u'name': self.name,
                u'state': self.state,
                u'country': self.country
        }

        if self.capital:
            dest[u'capital'] = self.capital

        if self.population:
            dest[u'population'] = self.population

        if self.regions:
            dest[u'regions'] = self.regions

        return dest

    def __repr__(self):
        return(
            f'City( \
                name={self.name}, \
                country={self.country}, \
                capital={self.capital}, \
                population={self.population}, \
                capital={self.capital}, \
                regions={self.regions}\
            )'
        )

 

city_set.py

import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore

from city import City

cred = credentials.Certificate("./first-firestore.json")

firebase_admin.initialize_app(cred)
db = firestore.client()

cities_ref = db.collection(u'cities')
cities_ref.document(u'BJ').set(
    City(u'Beijing', None, u'China', True, 21500000, [u'hebei']).to_dict())

cities_ref.document(u'SF').set(
    City(u'San Francisco', u'CA', u'USA', False, 860000, 
    [u'west_coast', u'norcal']).to_dict())

cities_ref.document(u'LA').set(
    City(u'Los Angeles', u'CA', u'USA', False, 3900000,
    [u'west_coast', u'socal']).to_dict())

cities_ref.document(u'DC').set(
    City(u'Washington D.C.', None, u'USA', True, 680000,
    [u'east_coast']).to_dict())

cities_ref.document(u'TOK').set(
    City(u'Tokyo', None, u'Japan', True, 9000000,
    [u'kanto', u'honshu']).to_dict())

 

실행 결과

city_get.py

import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore

from city import City

cred = credentials.Certificate("./first-firestore.json")

firebase_admin.initialize_app(cred)
db = firestore.client()

doc_ref = db.collection(u'cities').document(u'SF')

doc = doc_ref.get()
if doc.exists:
    print(f'Document data: {doc.to_dict()}')
else:
    print(u'No such document!')
city = City.from_dict(doc.to_dict())
print(city)

 

실행결과

$ python3 city_get.py 
Document data: {'country': 'USA', 'population': 860000, 'regions': ['west_coast', 'norcal'], 
'state': 'CA', 'name': 'San Francisco'}

City(name=San Francisco,          country=USA,            capital=False,
     population=860000,           capital=False,          regions=['west_coast', 'norcal']
)

 

 

쿼리, 정렬, 제한

 

입력된 데이터를 가져오기 위해 다양한 조건 입력이 가능합니다.

RDBMS 처럼 WHERE 절을 이용해 조건을 추가하고, direction 구문을 이용해 정렬, limit 절을 이용해 데이터 수신 제한을 걸 수 있습니다.

[예제 원문] Firestore 데이터 읽기

city_where.py

 

import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore

from city import City

cred = credentials.Certificate("./first-firestore.json")

firebase_admin.initialize_app(cred)
db = firestore.client()

docs = db.collection(u'cities').where(u'capital', u'==', True).stream()

print("capital is True -----")
for doc in docs:
    print(f'{doc.id} => {doc.to_dict()}')

print("order by name limit -2 -----")
cities_ref = db.collection(u'cities')
query = cities_ref.order_by("name").limit_to_last(2)
results = query.get()

for doc in results:
    print(f'{doc.id} => {doc.to_dict()}')

print("order by name desc limit 3 -----")
query = cities_ref.order_by(
    u'name', direction=firestore.Query.DESCENDING).limit(3)

results = query.stream()

for doc in results:
    print(f'{doc.id} => {doc.to_dict()}')

실행 결과

capital is True -----
BJ => {'capital': True, 'name': 'Beijing', 'population': 21500000, 'regions': ['hebei'], 'state': None, 'country': 'China'}
DC => {'capital': True, 'name': 'Washington D.C.', 'population': 680000, 'regions': ['east_coast'], 'state': None, 'country': 'USA'}
TOK => {'capital': True, 'country': 'Japan', 'state': None, 'regions': ['kanto', 'honshu'], 'population': 9000000, 'name': 'Tokyo'}

order by name limit -2 -----
LA => {'country': 'USA', 'state': 'CA', 'regions': ['west_coast', 'socal'], 'population': 3900000, 'name': 'Los Angeles'}
BJ => {'capital': True, 'name': 'Beijing', 'population': 21500000, 'regions': ['hebei'], 'state': None, 'country': 'China'}

order by name desc limit 3 -----
DC => {'capital': True, 'country': 'USA', 'population': 680000, 'regions': ['east_coast'], 'state': None, 'name': 'Washington D.C.'}
TOK => {'capital': True, 'name': 'Tokyo', 'population': 9000000, 'regions': ['kanto', 'honshu'], 'state': None, 'country': 'Japan'}
SF => {'name': 'San Francisco', 'population': 860000, 'regions': ['west_coast', 'norcal'], 'state': 'CA', 'country': 'USA'}