#django #save #django-mssql
#django #Сохранить #django-mssql
Вопрос:
Каждый раз, когда save()
метод вызывается для объекта Django, Django выполняет два запроса один INSERT
и one SELECT
. В моем случае это полезно, за исключением некоторых конкретных мест, где каждый запрос обходится дорого. Любые идеи о том, как иногда указывать, что ни один объект не должен быть возвращен — не SELECT
требуется.
Кроме того, я использую django-mssql для подключения, эта проблема, похоже, не существует в MySQL.
РЕДАКТИРОВАТЬ : Лучшее объяснение
h = Human()
h.name='John Foo'
print h.id # Returns None, No insert has been done therefore no id is available
h.save()
print h.id # Returns the ID, an insert has taken place and also a select statement to return the id
Иногда мне не нужен идентификатор повторной загрузки, просто вставьте
Комментарии:
1. Ну, это странно, MSSQL поддерживает
INSERT...OUTPUT
, поэтому я не понимаю, почему он выдает два запроса, но опять же, я не настолько знаком сdjango-mssql
. Возможно, вы могли бы создать свои собственные инструкции INSERT для дорогостоящих запросов?
Ответ №1:
ответ 40ins был правильным, но, вероятно, это может привести к более высоким затратам…
Когда django выполняет save(), необходимо убедиться, является ли объект новым или существующим. Таким образом, он попадает в базу данных, чтобы проверить, существует ли связанный objext. Если да, выполняется ОБНОВЛЕНИЕ, или, иначе, выполняется ОШИБКА
Проверьте documentatin отсюда…
Вы можете использовать force_insert или force_update , но это может вызвать серьезные проблемы с целостностью данных, например, создать дублирующуюся запись вместо обновления существующей…
Итак, если вы хотите использовать силу, вы должны быть уверены, будет ли это ВСТАВКА или ОБНОВЛЕНИЕ…
Ответ №2:
Попробуйте использовать save()
метод с атрибутами force_insert
или force_update
. С помощью этих атрибутов django знает о существовании записи и не выполняет дополнительный запрос.
Комментарии:
1. Проблема не в том, проверяет django наличие или нет, а в том, что после каждого
INSERT
он запускаетSELECT
инструкцию, просто чтобы сохранить объектыid
под рукой.
Ответ №3:
Дополнительным выбором является серверная часть django-mssql, получающая идентификационное значение из таблицы, чтобы определить идентификатор, который был только что вставлен. Если этот выбор выполняется медленно, значит, что-то не так с вашим SQL server / конфигурацией, потому что он выполняет только SELECT CAST(IDENT_CURRENT(*table_name*) as bigint)
вызов.