# Model마다 redis connection을 연결하는 경우Customer.Meta.database=get_redis_connection(url="redis://localhost:6379",decode_responses=True))# 전체 같은 redis connection인 경우 redis=get_redis_connection()Migrator(redis).run()
importdatetimefromtypingimportOptionalfrompydanticimportEmailStrfromredis_omimportHashModelclassCustomer(HashModel):first_name:strlast_name:stremail:EmailStrjoin_date:datetime.dateage:intbio:Optional[str]andrew=Customer(# andrew라는 Customer 객체 생성first_name="Andrew",last_name="Brookins",email="andrew.brookins@example.com",join_date=datetime.date.today(),age=38,bio="Python developer, works at Redis, Inc.")# 모델은 unique PK를 자동으로 생성한다.print(andrew.pk)# (Redis 통신 따로 필요 없음.)# > '01FJM6PH661HCNNRC884H6K30C'# `save()` 호출로 Redis에 모델 저장 andrew.save()# pk로 Customer 에서 객체를 찾을 수도 있다.assertCustomer.get(andrew.pk)andrew
자동으로 생성되는 PK는 unique 하며 정렬 가능하다. (sortable)
저장하게 되면 default는 다음과 같이 저장된다.
Key : :{package}:{class_name}:{pk}
Value : pk, 정의된 field들
직접 원하는 내부 값으로 pk값 지정해 줄 수 있다. 이 경우, 따로 PK field가 생성되지 않는다.
1
2
3
4
5
6
7
8
9
10
11
classCustomer(HashModel):# `:{package}:{class_name}:{first_name}` 으로 키가 생성된다.first_name:str=Field(primary_key=True)last_name:stremail:EmailStrjoin_date:datetime.dateage:intbio:Optional[str]...Customer.get(f"{first_name}")# PK로 쿼리시 지정 PK로 찾을 수 있다.
기본적으로 :{package}:{class_name}:{pk} 의 키 구조를 갖고 있기 때문에, 나중에 리팩토링으로 인하여 파일의 위치가 변경되거나 class의 이름이 변하게 되면 데이터를 찾을때 찾기 어려울 수 있다. 이를 대비하여, 나에게 맞는 key 네이밍으로 생성할 수 있다. Base Model의 기본 Meta class릴 보면 다음과 같은 모양으로 되어있으며 필요에 따라 세팅해주면 된다.
기존 레디스에서는 데이터 스키마를 강제하지 않고 있지만 Redis OM의 Pydantic model을 이용하면 다른 RDB에서와 같이 validation을 체크 할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
try:Customer(first_name="Andrew",last_name="Brookins",email="Not an email address!",join_date=datetime.date.today(),age=38,bio="Python developer, works at Redis, Inc.")exceptValidationErrorase:print(e)"""
pydantic.error_wrappers.ValidationError: 1 validation error for Customer
email
value is not a valid email address (type=value_error.email)
"""
fromredis_omimportget_redis_connectionclassCustomer(HashModel):first_name:strlast_name:str=Field(index=True)# 인덱싱할 키를 정해주고 email:EmailStrjoin_date:datetime.dateage:int=Field(index=True)bio:Optional[str]# last name이 "Brookins" 인 모든 customersCustomer.find(Customer.last_name"Brookins").all()
fromredis_omimportEmbeddedJsonModel,JsonModel,FieldclassAddress(EmbeddedJsonModel):address_line_1:straddress_line_2:Optional[str]city:str=Field(index=True)state:str=Field(index=True)country:strpostal_code:str=Field(index=True)classCustomer(JsonModel):first_name:str=Field(index=True)last_name:str=Field(index=True)email:str=Field(index=True)join_date:datetime.dateage:int=Field(index=True)bio:Optional[str]=Field(index=True,full_text_search=True,default="")address:Address# "San Antonio, TX"에 사는 모든 customers 구하기 Customer.find(Customer.address.city"San Antonio",Customer.address.state"TX")