2015-04-15 2 views
0

Я использовал GAE и NDB для проекта. Я просто заметил, что если я создам несколько объектов, а затем получаю список этих объектов, порядок не сохраняется (я использую fetch() на объекте).Ndb по умолчанию не сохраняет порядок вставки

Это скриншот страницы администратора, который показывает ту же проблему: screenshot

как вы может (если он слишком мал here ссылка) см я несколько sessions. Теперь я создал сеансы, которые имеют имя day по порядку, от 0 до 7.

Но как вы видите, заказ не сохранился.

Я проверил, и на самом деле keys не являются инкрементальными. Ни id (id должен быть инкрементным, не так ли?), Но в любом случае, а не в этом, я использовал ручной ключ, поэтому не будет id).

Есть ли способ сохранить порядок вставки? (или это просто странное поведение или это моя плохо?)

PS: если вы хотите взглянуть на код: this является модель сессии, которая проходит this класс я сделал

+0

не получил. где я должен пройти диктофон? – EsseTi

+1

Идентификаторы намеренно выделяются разреженным способом для повышения производительности. Если вам нужно увеличивать ID, вы можете предварительно выделить идентификаторы, а затем управлять их использованием самостоятельно. В документах нет ничего, что подразумевало бы строгий порядок идентификаторов, и я был бы очень удивлен, увидев это поведение. –

+0

, исходящий из «SQL-мира», я подразумевал порядок, мой плохой. – EsseTi

ответ

2

Ни keys, ни id s являются строго инкрементальными (и инкрементальными на единицу) в ndb. Вы можете установить свой собственный id s и убедиться, что они автоинкремент правильно.

Или вы можете добавить в модель (ы) DateTimeProperty:

created = ndb.DateTimeProperty(auto_now_add=True) 

А на ваш взгляд, вы можете использовать фильтр для сортировки объектов по дате введения, напр:

posts = Post.query().order(-Post.created).fetch() 

, который будет заказывать и получать ваши (допустим) Post объекты в порядке убывания дат вставки.

+0

Это именно то, что я имел в виду, если не было добавочного ключа. – EsseTi

+0

Подумайте, использовать временную метку с некоторым случайным хэшем в качестве ключа для целей оптимизации. –

+1

Можете ли вы объяснить это немного дальше? – EsseTi

0

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

Что заставляет вас думать, что их нужно заказать?

Смежные вопросы