小编典典

为什么在提交对象之前SQLAlchemy默认列值不可用?

python

最近,我发现SQLAlchemy的Column默认值不起作用,因为我希望它能:

>>> Base = declarative_base()
>>> class TestModel(Base):
    ...     __tablename__ = 'tmodel'
...     id = sa.Column(sa.Integer, primary_key=True)
...     foo = sa.Column(sa.Integer, default=0)
...    
>>> tmodel_instance = TestModel()
>>> print tmodel_instance.foo
None
>>> session.add(tmodel_instance)
>>> print tmodel_instance.foo
None
>>> session.commit()
>>> print tmodel_instance.foo
0

我想在对象实例化之后tmodel_instance.foo立即相等0,但是似乎默认值仅在执行INSERT命令时使用,这确实使我感到困惑。为什么一个宁愿
defaultserver_default?以及如何实现我想要的?我应该在中指定所有默认参数__init__吗?这似乎是代码重复:要更改默认值,我必须将其更改两次并保持这些值相等-
有什么办法可以避免这种情况?


阅读 225

收藏
2020-12-20

共1个答案

小编典典

您可以使用force_instant_defaultsfrom的监听器sqlalchemy_utils来更改此行为:

from sqlalchemy_utils import force_instant_defaults

force_instant_defaults()

class TestModel(Base):
    __tablename__ = 'tmodel'
    id = sa.Column(sa.Integer, primary_key=True)
    foo = sa.Column(sa.Integer, default=0)

model = TestModel()
assert model.foo == 0
2020-12-20