Django manage.py sqlclear省略了一些表

时间:2011-12-26 07:19:19

标签: python django django-models

我编写了用于在所有Django应用程序中删除表的python脚本。 (使用settings.INSTALLED_APP)

https://gist.github.com/1520683

我的django项目在运行manage.py syncdb后创建 41 表,但我的脚本表示只会删除 40 表。所以,我检查了sqlall的结果和sqlclear的结果。我透露sqlclear省略了一个存储ManyToManyField关系的表。

我知道drop database比上面的脚本简单得多。但我很困惑为什么django admin或manage script在运行sql命令时省略了一些表。


下面的模型在运行common_userbook_purchasedBooks时创建syncdb表,但不在sqlclear命令中创建。{/ p>

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

已添加)所以,我正在使用另一种方法。 https://gist.github.com/1520810

1 个答案:

答案 0 :(得分:2)

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输出看起来像

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']