最近,我发现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命令时使用,这确实使我感到困惑。为什么一个宁愿 default过server_default?以及如何实现我想要的?我应该在中指定所有默认参数__init__吗?这似乎是代码重复:要更改默认值,我必须将其更改两次并保持这些值相等- 有什么办法可以避免这种情况?
tmodel_instance.foo
0
INSERT
default
server_default
__init__
您可以使用force_instant_defaultsfrom的监听器sqlalchemy_utils来更改此行为:
force_instant_defaults
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