Форум сайта python.su
Ну так этого id может и не быть в БД В этом случае обязательно нужно вешать try на случай, если этого id нет. Ну и пытаться выбить вариант. И при ОЧЕНЬ разреженной БД это выльется в … . Вариант только выгребать все id и случайно выбирать значение из этого списка. Потом делать запрос на получение этих данных.
Офлайн
4kpt_III
там же >=
Офлайн
sander
Не дочитал Тогда действительно хорошее решение. Интересно, насколько поиск максимального и минимального значения затратный.
Офлайн
4kpt_IIIЕсли по ID есть индекс (а он должен быть у нормальных людей), то задача поиска макимума/минимума тривиальна - это первый и последний элементы индекса.
Не дочитал Тогда действительно хорошее решение. Интересно, насколько поиск максимального и минимального значения затратный.
Офлайн
FishHook
Если по ID есть индекс (а он должен быть у нормальных людей)
FishHook
то задача поиска максимума/минимума тривиальна - это первый и последний элементы индекса.
Офлайн
Решил немного “поиграться” и пришел к одному варианту. Вариант ниже более предпочтилен? Спасибо 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()
Офлайн
MetalHead
Вы реализовали мою идею. У FishHook в разы лучше. Нет необходимости выгребать всю базу. Только первый и последний элемент индекса. И потом просто брать первый попавшийся элемент, который больше или равен случайному в этом диапазоне (равен, если вдруг random выбрал значение правой границы). Вы просто его не поняли
Офлайн
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)
Отредактировано MetalHead (Апрель 9, 2015 18:00:21)
Офлайн
MetalHead
Нужно по индексу идти. Прямой поиск максимального и минимального значения может не дать серьезного прироста производительности по сравнению с поиском из возможных значений.
P.S. Ну и в Вашем случае не забудьте все же добавить еще одним условием фильтр по категории так как случайный id может быть другой категории.
Офлайн