/ admin / learning_logs / example /中的OperationalError

时间:2017-11-18 18:52:24

标签: python django python-3.x

我是django以及模块和网络应用程序的初学者。

这是追溯和数据:

OperationalError at /admin/learning_logs/example/
no such column: learning_logs_example.entry_id
Request Method: GET
Request URL:    http://localhost:8000/admin/learning_logs/example/
Django Version: 1.11.7
Exception Type: OperationalError
Exception Value:    
no such column: learning_logs_example.entry_id
Exception Location: C:\Users\Bryan\Desktop\LEARNI~1\ll_env\lib\site-
packages\django\db\backends\sqlite3\base.py in execute, line 328
Python Executable:  C:\Users\Bryan\Desktop\LEARNI~1\ll_env\Scripts\python.exe
Python Version: 3.6.2
Python Path:    
['C:\\Users\\Bryan\\Desktop\\learning log',
 'C:\\Users\\Bryan\\Desktop\\LEARNI~1\\ll_env\\Scripts\\python36.zip',
 'C:\\Users\\Bryan\\AppData\\Local\\Programs\\Python\\Python36-32\\DLLs',
 'C:\\Users\\Bryan\\AppData\\Local\\Programs\\Python\\Python36-32\\lib',
 'C:\\Users\\Bryan\\AppData\\Local\\Programs\\Python\\Python36-32',
 'C:\\Users\\Bryan\\Desktop\\LEARNI~1\\ll_env',
 'C:\\Users\\Bryan\\Desktop\\LEARNI~1\\ll_env\\lib\\site-packages']
Server time:    Sat, 18 Nov 2017 18:36:14 +0000

出于某种原因,当我点击那个说“"例子"下面,

enter image description here

它说这个

enter image description here

我试过迁移,但它说

(venv) C:\...\learning log>python manage.py makemigrations
No changes detected

(venv) C:\...\learning log>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  No migrations to apply.

我是如何做到的?

首先,我添加了example条目/表单和TextField,然后我添加了一个"示例"。我添加了一个ForeignKey对象,其参数为Entry

我回去编辑我的"示例"但随后出现了异常。

编辑: 当我运行python manage.py showmigrations learning_logs时,janos想要输出,所以这里是:

admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 001_initial
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
learning_logs
 [X] 0001_initial
sessions
 [X] 0001_initial

嗯,我希望有所帮助。

我重新设置了here

的异常页面

3 个答案:

答案 0 :(得分:3)

正如错误消息所示, 表entry_id中的列learning_logs_example不存在。 这不正常。 如果模式迁移已正确创建并正确应用, 那不应该发生这种情况。

此外,看着这个:

(venv) C:\...\learning log>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  No migrations to apply.

Apply all migrations行应包含您应用的名称。 现有名称是标准的Django组件。 您的应用名称可能是learning_log或类似名称。 简而言之, 您的应用似乎不存在迁移。

要调试这个, 首先检查您应用的showmigrations输出:

./manage.py showmigrations learning_log

如果您没有收到错误,请将输出添加到您的问题中。

如果您收到错误CommandError: No migrations present for: ..., 然后创建迁移:

./manage.py makemigrations learning_log

然后再次检查showmigrations的输出, 请将输出添加到您的问题中。

如果输出如下所示:

learning_log
 [X] 0001_initial
 ...

这意味着数据库有一些关于应用迁移的记录, 事实上,Django认为迁移是正确应用的。 (实际上它们不是,基于你的主要错误。)

根据我到目前为止的信息, 您的数据库似乎与模型不同步: 某些字段已添加到模型中而未应用于数据库, 并且没有正确保存迁移。

一个简单的解决方案是手动添加缺失的列。 您可以通过查看迁移文件找到正确的架构:

./manage.py sqlmigrate learning_log 0001

从这里你应该能够找到如何声明丢失的entry_id字段, 然后使用查询ALTER TABLE learning_logs_example ADD COLUMN entry_id ...手动将其添加到表中, 其余参数取决于sqlmigrate输出中列的定义。

如果问题只有一个或几个遗漏的字段, 然后这个解决方法可能足以让一些工作。 (如果没有,请跳到下一部分。) 你不应该止步于此, 因为模型也可能需要一些索引。 您可以研究sqlmigrate的进一步输出并重新创建依赖于learning_logs_example的所有其他对象, 例如索引,触发器。 但更简洁的解决方案是重新创建应用程序的所有表, 遵循以下步骤:

  • 转储当前数据:./manage.py dumpdata learning_log > learning_log.json
  • 删除应用的所有表格
  • 重新创建应用的表格:./manage.py migrate --fake learning_log zero; ./manage.py migrate learning_log
  • 恢复数据:./manage.py loaddata learning_log

如果手动添加列的解决方法不起作用 (你偶然发现了更复杂的问题), 那么你有两个选择:

  • 如果你不能丢失数据,那么你必须手动追踪并解决每一个问题。完成后,您应该转储和恢复应用程序的表格,如我在上一节中所述

  • 如果可以丢失数据,那么您可以按照上一节中的步骤进行操作,而无需执行转储和恢复步骤。也就是说,删除并重新创建应用程序的表

最后, 为了避免进一步的问题 您需要确保所有迁移都与模型同步, 并正确添加到版本控制。 测试的一个好方法是将Django项目安装在计算机上的其他文件夹中。 如果这不顺利, 然后设置仍然不好。

如果上述任何一项需要进一步澄清,请告诉我。

答案 1 :(得分:1)

这是您第一次为应用程序创建迁移吗?如果是,则需要指定应用程序名称以进行迁移:

python manage.py makemigrations my-app

答案 2 :(得分:0)

如果数据无关紧要,您可以从这里删除数据库文件:

  

C:\ Users \ bryan_8nva8ki \ Desktop \ learning logs \ db.sqlite3

(我从你的日志中看到了那条路径)

然后你应该再次migrate。希望它会有所帮助!