के साथ मौजूदा MyISAM डेटाबेस को InnoDB में कनवर्ट करना क्या मैं वैसे भी एक पूर्ण आबादी वाले MyISAM डेटाबेस को InnoDB में परिवर्तित कर सकता हूं (इस तरह से सभी विदेशी कुंजी बाधाएं पैदा होंगी, वैसे ही अगर मैं सिंकडब कमांड चलाता तो यह होगा शुरुआत)?Django
Django
उत्तर
इसका वास्तव में Django से कोई लेना देना नहीं है। यह पूरी तरह से एक MySQL चीज है, और इस प्रकार की चीज़ों पर सीधे दस्तावेज है: http://dev.mysql.com/doc/refman/5.5/en/converting-tables-to-innodb.html
मायोसैम को डीएनएगो के साथ इनो डीबी में कनवर्ट करना।
पुराने डेटाबेस को देखते हुए MyISAM में है।
साथ JSON पुराने डेटाबेस का डेटा डंप:
$ python manage.py dumpdata contenttypes --indent=4 --natural > contenttype.json
$ python manage.py dumpdata --exclude contenttypes --indent=4 --natural > everything_else.json
पुराने डेटाबेस को हटाएँ, और इसे फिर से बनाएँ।
इस तरह से अपनी settings.py में InnoDB सेटिंग जोड़ें:
$ python manage.py syncdb --migrate
:
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 sqlflush | ./manage.py dbshell
अब आप नी लोड कर सकते हैं डेटाबेस में डब्ल्यू डेटा जैसे:
$ python manage.py loaddata contenttype.json
$ python manage.py loaddata everything_else.json
वहां आप जाते हैं। मैंने इसके लिए Django == 1.4 का उपयोग किया।
आप ./manage.py sqlflush का उपयोग कर अपने सभी तालिकाओं को छोटा कर सकते हैं। ./manage.py dbshell – frog32
django दस्तावेज़ आपकी तालिका बनाते समय init_command को हटाने के लिए कहते हैं, क्योंकि यह प्रत्येक डेटाबेस कनेक्शन में एक SQL क्वेरी जोड़ता है। इसके बजाय, अपनी MySQL कॉन्फ़िगरेशन में डिफ़ॉल्ट तालिका प्रकार बदलें। –
जो भी कोड कॉपी/पेस्ट करने के लिए यहां आता है: आपने शायद यह कोशिश की है और इसने लाइन 1 पर त्रुटि "त्रुटि" 1064 (42000) दी है। ऐसा इसलिए है क्योंकि 'python manage.py sqlflush' चलाते समय प्रारंभिक चेतावनियां थीं। इसे रोकने के लिए: 'python manage.py sqlflush> flushdump.txt', प्रारंभिक चेतावनियां हटाएं, सहेजें, फिर' python manage.py dbshell
यह मदद कर सकता है:
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])
फ़ोल्डरों के तहत अपने एप्लिकेशन में जोड़ प्रबंधन/आदेशों/तो फिर आप अपने सभी तालिकाओं एक manage.py आदेश के साथ परिवर्तित कर सकते हैं:
python manage.py convert_to_innodb
मैं था इसी तरह की स्थिति जहां मुझे एहसास नहीं हुआ कि मेरे होस्टिंग प्रदाता के पास ऐसा पुराना MySQL संस्करण था जो अभी भी माईसाम में डिफॉल्ट किया गया था, लेकिन मैं पहले से ही मूल Django तालिकाओं को स्थापित कर दूंगा।
यह मूल प्रश्न के बाद लगभग 2 महीने बाद पोस्ट किया गया था: Convert Legacy Django MySQL DBS from MyISAM to InnoDB।
वह और लीच/ट्रे का उत्तर ALTER तालिका ___ इंजन = INNODB कमांड का वर्णन करता है जो तालिका को MySQL में परिवर्तित करता है, लेकिन समस्या यह है कि तालिकाएं परिवर्तित होने के बावजूद, उनके पास विदेशी कुंजी बाधाएं नहीं होतीं अगर टेबल पहली जगह INNODB था तो स्थापित किया गया था।
मुझे django-admin.py and manage.py पर मिला, python manage.py sqlall appname
"दिए गए ऐप नामों के लिए CREATE तालिका और प्रारंभिक-डेटा SQL कथन मुद्रित करता है।"
मैंने सेटिंग.py में INSTALLED_APPS को देखा और python manage.py sqlall admin auth contenttypes sessions sites messages staticfiles
(INSTALLED_APPS में प्रत्येक django.contrib.appname के लिए) जैसे कुछ चलाना समाप्त कर दिया।यही कारण है कि पता चला है प्रारंभिक टेबल बयान, अनुक्रमित और विदेशी कुंजी की कमी बनाएँ:
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`);
इंजन = InnoDB के लिए सभी तालिकाओं परिवर्तित करने के बाद मैं ऊपर विदेशी कुंजी की कमी भाग गया और विश्वास है कि मैं यह रूप में एक ही राज्य में डेटाबेस होना चाहिए अगर मेरा डेटाबेस पहले स्थान पर INNODB टेबल बनाने के लिए डिफॉल्ट किया गया होता तो होता।
संयोग से, के रूप में माइकल वान डे Waeter अपने जवाब में बताया गया है, अगर आप किसी भी नए टेबल Django डिफ़ॉल्ट रूप से InnoDB जा करने के लिए बनाता है चाहते हैं, आप डेटाबेस के लिए 'OPTIONS': {"init_command": "SET storage_engine=INNODB",}
जोड़ना चाहिए settings.py में dict
यह वास्तव में है? मेरा मतलब है, माईसाम टेबलों में उनकी परिभाषाओं में संग्रहित कोई विदेशी कुंजी बाधा नहीं है। दूसरी तरफ Django, तालिकाओं के संबंधों के बारे में जानकारी है, है ना? शायद ओपी टेबलों को बदलने के लिए और साथ ही साथ डीजेगो में परिभाषित एफके (संबंधों के अनुरूप) जोड़ने के तरीके के बारे में पूछ रहा है? –
@ypercube - आप सही हैं, मुझे नहीं पता कि क्रिस ने क्यों सोचा था कि यह Django के लिए उपयुक्त नहीं है .. – Ohad
क्रिस की टिप्पणी में उन्होंने कहा कि यह Django के लिए उपयुक्त नहीं है? उन्होंने अभी कहा है कि तालिकाओं को माइग्रेट करने से Django के साथ कुछ लेना देना नहीं है, जो सच है। उनके निर्देशों का पालन करें, और यदि एफके बाधाएं पहले से नहीं हैं तो आप उन्हें 'manage.py sqlindexes' के साथ प्राप्त कर सकते हैं। –