Поле Interval
Поле Interval представляет интервальный тип данных
в SQLAlchemy. Оно используется для хранения промежутков
времени, таких как дни, часы, минуты и секунды. Первым
параметром передаётся опция native, которая
указывает использовать ли нативный интервальный тип СУБД.
Вторым параметром передаётся second_precision,
задающая точность секунд. Третьим параметром передаётся
day_precision, задающая точность дней.
Синтаксис
Interval(native=True, second_precision=None, day_precision=None)
Пример
Давайте создадим модель с полем Interval
для хранения длительности задачи:
from datetime import timedelta
from sqlalchemy import Interval
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
duration: Mapped[timedelta] = mapped_column(Interval)
Теперь создадим таблицу и добавим запись с интервалом:
<+python+>
from datetime import timedelta
from sqlalchemy import create_engine, Interval
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
duration: Mapped[timedelta] = mapped_column(Interval)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article', duration=timedelta(days=2, hours=3, minutes=30))
session.add(article)
session.commit()
res = session.query(Article).first()
print(res.duration)
<-python+>
Результат выполнения кода:
"2 days, 3:30:00"
Пример
Давайте выведем таблицу с интервальным полем:
CREATE TABLE articles (
id INTEGER NOT NULL,
title VARCHAR NOT NULL,
duration INTERVAL,
PRIMARY KEY (id)
)
Пример
Давайте выполним запрос с фильтрацией по интервалу:
<+python+>
from datetime import timedelta
from sqlalchemy import create_engine, Interval, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
duration: Mapped[timedelta] = mapped_column(Interval)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article 1', duration=timedelta(hours=1)),
Article(title='article 2', duration=timedelta(days=1)),
Article(title='article 3', duration=timedelta(days=7))
])
session.commit()
stmt = select(Article).where(Article.duration >= timedelta(days=1))
res = session.execute(stmt).scalars().all()
print([article.title for article in res])
<-python+>
Результат выполнения кода:
['article 2', 'article 3']