【问题标题】:How to set default value to a custom type in sqlalchemy?如何在 sqlalchemy 中将默认值设置为自定义类型?
【发布时间】:2021-08-22 20:02:45
【问题描述】:

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

目前我有这个:

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))

知道如何设置默认值吗?

Another question on stackoverflow 处理了类似的主题。但是,它并不完全适合我的问题,并且尚未得到最终答案。

【问题讨论】:

    标签: python sqlalchemy orm


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 2017-02-06
      • 2012-02-23
      相关资源
      最近更新 更多