目录
django.db.utils.OperationalError: (1050, "Table already exists")
"No changes detected"问题
Django中创建了一个app,名字是users, 然后在users目录下的models.py文件中增加了两个model,UserGroup和ProductInfo,想要将新建的model迁移到数据库,生成新的表。
1. 记录更改:python manage.py makemigrations
执行指令:python manage.py makemigrations(运行makemigrations告诉Django,已经对Model做了一些更改(在这个例子中,创建了两个新的Model)并且会将这些更改记录为迁移文件),发现没有为users下新增的modle生成对应的迁移文件(Django中,我们使用models来定义表,并且尽量不要跳过Django手动操作数据表)。
基本是由于以下几个原因:
1.要迁移的apps(本文中的users)没有在setting.py文件内注册, 发现加上了。
2.migrations 文件夹内没有 __init__.py 文件导致, 发现也不是这个原因,因为这个文件已经有了。
3.做migration的时候,指定是哪个app,发现可以解决问题。
2. 将model 更改 同步到数据库: python manage.py migrate
然后执行python manage.py migrate 指令将修改同步到数据库,那么生成的表名是什么呢?以新增的UserGroup model为例,它的表名是users_usergroup,前缀users是app的名字,后面的部分是model的小写
django.db.utils.OperationalError: (1050, "Table already exists")
执行python manage.py migrate 进行数据库迁移的时候,遇到了下面的错误。
并且在把数据库删除以后,重新执行指令,还是出现同样的错误。
(keycloakTestEnv) C:\CSF\CSF-test-framework\Django\django_keycloak-master>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, users
Running migrations:
Applying users.0001_initial...Traceback (most recent call last):
File "C:\CSF\CSF-test-framework\Django\keycloakTestEnv\lib\site-packages\django\db\backends\utils.py", line 83, in _execute
File "C:\CSF\CSF-test-framework\Django\keycloakTestEnv\lib\site-packages\MySQLdb\connections.py", line 259, in query
_mysql.connection.query(self, query)
....................................................................
MySQLdb._exceptions.OperationalError: (1050, "Table 'users_role' already exists")
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 15, in <module>
execute_from_command_line(sys.argv)
File "C:\CSF\CSF-test-framework\Django\keycloakTestEnv\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
utility.execute()
.................................................................
_mysql.connection.query(self, query)
django.db.utils.OperationalError: (1050, "Table 'users_role' already exists")
怎样解决呢?执行指令 python manage.py migrate your_app --fake
对于不同的Django版本,执行的指令应该是不一样的,例如对于Django 2.2,可以使用 python manage.py migrate your_app --fake-initial
Django清空数据库的所有表
1.使用 python manage.py migrate flush, 或者使用 python manage.py migrate app(app的名字) zero,可以清空所有表
2.或者手动删除数据库中的表:
- 删除数据库内所有的表
- 删除项目app中的migrations文件夹中的所有 文件,除了__init__.py 文件
- 运行迁移命令
python manage.py makemigrations
python manage.py migrate