Django迁移数据可以根据“代码优先”的原则自动生成数据库中的表,即在代码中直接创建模型类(model),Django会根据我们创建的模型类调用数据迁移命令生成数据库和表。
我在具体操作时遇到一些问题,将解决的过程分享出来,如下:
首先在settings.py中配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'discipline', 'USER': 'root', 'PASSWORD': 'mysql', 'HOST': 'localhost', 'PORT': '3306', # 取消外键约束 'OPTIONS': { "init_command": "SET foreign_key_checks = 0;", } } }
如果想查看在ORM转换过程中产生的SQL语句,则需在setting.py中配置
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level': 'DEBUG', }, } }
执行数据库迁移命令python manage.py makemigrations
时,出现错误“did you install mysqlclient?”,我的电脑安装了conda,执行conda install -c bioconda mysqlclient
继续出现错误AttributeError: module 'MySQLdb.constants.FIELD_TYPE' has no attribute 'JSON'
卸载了mysqlclient,升级了conda,重新安装了mysqlclient,旧的版本是1.3可能不行,新的版本是2.0。迁移时仍出现问题,在mysql数据库中手工增加disclipline数据库(即上文中'NAME': 'discipline'规定的数据库),再次执行迁移,没有出错,但提示No changes detected
。
继续执行python manage.py migrate
,出现错误:1064 “you have an error in your SQL syntax...”
,经查找,发现是mysql版本低导致,有两个解决办法,升级mysql到最近版本,另一个解决方案是在setting.py中增加:
# 解决数据迁移时1064错误 from django.db.backends.mysql.base import DatabaseWrapper DatabaseWrapper.data_types['DateTimeField'] = 'datetime' #fix for MYSQL 5.5
然后再次执行,顺利通过。在数据库中生成了auth_group等表。