[flask] TypeError: Object of type 'ColumnName' is not JSON serializable

jin·2023년 5월 13일

API 개발 중 다음 오류가 발생하였다.

TypeError: Object of type DbmsStatus is not JSON serializable

문제 상황을 특정하기 위해 response 내의 값들을 줄여 설명하겠다.
문제가 발생한 상황은 아래 코드의 return 구문이다.

    instanceGroup = models.InstanceGroup.query.filter(models.InstanceGroup.userId == userId).filter(models.InstanceGroup.id == instanceId).first()

    result['id'] = instanceGroup.id
    result['instanceName'] = instanceGroup.instanceName
    result['instanceStatus'] = instanceGroup.status
    
    return jsonify(result)

위 코드에서, InsdtanceGroup 의 model 코드는 다음과 같다. (간소화 하였음)

class InstanceGroup(db.Model):

    id = db.Column(db.BigInteger, primary_key=True, autoincrement=True)

    instanceName = db.Column(db.String(20), nullable=False)
    
    instanceStatus = db.Column(db.Enum(DbmsStatus), nullable=False)

instanceStatus Column 은 다른 Column 과 다르게, Enum Type의 변수다.
이 부분이 오류를 발생시킨 핵심이다.
해당 객체는 Enum Type Class이다.

class DbmsStatus(Enum):
    NORMAL = 'normal'
    ERROR = 'error'
    INSTALL = 'install'

따라서 다른 Column 처럼 JSON 형태로 변환되지 못하여 생긴 문제였다.

해결

    instanceGroup = models.InstanceGroup.query.filter(models.InstanceGroup.userId == userId).filter(models.InstanceGroup.id == instanceId).first()

    result['id'] = instanceGroup.id
    result['instanceName'] = instanceGroup.instanceName
    result['instanceStatus'] = instanceGroup.status.value
    
    return jsonify(result)

instanceGroup.status -> instanceGroup.status.value

다음과 같이 해결 할 수 있다.

0개의 댓글