【问题标题】:Django dropped table still existsDjango丢弃的表仍然存在
【发布时间】:2017-08-22 15:46:08
【问题描述】:

我的一个 django 应用程序中的模型出现问题。

我可以创建模型的实例,但是当我去访问它时,我得到一个错误:

# create and save model instance
user_form = UserSearchForm(user=user)
user_form.save()

# Then later
first_user_form = UserSearchForm.objects.all()[0]


(1146, "Table 'project.app_tablename' doesn't exist")
Request Method: GET
Request URL:    http://10.0.75.1:8000/search/
Django Version: 1.9.5
Exception Type: ProgrammingError
Exception Value:    
(1146, "Table 'project.app_tablename' doesn't exist")
Exception Location: /opt/project-venv/lib/python3.4/site-packages/MySQLdb/connections.py in query, line 280
Python Executable:  /opt/project-venv/bin/python
Python Version: 3.4.3
Python Path:    
['/opt/project/project',
 '/opt/project-venv/lib64/python34.zip',
 '/opt/project-venv/lib64/python3.4',
 '/opt/project-venv/lib64/python3.4/plat-linux',
 '/opt/project-venv/lib64/python3.4/lib-dynload',
 '/usr/lib64/python3.4',
 '/usr/lib/python3.4',
 '/opt/project-venv/lib/python3.4/site-packages']
Server time:    Tue, 28 Mar 2017 22:50:16 +0000

我正在使用 Django 1.95,并从链接的答案 (https://stackoverflow.com/a/36565161/2516846) 中尝试了以下操作:

  1. 删除应用迁移文件夹
  2. 删除所有应用表,例如DROP TABLE search_usersearchform
  3. 从 db 中删除所有迁移:DELETE FROM django_migrations WHERE app = 'search'。
  4. python manage.py makemigrations search
  5. python manage.py 迁移

但是当我运行迁移时,它给出了错误:

django.db.utils.ProgrammingError: relation "search_usersearchform" already exists

总结:无法再次创建模型,因为关系已经存在,但无法访问我的应用程序中的模型,因为它说表不存在

是否有对此表/模型的引用存储在我需要删除的其他位置?如果我删除了表、删除了迁移文件夹并从 db 中删除了迁移,我不知道该关系是如何存在的

编辑

好的,终于解决了。

我的项目有两个数据库,“默认”数据库使用 postgres,“辅助”数据库使用 mysql。

当我在我的应用程序中创建一个新模型并运行迁移时,该表已添加到默认数据库中。
这使我能够创建新模型的实例。

但是,当我访问以前保存的实例时,我收到错误消息,指出该表不存在。

原来这是由我的应用程序 router.py 引起的,它将任何查询重定向到“辅助”数据库,该数据库当然没有表。
为了解决这个问题,我在 router.py 中的 db_for_write 和 db_for_read 方法中添加了条件,以将这些模型路由到“默认”数据库。

【问题讨论】:

  • 你是如何从 Django 访问表的?显示给出错误的代码
  • 对不起,这个堆栈跟踪是什么? Request URL: http://10.0.75.1:8000/search/ 那是什么?
  • 你能在管理 shell 中运行它们吗?也请把你的模型。
  • 您是删除了迁移文件夹还是仅删除了迁移文件?如果您刚刚删除了文件,请确保同时删除 .pyc 文件
  • 是的,删除了整个文件夹,我怎么能从数据库中删除模型表,但我仍然可以运行 manage.py shell 并创建和导入/创建该模型的实例?

标签: python django postgresql


【解决方案1】:

尝试删除或更改包含该模型的迁移文件,注意依赖关系。然后再次运行python manage.py makemigrationspython manage.py migrate 它应该再次创建模型。 (我们说的是你的测试数据库吧?)

【讨论】:

  • 是的,它是一个测试数据库,我已经更新了问题以显示我尝试了哪些步骤
【解决方案2】:

备份models.py,从原始models.py中删除模型代码,然后运行:

python manage.py makemigrations
python manage.py migrate

然后只需在models.py中恢复模型代码并再次运行上述命令。

【讨论】:

  • 我尝试从 models.py 中删除新模型,然后运行这些命令,但是当我重新添加模型时,它说它已经存在。我应该删除所有模型并重试吗?
【解决方案3】:

按照这些步骤应该可以解决它:

  • 删除数据库。
  • 创建一个同名的空文件。
  • 或者,您可能需要为新数据库创建一个超级用户。
  • 删除包迁移的内容(不是整个包),文件 init.py 除外。
  • 运行命令python manage.py makemigrations
  • 运行命令python manage.py migrate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 2010-09-13
    • 1970-01-01
    • 2018-08-11
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多