如何从DJango中删除SQLite3中的表?

时间:2010-02-18 04:23:32

标签: database django sqlite

我制作了一个模型,并运行了python manage.py syncdb。我认为在db中创建了一个表。然后我意识到我错误地创建了一个列,所以我更改了它,并运行了相同的命令,认为它会丢弃旧表,并添加一个新表。

然后我去了python manage.py shell,并尝试运行.objects.all(),但它失败了,说该列不存在。

我想清除旧表,然后再次运行syncdb,但我无法弄清楚如何做到这一点。

8 个答案:

答案 0 :(得分:69)

清除应用程序就像写作一样简单:

./manage.py sqlclear app_name | ./manage.py dbshell 

然后为了重建你的表,只需输入:

./manage.py syncdb

答案 1 :(得分:38)

使用Django 1.4或更低版本时,另一种简单的方法是

python manage.py reset app_name

删除并重新创建此应用程序模型使用的表格。

这在Django 1.3中已弃用,并且不再可用于Django 1.5

答案 2 :(得分:36)

没有一个答案显示如何删除应用中的一个表。这不是太困难。 dbshell命令将用户登录到sqlite3 shell。

python manage.py dbshell

当您在shell中时,键入以下命令以查看数据库的结构。这将显示数据库中的所有表名(以及表中的列名)。

SELECT * FROM sqlite_master WHERE type='table';

通常,Django根据以下约定命名表:“appname_modelname”。因此,实现目标的SQL查询将类似于以下内容:

DROP TABLE appname_modelname;

即使表与其他表有关系,这也应该足够了。现在,您可以通过执行以下命令注销SQLITE shell:

.exit

如果再次运行syncdb,Django将根据您的模型重建表。这样,您可以更新数据库表而不会丢失所有应用程序数据。如果您遇到这个问题很多,请考虑使用South - 一个django应用程序,它将为您迁移表格。

答案 3 :(得分:25)

使用

获取DROP语句

python manage.py sqlclear app_name

然后尝试

python manage.py dbshell

并执行DROP语句

结帐http://docs.djangoproject.com/en/dev/ref/django-admin/

答案 4 :(得分:17)

我遇到了同样的问题。

要快速解决(如果您不关心丢失表/数据),请更正包含所需数据类型的models.py文件,删除Migration文件夹和db.SQLite3文件,

然后重新运行以下命令:

  1. python manage.py migrate
  2. python manage.py makemigrations
  3. python manage.py migrate
  4. python manage.py createsuperuser(创建管理员用户/ pswd来管理管理页面)
  5. python manage.py runserver

答案 5 :(得分:1)

在Django 1.9中,我不得不做Kat Russo的步骤,但第二次迁移有点棘手。你必须运行

./manage.py migrate --run-syncdb

答案 6 :(得分:1)

可能值得在这里扩展一些答案:

因此,您可以使用以下命令访问dbshell

python manage.py dbshell

然后优先使用以下内容:

DROP TABLE appname_tablename CASCADE;

要删除任何相关表,请在字段上有效地镜像“ on_delete = CASCADE”方向。

答案 7 :(得分:0)

在Django 2.1.7中,我打开了SQLite browser中的db.sqlite3文件(Pypi上还有一个Python包)并使用命令删除了表

DROP TABLE appname_tablename;

然后

DELETE FROM django_migrations WHERE App='appname';

然后再次运行

python manage.py makemigrations appname
python manage.py migrate appname