2011-01-14 3 views
0

Использование MyModel.objects.all(). Delete() может принимать много времени. Есть ли способ ускорить процесс?Как ускорить удаление django()?

Предположения:

  • Я хочу, чтобы удалить все экземпляры MyModel
  • Я также хочу, чтобы удалить любые модели, которые имеют ForeignKey к MyModel
  • Я знаю, априори, какие модели они

ответ

3

Использование raw sql:

from django.db import connection 
cursor = connection.cursor() 
cursor.execute("set foreign_key_checks = 0") 
cursor.execute("truncate table table_a") 
cursor.execute("truncate table table_b") 
# ... 
cursor.execute("set foreign_key_checks = 1") 

Если вы хотите удалить все модели, вы можете даже использовать БД для создания SQL заявления:

from django.db import connection 
cursor = connection.cursor() 
cursor.execute("set foreign_key_checks = 0") 
cursor.execute("select concat('truncate table ',table_schema,'.',table_name,';') as sql_stmt from information_schema.tables where table_schema = 'your_schema_name' and table_type = 'base table'") 
for sql in [sql[0] for sql in cursor.fetchall()]: 
    cursor.execute(sql) 
cursor.execute("set foreign_key_checks = 1") 

(SQL, приемы взяты из here)

+0

Я думаю, что «установить foreign_key_checks = 0» дело только в MySQL, правильно? В Oracle вам придется явно отключить каждый внешний ключ, который указывает на таблицу перед ее усечением. Я обнаружил, что в Oracle я мог бы сохранить 90% выгоды от скорости, усекая мою «дочернюю» таблицу (много строк), а затем используя обычное удаление в моей «родительской» таблице (несколько строк). –

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