Найти - Пользователи
Полная версия: Рандомное получение записи из БД. SQLAlchemy
Начало » Базы данных » Рандомное получение записи из БД. SQLAlchemy
1 2 3
4kpt_III
Ну так этого id может и не быть в БД В этом случае обязательно нужно вешать try на случай, если этого id нет. Ну и пытаться выбить вариант. И при ОЧЕНЬ разреженной БД это выльется в … . Вариант только выгребать все id и случайно выбирать значение из этого списка. Потом делать запрос на получение этих данных.
sander
4kpt_III
там же >=
4kpt_III
sander
Не дочитал Тогда действительно хорошее решение. Интересно, насколько поиск максимального и минимального значения затратный.
FishHook
4kpt_III
Не дочитал Тогда действительно хорошее решение. Интересно, насколько поиск максимального и минимального значения затратный.
Если по ID есть индекс (а он должен быть у нормальных людей), то задача поиска макимума/минимума тривиальна - это первый и последний элементы индекса.
4kpt_III
FishHook
Если по ID есть индекс (а он должен быть у нормальных людей)

Ну не всегда же он нужен по id.

FishHook
то задача поиска максимума/минимума тривиальна - это первый и последний элементы индекса.

Никогда не использовал индексы в таком контексте. Отличная идея.
MetalHead
Решил немного “поиграться” и пришел к одному варианту. Вариант ниже более предпочтилен? Спасибо FishHook за идею, которая была немножко модернизирована.
rows = session.query(TableName).filter(TableName.category_id == 1).all()
id_list = []
for idents in rows:
    id_list.append(idents.id)
row = session.query(TableName).filter(TableName.id == random.choice(id_list)).one()

4kpt_III
MetalHead
Вы реализовали мою идею. У FishHook в разы лучше. Нет необходимости выгребать всю базу. Только первый и последний элемент индекса. И потом просто брать первый попавшийся элемент, который больше или равен случайному в этом диапазоне (равен, если вдруг random выбрал значение правой границы). Вы просто его не поняли
FishHook
MetalHead
к сожалению, мне не приходилось сколько-нибудь работать с алхимией, а изучать её сейчас у меня нет ни времени ни желания, поэтому помочь вам с конкретным запросом я не смогу.
MetalHead
Ребята, извините, совсем невнимательно вчера прочитал, а сегодня уже пытался что-то накодить. Подскажите пожалуйста, такой вариант самый оптимальный?
min_max_rows = session.query(func.min(TableName.id), func.max(TableName.id)).filter(TableName.category_id == 1).limit(2)
integer = list(min_max_rows[0])
rand_int = random.randint(integer[0], integer[1])
random_row = session.query(TableName).filter(TableName.id >= rand_int, TableName.category_id == category_id).limit(1)
4kpt_III
MetalHead
Нужно по индексу идти. Прямой поиск максимального и минимального значения может не дать серьезного прироста производительности по сравнению с поиском из возможных значений.

P.S. Ну и в Вашем случае не забудьте все же добавить еще одним условием фильтр по категории так как случайный id может быть другой категории.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB