В любом случае я могу преобразовать полностью заполненную базу данных MyISAM в InnoDB (таким образом, чтобы создать все внешние ключи, так же, как если бы я запускал команду syncdb с самого начала)?
Преобразование существующей базы данных MyISAM в InnoDB с помощью Django
Ответ 1
Это может помочь:
from django.core.management.base import BaseCommand
from django.db import connections
class Command(BaseCommand):
def handle(self, database="default", *args, **options):
cursor = connections[database].cursor()
cursor.execute("SHOW TABLE STATUS")
for row in cursor.fetchall():
if row[1] != "InnoDB":
print "Converting %s" % row[0],
print cursor.execute("ALTER TABLE %s ENGINE=INNODB" % row[0])
Добавьте это в свое приложение под управлением папок/commands/Затем вы можете преобразовать все ваши таблицы с помощью команды manage.py:
python manage.py convert_to_innodb
Ответ 2
Преобразование MyISAM в InnoDB с помощью Django.
Учитывая, что старая база данных находится в MyISAM.
Сбросьте данные старой базы данных на json с помощью:
$ python manage.py dumpdata contenttypes --indent=4 --natural > contenttype.json
$ python manage.py dumpdata --exclude contenttypes --indent=4 --natural > everything_else.json
Удалите старую базу данных и создайте ее снова.
Добавьте настройки InnoDB в свои settings.py следующим образом:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'STORAGE_ENGINE': 'InnoDB',
'NAME': 'yourdbname',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
'OPTIONS': {
'init_command': 'SET storage_engine=InnoDB', # better to set this in your database config, otherwise django has to do a query everytime
}
}
}
Создание таблиц (django также добавляет отношения) Убедитесь, что вы не добавили пользователя администратора:
$ python manage.py syncdb --migrate
Теперь вы хотите удалить все старые таблицы:
$ python manage.py sqlflush | ./manage.py dbshell
Теперь вы можете загрузить новые данные в базу данных следующим образом:
$ python manage.py loaddata contenttype.json
$ python manage.py loaddata everything_else.json
Там вы идете. Для этого я использовал Django == 1.4.
Ответ 3
Это действительно не имеет никакого отношения к Django. Это всего лишь вещь MySQL, и там есть документация прямо из этого типа: http://dev.mysql.com/doc/refman/5.5/en/converting-tables-to-innodb.html
Ответ 4
У меня была аналогичная ситуация, когда я не понимал, что у моего хостинг-провайдера была такая старая версия MySQL, что она по-прежнему не соответствует MyISAM, но я уже установил базовые таблицы Django.
Это было опубликовано примерно через 2 месяца после первоначального вопроса: Преобразование Legacy Django MySQL DBS из MyISAM в InnoDB.
Это и пик/ответ Трей описывают команду ALTER TABLE ___ ENGINE = INNODB, которая преобразует таблицу в MySQL, но проблема в том, что даже если таблицы конвертируются, у них нет ограничений внешнего ключа, которые были бы если таблицы были INNODB в первую очередь.
Я обнаружил, что django-admin.py и manage.py, что python manage.py sqlall appname
" печатает CREATE TABLE и исходные данные SQL операторов для указанных имен приложений.
Я посмотрел на INSTALLED_APPS в settings.py и закончил запуск чего-то вроде python manage.py sqlall admin auth contenttypes sessions sites messages staticfiles
(по одному для каждого django.contrib.appname в INSTALLED_APPS). Это показало начальные инструкции CREATE TABLE, индексы и ограничения внешнего ключа:
ALTER TABLE `django_admin_log` ADD CONSTRAINT `content_type_id_refs_id_288599e6` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`);
ALTER TABLE `django_admin_log` ADD CONSTRAINT `user_id_refs_id_c8665aa` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`);
ALTER TABLE `auth_permission` ADD CONSTRAINT `content_type_id_refs_id_728de91f` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`);
ALTER TABLE `auth_group_permissions` ADD CONSTRAINT `permission_id_refs_id_a7792de1` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`);
ALTER TABLE `auth_group_permissions` ADD CONSTRAINT `group_id_refs_id_3cea63fe` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`);
ALTER TABLE `auth_user_user_permissions` ADD CONSTRAINT `permission_id_refs_id_67e79cb` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`);
ALTER TABLE `auth_user_groups` ADD CONSTRAINT `group_id_refs_id_f0ee9890` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`);
ALTER TABLE `auth_user_user_permissions` ADD CONSTRAINT `user_id_refs_id_f2045483` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`);
ALTER TABLE `auth_user_groups` ADD CONSTRAINT `user_id_refs_id_831107f1` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`);
ALTER TABLE `auth_message` ADD CONSTRAINT `user_id_refs_id_9af0b65a` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`);
После преобразования всех таблиц в ENGINE = INNODB я запустил ограничения внешнего ключа выше и верю, что у меня должна быть база данных в том же состоянии, какой она была бы, если бы моя база данных по умолчанию не создавала таблицы INNODB.
Кстати, как отметил Майкл ван де Ватер в своем ответе, если вы хотите, чтобы любые новые таблицы Django создавались как INNODB по умолчанию, вы должны добавить 'OPTIONS': {"init_command": "SET storage_engine=INNODB",}
в DATABASES dict в settings.py