All about

File "lib/sqlalchemy/cyextension/resultproxy.pyx", line 16, in sqlalchemy.cyextension.resultproxy.BaseRow.__init__
  File "lib/sqlalchemy/cyextension/resultproxy.pyx", line 73, in sqlalchemy.cyextension.resultproxy._apply_processors
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/sql/sqltypes.py", line 2722, in process
    return json_deserializer(value)
  File "/usr/local/lib/python3.10/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python3.10/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/lib/python3.10/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

sqlalchemy 를 사용하여 mariadb 를 quary하는 과정에서 위와 같은 에러를 겪었다. 에러를 발생시킨 구문은 아래와 같은데

db.query(self.model).all()

# db: session object
# self.model: table object
# table에 존재하는 row 전부를 읽어오는 과정에서 에러가 발생한 것

 

 

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

 

이 에러메세지는 여러가지 경우 발생하는데,

1. quary하는 table에 조회 시도한 column이 존재하지 않는 경우

2. db column에 정의된 data type과 python code의 table column data type이 다른 경우

3. row에 저장된 값 자체가 문제가 있는 경우

 

이번에 겪은 경우는 3번이었다.

# python code에 저장된 table column
from sqlalchemy import Column, JSON
performance = Column(JSON)

# db에 저장된 실제 값과 data type
{'mIoU':'89.2%'} longtext

여기서 문제가된 값은 ' 홑따옴표(single quote)인데, 이 값을 " 쌍따옴표(double quote)로 변경하니 에러는 해결되었다.

 

굳이 longtext 로 선언하고 python dictionary 형태를 저장한 것은 epoch 별 성능 같은, 꽤 큰 형태의 dictionary 가 저장될 수 있기 때문이었다.

 

특이점은, sql quary문으로는 정상적으로 동작했었다는 것, 그래서 해결이 생각보다 오래 걸렸다.

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading