Функция func.random
Функция func.random возвращает
случайное число с плавающей точкой в
диапазоне от 0 до 1. Функция не принимает
обязательных параметров и обычно
используется для случайной сортировки
строк в запросе. В разных СУБД эта
функция может называться по-разному,
поэтому func.random подходит для
универсального кода SQLAlchemy.
Синтаксис
func.random()
Пример
Давайте сгенерируем случайное число прямо в запросе:
from sqlalchemy import create_engine, select, func
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
res = conn.execute(select(func.random())).scalar()
print(res)
Результат выполнения кода:
0.8374629103
Итоговый SQL запрос:
SELECT random() AS random_1
Пример
Давайте отсортируем статьи в случайном
порядке. Для этого создадим модель
Article и передадим
func.random в метод
order_by:
from sqlalchemy import create_engine, select, func
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]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article 1'),
Article(title='article 2'),
Article(title='article 3'),
])
session.commit()
stmt = select(Article.title).order_by(func.random())
res = session.execute(stmt).scalars().all()
print(res)
Результат выполнения кода:
['article 2', 'article 3', 'article 1']
Итоговый SQL запрос:
SELECT articles.title
FROM articles
ORDER BY random()
Пример
Давайте выберем одну случайную статью
из таблицы. Для этого отсортируем
строки функцией func.random и
ограничим выборку методом limit:
from sqlalchemy import create_engine, select, func
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]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article 1'),
Article(title='article 2'),
Article(title='article 3'),
])
session.commit()
stmt = select(Article.title).order_by(func.random()).limit(1)
res = session.execute(stmt).scalars().first()
print(res)
Результат выполнения кода:
"article 3"
Итоговый SQL запрос:
SELECT articles.title
FROM articles
ORDER BY random()
LIMIT 1
Пример
Давайте присвоим случайному числу
псевдоним через метод label,
чтобы обращаться к нему по имени:
Результат выполнения кода:
0.2148573910
Итоговый SQL запрос:
SELECT random() AS rand_value
Смотрите также
-
функцию
func,
которая создает вызов любой SQL-функции -
функцию
desc,
которая задает сортировку по убыванию -
функцию
asc,
которая задает сортировку по возрастанию -
функцию
func.count,
которая считает количество строк