Недавно я понял, что по умолчанию 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__? Кажется, это дублирование кода: для изменения значения по умолчанию мне нужно дважды его изменить и поддерживать равенство значений - есть ли способ избежать этого?