db에 넣을때는 

SRID=4326;POINT(137.56276780042197 126.92813920924125)

ex)
location='SRID=4326;POINT(137.56276780042197 126.92813920924125)'

 

db에 있는 Point type은 불러오면 에러를 뱉는다 그러므로 처리를해줘야한다 

원인은 WKBElement 이놈 때문이다

 

1. 이방식으로 하면 response_model이 작동을 안함

stmt = select(Table).where(Table.id == trable_id)
travel = session.exec(stmt).one_or_none()

travel = jsonable_encoder(travel, custom_encoder={
    WKBElement: lambda
        location: f"{to_shape(location).x},{to_shape(location).y}"})

2.이방식으로 하면 잘받아온다 하지만 복잡한 구조로된 모델일경우 이마저 작동을 안한다

from geoalchemy2.shape import to_shape

class ModelRead(ModelBase):
    id: int
    create_at: datetime.datetime
    updated_at: datetime.datetime
    user_id: int
    location:str # point 받아오는 변수명
    
    @validator('location', pre=True, allow_reuse=True, whole=True, always=True)
    def correct_geom_format(cls, v):
        if not isinstance(v, WKBElement):
            raise ValueError('must be a valid WKBE element')
        return f"{to_shape(v).x},{to_shape(v).y}"

 

 

point타입이 위도,경도를 모두 포함하여 개꿀인줄 알았으나 쓰면 골치가 많이아프다..그래서 다시 나눠서쓴다..

 

 

 

 

 

참고:

https://stackoverflow.com/questions/66044397/how-to-create-a-sqlalchemy-class-attribute-from-a-calculated-field-in-sql-query

반응형

+ Recent posts