জাজানো দক্ষিণ - টেবিলটি ইতিমধ্যে বিদ্যমান


188

আমি দক্ষিণের সাথে শুরু করার চেষ্টা করছি। আমি একটি বিদ্যমান ডাটাবেস ছিল এবং আমি দক্ষিণ জোড়া হয়েছে ( syncdb,schemamigration --initial ) যুক্ত করেছি।

তারপরে, আমি models.pyএকটি ক্ষেত্র যোগ করতে আপডেট করে দৌড়ে এসেছি ./manage.py schemamigration myapp --auto। এটি ক্ষেত্রটি খুঁজে পেয়েছে বলে মনে হচ্ছে এবং আমি এটি প্রয়োগ করতে পারি ./manage.py migrate myapp। কিন্তু, এটি করা ত্রুটিটি দিয়েছে:

django.db.utils.DatabaseError: table "myapp_tablename" already exists

tablenameতালিকাভুক্ত প্রথম টেবিল models.py

আমি জ্যাঙ্গো ১.২, দক্ষিণ ০.। চালাচ্ছি

উত্তর:


311

যেহেতু আপনার কাছে ইতিমধ্যে ডাটাবেসে সারণী তৈরি করা হয়েছে, আপনার প্রাথমিক মাইগ্রেশনটিকে জাল হিসাবে চালানো দরকার

./manage.py migrate myapp --fake

নিশ্চিত করুন যে মডেলগুলির স্কিমা ডাটাবেসে টেবিলগুলির স্কিমা হিসাবে একই।


1
বুঝেছি ধন্যবাদ. এটি আসলে মাইগ্রেট এবং স্কিমেমিগ্রেশন নয়, তবে আপনার উত্তর আমাকে সঠিক দিকে পেয়েছে।
স্টিভ

1
আমার ভুল ঠিক ওপি থেকে কমান্ড কপি, সঠিক কমান্ড ./manage.py স্থানান্তরণের myapp --fake
অশোক

এই সমাধানটি আমার ক্ষেত্রে সমস্যার সমাধান করেনি। আমি ডাটাবেসটি সংশোধন করি নি এবং কিছু ভিউ ক্র্যাশ করেছি কারণ ক্ষেত্রটি টেবিলে তৈরি হয়নি। আমাকে নতুন সম্পত্তির বিষয়ে মন্তব্য করতে হয়েছিল, সবকিছু
পুনঃপ্রকাশের

1
@ আশোক সম্ভবত আপনারও উল্লেখ করা উচিত যে আমরা ইতিমধ্যে শেষের আগে সংশোধন করেছি schemamigrationসে migrateক্ষেত্রে আমাদের আবারও করতে হবে schemamigration
পিয়েরে লেস্পিনে

3
এটি আমাকে সাহায্য করেনি। আমার কাছে ইতিমধ্যে আমার ডাটাবেসে একটি টেবিল ছিল এবং মাইগ্রেশন নকল হওয়ার পরে, নকল হওয়া অন্যান্য সারণীগুলি যুক্ত করার কোনও উপায় ছিল না। আমাকে সমস্ত টেবিল ফেলে রেখে নতুন করে শুরু করতে হয়েছিল।
শাইলেন

41

যদিও আমি করার পরে "myapp_tablename" টেবিলটি ইতিমধ্যে ত্রুটি বাড়ানো বন্ধ করে দেয় /

ঠিক একই সমস্যা পেয়েছি!

1. মাইগ্রেশন নম্বর যাচাই করে যাচ্ছেন তা প্রথম দেখুন। ধরুন এটি হ'ল: 0010।

2. আপনার প্রয়োজন:

./manage.py schemamigration myapp --add-field MyModel.added_field
./manage.py migrate myapp

যদি একাধিক ক্ষেত্র অনুপস্থিত থাকে তবে আপনাকে প্রতিটি ক্ষেত্রের জন্য এটি পুনরাবৃত্তি করতে হবে।

Ow.এখন আপনি একত্রে নতুন মাইগ্রেশন নিয়ে অবতরণ করুন সুতরাং তাদের ফাইলগুলি সরান নিয়ে অবতরণ করুন মাইএপ / মাইগ্রেশন থেকে সরান (0011 এবং আরও যদি আপনার একাধিক ক্ষেত্র যুক্ত করার প্রয়োজন হয়)।

৪.এটি চালান:

./manage.py migrate myapp 0010

এখন ./manage.py মাইগ্রেট মাইএপ চেষ্টা করুন

এটি ব্যর্থ না হলে আপনি প্রস্তুত। কোনও ক্ষেত্র অনুপস্থিত না হলে কেবল ডাবল চেক করুন।

সম্পাদনা করুন:

এই সমস্যাটি তখনও দেখা দিতে পারে যখন আপনি একটি প্রোডাকশন ডাটাবেস রাখেন যার জন্য আপনি দক্ষিণ ইনস্টল করেন এবং অন্যান্য vকুমারীতে তৈরি প্রথম, প্রাথমিক মাইগ্রেশন আপনার ডিবিতে ইতিমধ্যে যা আছে তা নকল করে। সমাধান এখানে অনেক সহজ:

  1. প্রথম স্থানান্তর নকল:

    ./ পরিচালন মাইগ্রেশন মাইএপ 0001 - ফেক

  2. বাকী স্থানান্তরগুলির সাথে রোল করুন:

    ./ পরিচালন মাইপআপ করুন


10

আমি যখন এই ত্রুটির দিকে দৌড়লাম তখন এর আলাদা কারণ ছিল।

আমার ক্ষেত্রে দক্ষিণের কোনওভাবেই আমার ডিবিতে একটি অস্থায়ী খালি টেবিলটি রেখে গেছে, যা _আরমেক_ টেবিল () এ ব্যবহৃত হয় । সম্ভবত আমি মাইগ্রেশনটি এমনভাবে বাতিল করে দিয়েছিলাম যা আমার উচিত ছিল না। যাই হোক, প্রতিটি পরবর্তী নতুন মাইগ্রেশন, যখন এটি _remake_table নামক (), ত্রুটি নিক্ষেপ করা হয়েছিল sqlite3.pypysqlite2.dbapi2.OperationalError: table "_south_new_myapp_mymodel" already exists, কারণ এটি হয়নি ইতিমধ্যে বিদ্যমান এবং সেখানে হতে অনুমিত হয় নি।

_সুথ_নিউটটি আমার কাছে অদ্ভুত লাগছিল, তাই আমি আমার ডিবি ব্রাউজ করলাম, টেবিলটি দেখলাম _south_new_myapp_mymodel, মাথা আঁচড়ালাম, দক্ষিণের উত্সের দিকে তাকিয়েছি , সিদ্ধান্ত নিয়েছি এটি আবর্জনা, টেবিলটি ফেলেছে এবং সবকিছু ঠিক আছে।


এটি আমি যা দেখেছিলাম এবং যদি এটি পেয়েছি তবে আমার আধা ঘন্টা মস্তিষ্কের বেদনা বাঁচাতে পারত। অত্যন্ত অপ্রীতিকর - তবে এগুলি অস্থায়ী মাইগ্রেশন টেবিলগুলি এবং ব্যর্থ স্থানান্তরকালে সম্ভবত পরিদর্শন করার উদ্দেশ্যে রেখে দেওয়া হয় inspection মাইগ্রেশন প্রয়াস চলাকালীন কিছু ডিবি অখণ্ডতার সমস্যার কারণে খনিটি ঘটেছে।
ড্যানি স্ট্যাপল

এটি উচ্চতর হতে হবে! আপনি যদি ডিবি ডাব্লু / ও স্কিমা লেনদেন ব্যবহার করেন তবে এটি খুব সহজেই ঘটতে পারে
যুজি 'টোমিটা' টোমিটা

2

আপনার যদি আপনার মডেলগুলি @ পাইলগ্রিজিয়ামের মতো আপনার ডেটাবেসটি না মেলে সমস্যা হয় এবং আপনি সর্বশেষতম মডেল.পি ফাইলের সাথে মেলে ডাটাবেসটি স্বয়ংক্রিয়ভাবে স্থানান্তর করতে চান (এবং এমন কোনও ডেটা মুছতে চান যা ফিক্সচারগুলির মাধ্যমে পুনরায় তৈরি করা হবে না migrate):

manage.py schemamigration myapp --initial
manage.py migrate myapp --fake
manage.py migrate myapp zero
manage.py migrate myapp

এটি কেবলমাত্র আপনার সর্বশেষ models.pyফাইলে থাকা ডাটাবেস টেবিলগুলি মুছে ফেলবে এবং পুনরায় তৈরি করবে , যাতে আপনার পূর্ববর্তী syncdbএস বা migrateএস থেকে আপনার ডাটাবেসে জঞ্জাল টেবিল থাকতে পারে । এগুলি থেকে পরিত্রাণ পেতে, এই সমস্ত স্থানান্তরের আগে এইগুলি সহ:

manage.py sqlclear myapp | manage.py sqlshell

এবং যদি এটি এখনও আপনার ডাটাবেসে কিছু সিআরএফটি পড়ে থাকে তবে আপনাকে কাজটি করার আগে আপনাকে একটি টেবিল এবং অ্যাপ্লিকেশন যেটি পরিষ্কার করতে চান তা থেকে inspectdbএকটি models.pyফাইল তৈরি করতে হবে sqlclearএবং তারপরে আপনার মূল মডেলগুলি পুনরুদ্ধার করুন। --initialমাইগ্রেশন তৈরি করা এবং এতে স্থানান্তর করা। আপনার ডাটাবেসের যে প্রয়োজন এসকিউএল এর বিশেষ স্বাদে ঘৃণা এড়ানোর জন্য এই সমস্ত।


1

Perform these steps in order may help you:

1) পাইথন ম্যানেজ.পি স্কিমাইগ্রেশন অ্যাপস। অ্যাপ্লিকেশন - ইনিশিয়াল

উপরের পদক্ষেপটি মাইগ্রেশন ফোল্ডারটিকে ডিফল্ট হিসাবে তৈরি করে।

2) পাইথন ম্যানেজ.পি মাইগ্রেট অ্যাপস.অ্যাপনেম - ফেক

একটি জাল স্থানান্তর উত্পন্ন।

3) পাইথন ম্যানেজ.পি স্কিমাইগ্রেশন অ্যাপস.অ্যাপনেম --আউটো

তারপরে আপনি নিজের ইচ্ছানুযায়ী ক্ষেত্রগুলি যুক্ত করতে এবং উপরের কমান্ডটি সম্পাদন করতে পারেন।

৪) পাইথন ম্যানেজ.পি মাইগ্রেট অ্যাপস.অ্যাপনেম


1

আপনার যদি বিদ্যমান ডাটাবেস এবং অ্যাপ থাকে তবে আপনি দক্ষিণ রূপান্তর কমান্ডটি ব্যবহার করতে পারেন

./manage.py convert_to_south myapp

এটি আগে প্রয়োগ করতে হবেইতিমধ্যে ডাটাবেসে থাকা কোনও পরিবর্তন করার ।

রূপান্তর_সুক্ষু কমান্ড কেবল আপনার চালিত প্রথম মেশিনে সম্পূর্ণরূপে কাজ করে। একবার আপনি আপনার ভিসিএসে প্রারম্ভিক মাইগ্রেশনটি প্রতিশ্রুতিবদ্ধ করার পরে ./manage.py migrate myapp 0001 --fake, কোডবেসের একটি অনুলিপি থাকা প্রতিটি মেশিনে আপনাকে চালনা করতে হবে (তা নিশ্চিত করুন যে তারা মডেল এবং স্কিমার সাথে প্রথমে আপ-টু-ডেট ছিল)। রেফ: http://south.readthedocs.org/en/latest/convertinganapp.html


0

অস্থায়ী সমাধান হিসাবে, আপনি স্থানান্তর স্ক্রিপ্টে সারণী তৈরির মন্তব্য করতে পারেন can

class Migration(migrations.Migration):

    dependencies = [
        (...)
    ]

    operations = [
        #migrations.CreateModel(
        #    name='TABLE',
        #    fields=[
        #            ....
        #            ....
        #    ],
        #),
        ....
        ....

অথবা

যদি বিদ্যমান সারণীতে কোনও সারি থাকে না (খালি), তবে নীচের মতো টেবিলটি মোছার বিষয়টি বিবেচনা করুন। (টেবিলটিতে কোনও সারি না থাকলে এই ফিক্সটি সুপারিশ করা হয়) । ক্রিয়েমোডেল অপারেশনের আগেও এই অপারেশনটি নিশ্চিত করুন।

class Migration(migrations.Migration):

    dependencies = [
        (...),
    ]

    operations = [
        migrations.RunSQL("DROP TABLE myapp_tablename;")
    ]

0

আরও একটি সমাধান (সম্ভবত একটি অস্থায়ী সমাধান)।

$ python manage.py sqlmigrate APP_NAME MIGRATION_NAME

যেমন।,।

$ python manage.py sqlmigrate users 0029_auto_20170310_1117

এটি কাঁচা এসকিএল কোয়েরিতে সমস্ত মাইগ্রেশন তালিকাভুক্ত করবে। বিদ্যমান সারণী তৈরি করে এমন অংশটি এড়িয়ে আপনি যে প্রশ্নগুলি চালাতে চান তা চয়ন করতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.