LINUX.ORG.RU

[django][python] Разные результаты queryset

 ,


0

1

Я тут столкнулся с одной неприятной особенностью, причину нагуглить не могу.

Суть такова. запущен сайт (manage.py runserver), и консоль (manage.py shell) На сайте делаются какие то изменения в базе, в шелле таких изменений не увидеть, пока не перезапустишь шелл.

С чем это может быть связано и как лечить? Я прозреваю какое то кеширование.

З.Ы. кверисет естествено обновляю.



Последнее исправление: Apkawa (всего исправлений: 2)

Ответ на: комментарий от pi11

Ну например. есть модель Book в ней есть поле deleted, к примеру. на сайте он выставляется в True (Book.objects.filter(pk=1).update(deleted=True)

в шелле вытягивается модель Book.objects.filter(pk=1).values('deleted') ничего не поменялось.

Apkawa
() автор топика
Ответ на: комментарий от Apkawa

Т.е. это питоновский шелл.
А filter ты уже в шеле такой сделал и данные вытянул. Вот они у тебя в queryset и лежат уже.
А почему-бы sql консоль не использовать?

pi11 ★★★★★
()
Ответ на: комментарий от pi11

зачем мне превращать из django в python?

queryset создается каждый раз новый. используя

c = connection.cursor()
c.execute(<RAWSQL>)
c.fetchall()

получается то же самое.

Apkawa
() автор топика
Ответ на: комментарий от Apkawa

>зачем мне превращать из django в python?

не понял, к чему ты это написал.

получается то же самое.


Тогда я даже не знаю, в чем проблема. Можешь на какой нибудь pastebin сервис выхлоп всего что ты в шеле делал кинуть?

pi11 ★★★★★
()
Ответ на: комментарий от Apkawa

>connection._commit()

Не знаю что делает конкретно эта функция с подчеркиванием, но сомневаюсь что commit может влиять на select.

pi11 ★★★★★
()
Ответ на: комментарий от pi11

я и сам пока не понял, почему это так, но вроде фиксит данную проблему. на досуге сделаю минимальное приложение для тестирование.

Apkawa
() автор топика
Ответ на: комментарий от pi11

>но сомневаюсь что commit может влиять на select.

Это называется «транзакция». Я могу в рамках одной тразакции сделать удаление нескольких строк, при этом в другой сессии (в рамках одной сессии может быть только одна транзакция) ты этого не будешь видеть, покуда «соседняя» транзакция еще не закомичена.

Deleted
()
Ответ на: комментарий от pi11

>Причем тут транзакция когда речь идет о коде в шеле,

а изменения делаются через сайт?

При том, что через сайт у тебя одна сессия к базе, а в шелле - другая. Соответственно, незакоммиченный апдейт данных (DML) в том же шелле не будет виден для сессии, которая открыта через веб. Это основы, друг мой :)

Deleted
()
Ответ на: комментарий от Deleted

>Соответственно, незакоммиченный апдейт данных (DML) в том же шелле не будет виден для сессии, которая открыта через веб.

Ну ты хотя бы первое сообщение внимательно прочитай. Данные изменяются через сайт.

pi11 ★★★★★
()
Ответ на: комментарий от Deleted

Вроде как в мускуле нет нормальных транзакций. да и на транзакции слабо смахивает, т.к. если сделать изменения на сайте или в шелле и посмотреть прямо в базе, например через, mysql то там изменения уже будут записаны. а в педоновском шелле, по сути еще один поток выполнения, нет.

Apkawa
() автор топика
Ответ на: комментарий от Apkawa

>Вроде как в мускуле нет нормальных транзакций

MyISAM - нет транзакций. InoDB - есть.

Deleted
()
Ответ на: комментарий от pi11

>Ну ты хотя бы первое сообщение внимательно прочитай. Данные изменяются через сайт.

Что ж, если так туго входит... давай попросим ТС показать кол-во открытых сессий к базе при запущеном «сайте» и одновременно запущенном «шелле».

Apkawa, не сочти за труд ;)

PS: диву даюсь, чесслово

Deleted
()
Ответ на: комментарий от Deleted

Слушай как по твоему джанга работает?
Открывает транзакцию и коммитит только когда страницу сайта закрыли чтоли?

ТС вначале написал ->

На сайте делаются какие то изменения в базе, в шелле таких изменений не увидеть


Это не десктопное приложение где ты транзакцию сколько хочешь можешь держать открытой. В веб-приложения везде autocommit по умолчанию.

pi11 ★★★★★
()
Ответ на: комментарий от pi11

Даже если бы он на сайте зафигачил вручную транзакцию джанга бы бросила exception если бы не был бы вызван commit.

pi11 ★★★★★
()
Ответ на: комментарий от pi11

Промазал мимо ТС. Хочу сказать, что он здесь нигде не писал что проверил что в базу внесены изменения и код вида, в котором вызывается save() не привел.

g1itch
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.