Django manage.py sqlclear опустить некоторые таблицы - PullRequest
3 голосов
/ 26 декабря 2011

Я написал скрипт Python для удаления таблиц во всех приложениях Django.(используя settings.INSTALLED_APP)

https://gist.github.com/1520683

Мой проект django создает 41 таблиц после выполнения manage.py syncdb, но мой скрипт говорит только 40 таблицы будут удалены.Итак, я проверил результат sqlall и результат sqlclear.И я обнаружил, что sqlclear опускает одну таблицу, в которой хранятся отношения ManyToManyField.

Я знал, что drop database намного проще, чем приведенный выше скрипт.Но я запутался, почему администратор сценария django или скрипт управления опускают некоторые таблицы при выполнении команд sql.


Ниже модель создает таблицу common_userbook_purchasedBooks при выполнении команды syncdb, но не в команде sqlclear.

class UserBook(models.Model):                       
    user = models.OneToOneField(User)
    purchasedBooks = models.ManyToManyField(Book)

Добавлено) Итак, я использую альтернативный подход для этого.https://gist.github.com/1520810

1 Ответ

2 голосов
/ 30 декабря 2011

lqez, я думаю, что эта проблема связана с вашей локальной средой, потому что для Django 1.3.1, Python 2.7.2

для моделей

from django.contrib.auth.models import User
from django.db import models

class Book(models.Model):
    name = models.CharField(max_length=10)

class UserBook(models.Model):
    user = models.OneToOneField(User)
    purchasedBooks = models.ManyToManyField(Book)

при запуске (.env)testme$ ./manage.py sqlclear testapp outputвыглядит как

sqlite3

BEGIN;
DROP TABLE "testapp_userbook";
DROP TABLE "testapp_userbook_purchasedBooks";
DROP TABLE "testapp_book";
COMMIT;

postgresql_psycopg2

BEGIN;
ALTER TABLE "testapp_userbook_purchasedBooks" DROP CONSTRAINT "userbook_id_refs_id_8bda4b0";
DROP TABLE "testapp_userbook";
DROP TABLE "testapp_userbook_purchasedBooks";
DROP TABLE "testapp_book";
COMMIT;

mysql

BEGIN;
ALTER TABLE `testapp_userbook_purchasedBooks` DROP FOREIGN KEY `userbook_id_refs_id_8bda4b0`;
DROP TABLE `testapp_userbook`;
DROP TABLE `testapp_userbook_purchasedBooks`;
DROP TABLE `testapp_book`;
COMMIT;

Также ваш скрипт может быть немного улучшен с помощью introspection:

from django.db import connection
cursor = connection.cursor()
connection.introspection.get_table_list(cursor)

[u'auth_group', u'auth_group_permissions', u'auth_message', u'auth_permission', u'auth_user', u'auth_user_groups', u'auth_user_user_permissions', u'django_content_type', u'django_session', u'django_site', u'testapp_book', u'testapp_userbook', u'testapp_userbook_purchasedBooks']
...