جانغو-مزامنة البيانات بين قواعد بيانات متعددة
-
23-12-2019 - |
سؤال
على بيئة قاعدة بيانات متعددة, كيفية نقل كافة البيانات من قاعدة بيانات إلى أخرى?
تبدو الإعدادات كما يلي:
DATABASES = {
'default': {},
'users': {
'NAME': 'user_data',
'ENGINE': 'django.db.backends.sqlite3',
'USER': 'user',
'PASSWORD': 'superS3cret'
},
'customers': {
'NAME': 'customer_data',
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'USER': 'cust',
'PASSWORD': 'veryPriv@ate'
}
}
هل هناك أي حل بسيط / التطبيق للقيام بذلك?على الرغم من أن الهجرة في اتجاه واحد كافية ، لأن هناك العشرات من النماذج والكائنات مع أوركينكي معقدة والعديد إلى العديد من الاتصالات ، والتكرار على النماذج والكائنات ، وحفظها في آخر لا يحل مشكلتي.
loaddata
فشل أيضا ، لأن إنشاء الكائن يستخدم إشارات لإنشاء كائنات أخرى ، وهذا يفسد مفاتيح فريدة.
باستخدام مقالب سكل ليست تافهة حتى ، لأن الخلفية مختلفة.لقد حاولت هذا ، لم أتمكن من إدارة لجعل مقالب بسكل من قاعدة بيانات سكليت 3 بلدي ، والتي لا خبط المفاتيح الخارجية.
لذلك أنا بحاجة إلى حل ، الذي يحمل البيانات من قاعدة بيانات إلى أخرى ، ولكن لا يرسل إشارات ، ويعمل مع مفاتيح خارجية كذلك.لكنني لم أجد أي شيء يفعل ذلك.
المحلول
أخيرا تمكنت من حل هذا.
أنا خلقت الجداول باستخدام
manage.py syncdb --all
manage.py migrate --fake
تحميل مقالب مع loaddata
لم تنجح بسبب مشاكل النزاهة.(كسر القيود الرئيسية الخارجية ، على سبيل المثال)
لذلك اضطررت إلى تغيير طاولاتي.أزلت القيود المكسورة ، ومن ثم يمكنني الركض loaddata
دون أي مشاكل.
ومع ذلك ، بالطبع كانت قاعدة البيانات الخاصة بي لا تزال مكسورة منذ أن أسقطت بضعة قيود.لذلك ، كان علي ببساطة تغيير طاولاتي مرة أخرى ، باستخدام psql
شل.
جاء بغادمين في متناول اليدين ، منذ يظهر استعلامات تفريغ ذات الصلة على واجهة سهلة الاستخدام ، بشكل منفصل لكل قيود مختلفة.
نصائح أخرى
فما استقاموا لكم فاستقيموا مجرد كتابة السيناريو بيثون ل ترحيل المثيل من قاعدة بيانات واحدة إلى أخرى, ، قم بتشغيل هذا البرنامج النصي باستخدام جانغو-ملحقات رونسكريبت
على سبيل المثال
# Move Foo table data from one to another
for each_foo in Foo.objects.using("users").all():
# _create foo instance in customer_data
foo_obj, status = Foo.objects.using("customers").get_or_create(
foo_name=each_foo.foo_name,
foo_code=each_foo.foo_code)