Атрибут server_default
Атрибут server_default класса Column задает
значение по умолчанию, которое подставляется на стороне
сервера базы данных. В отличие от атрибута default,
значение server_default вычисляется самой СУБД,
а не Python-кодом. В качестве значения можно передавать
строку SQL-выражения, объект text или функцию
func.
Синтаксис
Column(..., server_default=value)
Пример
Давайте создадим таблицу articles со столбцом
status, у которого серверное значение по умолчанию
равно строке 'article':
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import DeclarativeBase
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String)
status = Column(String, server_default='article')
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(
Article.__table__.insert().values(title='sqlite')
)
res = conn.execute(
Article.__table__.select()
).fetchall()
print(res)
Результат выполнения кода:
[(1, 'sqlite', 'article')]
Пример
Давайте передадим серверное значение по умолчанию
через объект text с произвольным SQL-выражением:
from sqlalchemy import create_engine, Column, Integer, String, text
from sqlalchemy.orm import DeclarativeBase
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String)
num = Column(Integer, server_default=text('42'))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(
Article.__table__.insert().values(title='sqlite')
)
res = conn.execute(
Article.__table__.select()
).fetchall()
print(res)
Результат выполнения кода:
[(1, 'sqlite', 42)]
Пример
Давайте используем функцию func, чтобы сервер
сам подставил текущее время через SQL-функцию
CURRENT_TIMESTAMP:
from sqlalchemy import create_engine, Column, Integer, String, DateTime, func
from sqlalchemy.orm import DeclarativeBase
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String)
status = Column(String, server_default=func.current_timestamp())
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(
Article.__table__.insert().values(title='user')
)
res = conn.execute(
Article.__table__.select()
).fetchall()
print(res)
Результат выполнения кода:
[(1, 'user', '2024-01-01 00:00:00')]
Пример
Давайте посмотрим на итоговый SQL-запрос, который
генерируется при создании таблицы с атрибутом
server_default:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.schema import CreateTable
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String)
status = Column(String, server_default='article')
engine = create_engine('sqlite:///:memory:')
print(CreateTable(Article.__table__).compile(engine))
Итоговый SQL запрос:
CREATE TABLE articles (
id INTEGER NOT NULL,
title VARCHAR,
status VARCHAR DEFAULT 'article',
PRIMARY KEY (id)
)