Атрибут default класса Column
Атрибут default класса Column задает значение по умолчанию для столбца таблицы. Значение подставляется SQLAlchemy на стороне Python в момент вставки строки, если для столбца не передано явное значение. Атрибут принимает как скалярное значение, так и вызываемый объект, который SQLAlchemy вызовет при каждой вставке.
Синтаксис
Column(..., default=value)
Пример
Давайте создадим таблицу articles и зададим для столбца status скалярное значение по умолчанию:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, Session
Base = declarative_base()
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String)
status = Column(String, default='draft')
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article 1')
session.add(article)
session.commit()
print(article.status)
Результат выполнения кода:
"draft"
Пример
Теперь передадим в default вызываемый объект, чтобы значение вычислялось при каждой вставке:
import datetime
from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.orm import declarative_base, Session
Base = declarative_base()
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String)
created_at = Column(DateTime, default=datetime.datetime.now)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article 1')
session.add(article)
session.commit()
print(article.created_at)
Результат выполнения кода:
"2024-01-01 12:00:00.000000"
Пример
Давайте посмотрим, какие значения попадают в базу данных при явной передаче и без нее:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, Session
Base = declarative_base()
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String)
status = Column(String, default='draft')
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
first = Article(title='article 1')
second = Article(title='article 2', status='published')
session.add_all([first, second])
session.commit()
print(first.status)
print(second.status)
Результат выполнения кода:
"draft"
"published"
Смотрите также
-
класс
Column,
который представляет столбец таблицы -
атрибут
server_default,
который задает значение по умолчанию на стороне сервера -
атрибут
onupdate,
который задает значение при обновлении строки -
атрибут
nullable,
который определяет допустимость значения NULL