Django manage.py sqlclear省略某些表

3 投票
1 回答
605 浏览
提问于 2025-04-17 09:01

我写了一个Python脚本,用来删除所有Django应用中的表格。(使用settings.INSTALLED_APP)

https://gist.github.com/1520683

我的Django项目在运行manage.py syncdb后创建了41个表格,但我的脚本显示只有40个表格会被删除。所以,我检查了sqlall的结果和sqlclear的结果。结果发现sqlclear漏掉了一个存储ManyToManyField关系的表格。

我知道直接使用drop database要简单得多,但我搞不懂为什么Django的管理工具或管理脚本在执行SQL命令时会漏掉一些表格。


下面这个模型在运行syncdb时会创建common_userbook_purchasedBooks表格,但在sqlclear命令中却没有。

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

补充一下)所以,我正在使用另一种方法来解决这个问题。https://gist.github.com/1520810

1 个回答

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

撰写回答