如何迁移django模型到新的数据库

uinbv5nw  于 2023-02-25  发布在  Go
关注(0)|答案(2)|浏览(172)

我在本地系统上开发了一个django项目,现在我将其部署到服务器上。我使用MySql作为数据库。每当我尝试将我模型(使用python manage.py migratepython manage.py makemigrations)迁移到服务器的新数据库时,它显示以下错误:

django.db.utils.ProgrammingError: (1146, "Table '<DB_NAME>.mainapp_service' doesn't exist")

并且不会在数据库中创建表。
我没有移动任何我的本地migration文件到服务器,只是移动mainapp/migrations/__init__.py文件.
如何创建所有表格并运行应用程序?

46scxncf

46scxncf1#

你真的不应该在服务器上运行makemigrations。你应该在版本控制中包含迁移,并将你的迁移文件推送到服务器上,然后运行migrate。确保你已经在服务器上创建了数据库,并在settings.py中配置了它。查看关于迁移的工作流部分。

jucafojl

jucafojl2#

Django中MySQL的配置

settings.py

import pymysql           # MySQL
pymysql.install_as_MySQLdb()
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',   # db engine
        'NAME': 'mydb',         # db name
        'USER': 'root',         # db username
        'PASSWORD': '1234',     
        'HOST': 'localhost',    
        'PORT': '3306',         
    }
}

数据库迁移

Python3不支持MySQLdb,pymysql是一个替代方案。
1.首先,在venv中安装pymysql

pymysql:pip install pymysql

2.在_init_.pysettings.py中添加以下代码。

import pymysql
pymysql.install_as_MySQLdb()

1.在终端中运行迁移命令:

python manage.py makemigrations
python manage.py migrate
    • 注意**:如果运行python manage.py makemigrations后显示No changes detected,则尝试运行python manage.py makemigrations --empty appname

数据迁移

将SQLite数据导出到MySQL

1.SQLite数据导出

settins.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

在航站楼内

python manage.py dumpdata > data.json

将数据导出到根字典中的data.json文件。

2.导入数据到MySQL

settings.py中将配置从Django修改为MySQL:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db name',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': 'IP',
        'PORT': '3306',
    }
}

运行

python manage.py loaddata data.json

注:确保Mysql表为空,确保Mysql user table为空,如果以前迁移过数据到Mysql,可能会出错,注意出错时报错信息,如果提示主键重复,需要先删除数据,该数据是迁移文件应用到MySQL数据库时产生的。通常是与content_type相关的表。
在MySQL终端中:

use db_name;
delete from auth_permission;
delete from django_content_type;

如果出错,删除所有数据,重新导入数据库,基本上导入数据失败是因为MySQL中有数据存在。

3.加载时区表

另外,也有可能是安装的MySQL没有加载时区表,Django官方文档也指出了这个问题,MySQL网站也有相应的方法来应对:加载时区表。
Linux/Mac解决方案非常简单。windows系统应该首先下载一个sql file:timezone_2018e_posix_sql.zip
下载完成后,解压缩得到sql文件,执行cmd命令导入文件:

mysql -u root -p mysql < timezone_posix.sql
4. MySQL到PostgreSQL
python manage.py dumpdata > backup.json

在PostgreSQL配置中:

python manage.py loaddata backup.json

不同APP之间的数据库迁移

1.生成模型文件
python3 manage.py inspectdb

2.将模型文件导入应用程序

创建应用程序

python3 manage.py startapp 'app_name'
3.将模型导入到创建的应用程序中
python3 manage.py inspectdb > app/models.py

相关问题