Перенос sqlite в mysql с помощью Django
Я новичок в Django и веб-серверах и застрял на несколько дней. Я унаследовал приложение Django, python версии 2.7 и Django версии 1.9. Приложение ранее использовало базы данных SQLite по умолчанию. Я хочу перейти на Mysql по причинам производительности.
- Я загрузил данные в sqlite db с помощью reset_db .
- Я установил mysqlclient
- Я создал mysql db
- Я создал имя пользователя и пароль для пользователя и предоставил все разрешения
- Я сбросил данные в файл dump.json с помощью
python manage.py dumpdata > dump.json
.
- Я изменил файл настроек, чтобы использовать
django.db.backends.mysql
- Я пытался загрузить данные с помощью
python manage.py loaddata
и с помощьюmakemigrations
,migrate
, он не работает со следующей ошибкой (с ЛЮБОЙ командой manage.py):
Я безрезультатно пытался исправить это следующим образом:
- удаление всех файлов миграции, кроме файла init
- Поддельная миграция
- Все еще не работает с той же ошибкой, потому что мне нужно запустить manage.py для этого
- Даже не загружая sqlite db и просто изменив файл настроек, чтобы он ссылался на mysql и пытался заставить его просто загружаться прямо оттуда
- Прошел немного дальше, он создает некоторые таблицы в mysql, но не заполняет данные, у меня была куча ошибок на этом пути, как
ValueError: The database backend does not accept 0 as a value for AutoField.
, но когда я ищу эти ошибки, соответствующие сообщения не кажутся применимыми или исправляющими проблему .
- Прошел немного дальше, он создает некоторые таблицы в mysql, но не заполняет данные, у меня была куча ошибок на этом пути, как
- Удаление всех .pyc файлов в каталоге и повторная попытка выполнения команд
Я вижу, что база данных существует, но Django не создает и не заполняет таблицы. В Dump.json содержатся правильные данные. Раньше это работало для sqlite.
Мой файл models.py выглядит следующим образом
from django.db import models
from django.utils.translation import ugettext as _
class Category(models.Model):
name = models.CharField(max_length=100)
translations = {
'Hiring and Labor' : 'Kukodi au Kibarua',
'Financial Services' : 'Sekta ya Kifedha',
'Non-Agri Services' : 'Sekta Isiyo ya Kilimo',
'Transport' : 'Usafirishaji',
'Agri Processing' : 'Kuongezea Thamani Bidhaa za Kilimo',
'Merchant/Retail' : 'Wafanyabiashara wa Rejareja',
'Trading and Wholesale' : 'Wafanyabiashara wa Jumla',
'Repairs' : 'Fundi',
}
def __str__(self):
return self.translations.get(self.name,self.name)
@staticmethod
def translated_name():
return _('Category')
class District(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
@staticmethod
def translated_name():
return _('District')
class Village(models.Model):
name = models.CharField(max_length=100)
district = models.ForeignKey(District, on_delete=models.CASCADE)
def __str__(self):
return self.name
@staticmethod
def translated_name():
return _('Village')
class Subvillage(models.Model):
name = models.CharField(max_length=100)
village = models.ForeignKey(Village, on_delete=models.CASCADE)
class Meta:
ordering = ['village__name', 'name']
def __str__(self):
return "{0.village.name} - {0.name}".format(self)
@staticmethod
def translated_name():
return _('Subvillage')
class Business(models.Model):
name = models.CharField(max_length=70)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
# location information
district = models.ForeignKey(District, on_delete=models.CASCADE)
village = models.ForeignKey(Village, on_delete=models.CASCADE)
subvillage = models.ForeignKey(Subvillage,
on_delete=models.CASCADE)
# phone numbers
number1 = models.CharField(max_length=15)
number2 = models.CharField(max_length=15)
number3 = models.CharField(max_length=15)
# business info
subsector1 = models.CharField(max_length=50)
subsector2 = models.CharField(max_length=50)
crop1 = models.CharField(max_length=50)
crop2 = models.CharField(max_length=50)
crop3 = models.CharField(max_length=50)
livestock1 = models.CharField(max_length=50)
livestock2 = models.CharField(max_length=50)
livestock3 = models.CharField(max_length=50)
def __str__(self):
return self.name
def description(self):
return " ".join((self.subsector1, self.subsector2))
@staticmethod
def translated_name():
return _('Business')
Мой файл reset_db.py выглядит следующим образом
Пожалуйста, дайте мне знать, что еще я могу попробовать, рад предоставить любые другие мои файлы, если это необходимо. Спасибо!
Лучшим способом является использование приспособлений:
python manage.py dumpdata > application.json
затем, после того как вы измените свою базу данных:
python manage.py loaddata application.json
Это должно работать идеально, однако если у вас возникнут проблемы, попробуйте выполнить dumpdata
по одному для каждого приложения, например:
python manage.py dumpdata my_app > my_app.json
В некоторых ситуациях может случиться так, что есть некоторые детали, которые вы не можете JSONify некоторую таблицу, тогда вам нужно --exclude
затем в команду dumpdata, например:
python manage.py dumpdata my_app --exclude my_app.mymodel > application.json