Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 7, 2015 15:18:22

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Рандомное получение записи из БД. SQLAlchemy

Ну так этого id может и не быть в БД В этом случае обязательно нужно вешать try на случай, если этого id нет. Ну и пытаться выбить вариант. И при ОЧЕНЬ разреженной БД это выльется в … . Вариант только выгребать все id и случайно выбирать значение из этого списка. Потом делать запрос на получение этих данных.

Офлайн

#2 Апрель 7, 2015 15:20:59

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Рандомное получение записи из БД. SQLAlchemy

4kpt_III
там же >=

Офлайн

#3 Апрель 7, 2015 15:26:32

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Рандомное получение записи из БД. SQLAlchemy

sander
Не дочитал Тогда действительно хорошее решение. Интересно, насколько поиск максимального и минимального значения затратный.

Офлайн

#4 Апрель 7, 2015 15:34:08

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Рандомное получение записи из БД. SQLAlchemy

4kpt_III
Не дочитал Тогда действительно хорошее решение. Интересно, насколько поиск максимального и минимального значения затратный.
Если по ID есть индекс (а он должен быть у нормальных людей), то задача поиска макимума/минимума тривиальна - это первый и последний элементы индекса.



Офлайн

#5 Апрель 7, 2015 16:48:26

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Рандомное получение записи из БД. SQLAlchemy

FishHook
Если по ID есть индекс (а он должен быть у нормальных людей)

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

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

Никогда не использовал индексы в таком контексте. Отличная идея.

Офлайн

#6 Апрель 8, 2015 09:04:06

MetalHead
От: Ленгер
Зарегистрирован: 2013-12-17
Сообщения: 88
Репутация: +  1  -
Профиль   Отправить e-mail  

Рандомное получение записи из БД. SQLAlchemy

Решил немного “поиграться” и пришел к одному варианту. Вариант ниже более предпочтилен? Спасибо 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()

Офлайн

#7 Апрель 8, 2015 11:11:51

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Рандомное получение записи из БД. SQLAlchemy

MetalHead
Вы реализовали мою идею. У FishHook в разы лучше. Нет необходимости выгребать всю базу. Только первый и последний элемент индекса. И потом просто брать первый попавшийся элемент, который больше или равен случайному в этом диапазоне (равен, если вдруг random выбрал значение правой границы). Вы просто его не поняли

Офлайн

#8 Апрель 8, 2015 11:17:01

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Рандомное получение записи из БД. SQLAlchemy

MetalHead
к сожалению, мне не приходилось сколько-нибудь работать с алхимией, а изучать её сейчас у меня нет ни времени ни желания, поэтому помочь вам с конкретным запросом я не смогу.



Офлайн

#9 Апрель 8, 2015 17:58:38

MetalHead
От: Ленгер
Зарегистрирован: 2013-12-17
Сообщения: 88
Репутация: +  1  -
Профиль   Отправить e-mail  

Рандомное получение записи из БД. SQLAlchemy

Ребята, извините, совсем невнимательно вчера прочитал, а сегодня уже пытался что-то накодить. Подскажите пожалуйста, такой вариант самый оптимальный?

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)

Офлайн

#10 Апрель 8, 2015 18:56:59

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Рандомное получение записи из БД. SQLAlchemy

MetalHead
Нужно по индексу идти. Прямой поиск максимального и минимального значения может не дать серьезного прироста производительности по сравнению с поиском из возможных значений.

P.S. Ну и в Вашем случае не забудьте все же добавить еще одним условием фильтр по категории так как случайный id может быть другой категории.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version