SQLAlchemy/カラムのデフォルト値
from SQLAlchemy
https://docs.sqlalchemy.org/en/14/core/metadata.html#sqlalchemy.schema.Column.params.server_default
SQLAlchemyのモデルのカラムには、2つのデフォルト値があることに注意する。
Pythonプログラム上のデフォルト値 default
DBMS上のデフォルト値 server_default
モデルのインスタンスを作ってINSERTする際は default の値が採用される。
server_default を指定すると、カラムを追加するDDLに DEFAULT が指定される。
あとからNOT NULLなカラムを追加する際に default だけを指定して server_default が未指定だと、DBMSの設定によってはカラムの追加に失敗する。server_default に値を指定してやる必要がある。
特にMySQLだと、SQL modeが緩いと暗黙のデフォルト値に気づかない可能性があるので注意する。
text() で囲んだ文字列はそのままSQLに埋め込まれる。したがって text("FALSE") は FALSE になる。
code:model_server_default.py
class Tag(Base):
__tablename__ = "tag"
id = Column(Integer, primary_key=True, autoincrement=True)
# タグの編集が許可されているかどうか
# このカラムをあとから足すときに default だけを指定していてハマった
edit_freezed = Column(
Boolean, default=False, server_default=text("FALSE"), nullable=False
)
ちなみに onupdate に対応する server_onupdate もある。
だいたい updated_at みたいなカラムを更新するぐらいだと思うけど、アプリケーションから触るだけなら onupdate=datetime.now で事足りると思う。