首页 > 解决方案 > 如何在 sqlalchemy 中将默认值设置为自定义类型?

问题描述

我想为我的自定义列类型设置一个列默认值。

目前我有这个:

score = Column(ScoreType, default=Score())

或者

score = Column(ScoreType, ColumnDefault(Score()))

我创建了一个数据库条目,但没有使用score=Score(). 当我尝试访问score实例 ( entry.score.total += 1) 时,我收到错误消息AttributeError: 'NoneType' object has no attribute 'total'。如果我创建一个明确设置分数的数据库条目,那么它就可以工作。

例如以下DateTime类型的作品:

timestamp = Column(DateTime, ColumnDefault(datetime.datetime.now()))

我的类型类如下所示:

class ScoreType(types.TypeDecorator):
    impl = types.String

    def process_bind_param(self, value, dialect):
        return repr(value)

    def process_result_value(self, value, dialect):
        return Score.create_score(value)

我为此使用另一个类:

class Score:
    def __init__(self, result: int = 0, total: int = 0):
        self.total = total
        self.result = result

    def __repr__(self):
        return f"{self.result}/{self.total}"

    @classmethod
    def create_score(cls, string: str) -> 'Score':
        r, t = int(string.split('/'))
        return cls(result=int(r), total=int(t))

知道如何设置默认值吗?

关于 stackoverflow 的另一个问题处理了类似的主题。但是,它并不完全适合我的问题,并且尚未得到最终答案。

标签: pythonsqlalchemyorm

解决方案


我通过调整init方法解决了这个问题:

if not kwargs.get('score'):
    self.score = Score()

推荐阅读