اذهب إلى المحتوى

السؤال

نشر

أحاول نقل قاعدة البيانات الخاصة بمشروع جانغو Django من فلاش USB، قاعدة البيانات من نوع sqlite3 أي أنها مجرد ملف واحد، وقمت بتنفيذ الكود التالي لعمل هذه العملية:

os.rename(temp_databse, settings.DATABASES['testing']['NAME'])

وهنا مسار قاعدة البيانات الجديد في ملف settings.py:

'testing': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': '/home/mohssen/projects/learning/db/learning.sqlite3',
},

ولكن يظهر لي الخطأ التالي:

OSError: [Errno 18] Invalid cross-device link

لم أفهم معنى هذا الخطأ، ولا سببه، كيف أنقل قاعدة البيانات برمجيًا بشكل سليم؟

Recommended Posts

  • 1
نشر

بالطبع يمكن إستخدام التابع os.rename لنقل ملف ما، ولكن لكي يعمل هذا التابع يجب أن يكون الملف الأصلي والمسار الذي سيتم نقله إليه في نفس نظام الملفات File System (على نفس القرص Partition)

الخطأ Invalid cross-device link ليس مشكلة في جانغو Django بل ناجم عن نقل ملف من نظام ملفات مختلف File System، حيث أن التابع os.rename يعمل فقط في حالة كان الملف موجود في نظام ملفات معين وتريد نقله إلى مكان آخر ضمن نفس نظام الملفات، بينما في حالتك فإن نقل ملف من نظام ملفات إلى نظام ملفات مختلف (من قرص Partition إلى قرص آخر USB) لا يمكن أن يتم بإستخدام التابع os.rename.

>>> import os
>>> os.getcwd()	# المسار الحالي، في القرص D:
'/mnt/d/temp'
>>> os.rename('test.txt', '/mnt/e/test.txt')	# لا يمكن نقل الملف إلى القرص E:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 18] Invalid cross-device link: 'test.txt' -> '/mnt/e/test.txt'
>>> os.rename('test.txt', '/mnt/d/test.txt')	# بينما سيعمل الكود إذا نقلنا الملف إلى مكان آخر ضمن نفس نظام الملفات
>>> 

يمكنك أن تستعمل التابع shutil.move لهذه العملية، على النحو التالي:

>>> import os, shutil
>>> os.getcwd()
'/mnt/d/temp'
>>> shutil.move('test.txt', '/mnt/e/test.txt')
'/mnt/e/test.txt'
>>> 

ملاحظة: التابع shutil.move سوف يُظهر نفس الخطأ كذلك إن كنت تستعمل Python 2، بينما إذا كنت تستعمل Python 3 فسوف يعمل كل شيء على ما يرام، ولحل المشكلة بالنسبة لـ Python 2 فيمكنك نسخ الملف عبر التابع shutil.copy ثم حذف الملف الأصلي عبر التابع os.remove

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...