python - 如何在 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 的另一个问题处理了类似的主题。但是,它并不完全适合我的问题,并且尚未得到最终答案。
解决方案
我通过调整init方法解决了这个问题:
if not kwargs.get('score'):
self.score = Score()
推荐阅读
- sql-server - 聚类索引新基数算子灾难性估计
- c++ - 使用 bash 连接到 unix-socket
- image - Flutter 图像保存在 iOS 中变得模糊
- javascript - 与 Chorme 相比,为什么在 Firefox 上运行地理定位时会给出更准确的结果
- angularjs - 简单的 AngularJS 路由示例不起作用
- angular - Angular - 渲染后如何执行代码
- google-chrome - Chromium 调试构建没有 TCMalloc 符号
- c# - IDisposable 对象的 Observable:如何处理上一个值 onNext 和 onComplete?
- r - 每日时间序列分析(周一至周五)
- windows - 通过批处理脚本中的参数调用等待微调器