পোস্টগ্রিস কেন ইতিমধ্যে ব্যবহৃত পিকে মান উত্পন্ন করে?


20

আমি জ্যাঙ্গো ব্যবহার করছি এবং প্রতিবার একবারে এই ত্রুটিটি পেয়েছি:

সত্যতা ত্রুটি: সদৃশ কী মানটি অনন্য বাধা "myapp_mymodel_pkey" লঙ্ঘন করে বিবরণ
: কী (আইডি) = (1) ইতিমধ্যে বিদ্যমান।

আমার পোস্টগ্রিস ডাটাবেসে আসলে 1 এর প্রাথমিক কী সহ একটি ম্যাপস_মোমডেল অবজেক্ট থাকে।

পোস্টগ্রিস কেন আবার সেই প্রাথমিক কীটি ব্যবহার করার চেষ্টা করবে? বা, সম্ভবত আমার অ্যাপ্লিকেশনটি (বা জ্যাঙ্গোর ওআরএম) এটির কারণ?

এই সমস্যাটি এখনই পরপর আরও 3 বার ঘটেছে। আমি কি পেয়েছি যখন এটি যে নেই ঘটতে এটা একটি প্রদত্ত টেবিলের জন্য একটি সারিতে এক বা একাধিকবার ঘটে, তাহলে আবার। প্রতিটি টেবিলের জন্য এটি পুরোপুরি কয়েক দিন থামার আগে ঘটেছিল বলে মনে হয়, প্রতি টেবিলের জন্য কমপক্ষে এক মিনিট বা তার বেশি সময় ঘটেছিল এবং কেবল মাঝে মধ্যেই ঘটছে (সমস্ত টেবিল এখনই নয়)।

এই ত্রুটিটি মাঝে মাঝে মাঝেমধ্যে ঘটেছিল (2 সপ্তাহের মধ্যে কেবল 3 বা এত বার ঘটেছিল - ডিবিতে অন্য কোনও বোঝা নয়, কেবলমাত্র আমি আমার আবেদন পরীক্ষা করে দেখি) এটিই আমাকে নিম্ন স্তরের সমস্যার থেকে এতটা সতর্ক করে তোলে।


জ্যাঙ্গো সুনির্দিষ্টভাবে জানিয়েছে যে প্রাথমিক কীটি ডিবিএমএস দ্বারা উত্পাদিত হয়েছে যদি না নির্দিষ্ট করা হয় - তবে এখনই আমি জানি না যে @ অরোকুসাকী তার অজগর কোডটিতে কী করছিলেন, তবে আমি এই পৃষ্ঠায় শেষ হয়েছি কারণ আমি যথেষ্ট আত্মবিশ্বাসী যে আমার কোনও কোড নেই একটি নির্দিষ্ট প্রাথমিক কী ব্যবহার করার চেষ্টা করছি এবং আমি কোনও ডিবিএমএস কখনও ভুল ব্যবহার করার চেষ্টা করতে দেখিনি।
এমসিসিসি

উত্তর:


34

পোস্টগ্রাএসকিউএল নিজেই সদৃশ মান toোকানোর চেষ্টা করবে না, এটি আপনি (আপনার অ্যাপ্লিকেশন, ওআরএম অন্তর্ভুক্ত) যারা করেন।

এটি হয় ভুল অবস্থানে পিকে সেট করে মানগুলি খাওয়ানোর একটি ক্রম হতে পারে এবং ইতিমধ্যে এর সমান মানযুক্ত টেবিল nextval()- বা কেবল আপনার অ্যাপ্লিকেশনটি ভুল কাজ করে। প্রথমটি ঠিক করা সহজ:

SELECT setval('your_sequence_name', (SELECT max(id) FROM your_table));

দ্বিতীয়টির অর্থ ডিবাগিং।

জ্যাঙ্গো (বা অন্য কোনও জনপ্রিয় কাঠামো) নিজে থেকে সিকোয়েন্সগুলি পুনরায় সেট করে না - অন্যথায় আমাদের অন্য প্রতিটি দিন একই রকম প্রশ্ন থাকবে।


বিচ্ছিন্নকরণের বিভিন্ন স্তর সম্পর্কে (এখানেও @ অ্যান্ডির উত্তরের উপর ভিত্তি করে) লক্ষ্য করার মতো? উদাহরণস্বরূপ, যদি দ্বিতীয় ক্যোয়ারী প্রথমটি সম্পন্ন হওয়ার আগে আসে তবে এটি কি সম্ভব হবে যেখানে আমি কোনও লেনদেন ব্যবহার করছি না এমন একটি দৃশ্যের ভিত্তিতে একটি রেকর্ড সন্নিবেশ করানো হয়েছে max(id)যা প্রথম ক্যোয়ারী শেষ হওয়ার আগে প্রাপ্ত ফলাফল এবং তারপরে উভয়কেই ফলে একই ফলাফল?
orokusaki

5

আপনি সম্ভবত কোনও টেবিলের মধ্যে একটি সারি সন্নিবেশ করতে যাচ্ছেন যার জন্য ক্রমিক কলামের ক্রম মানটি আপডেট করা হয়নি।

আপনার টেবিলে নিম্নলিখিত কলামটি বিবেচনা করুন যা পোস্টগ্রিসের জন্য জ্যাঙ্গো ওআরএম দ্বারা সংজ্ঞায়িত প্রাথমিক কী

id serial NOT NULL

যার ডিফল্ট মান সেট করা আছে

nextval('table_name_id_seq'::regclass)

আইডি ক্ষেত্রটি ফাঁকা হিসাবে সেট করা থাকলেই অনুক্রমটি মূল্যায়ন করা হয়। টেবিলে ইতিমধ্যে এন্ট্রি থাকলে তা সমস্যা।

প্রশ্নটি হল কেন সেই আগের এন্ট্রিগুলি ক্রম আপডেটটি ট্রিগার করে নি? কারণ আইডি মানটি পূর্ববর্তী সমস্ত এন্ট্রিগুলির জন্য স্পষ্টভাবে সরবরাহ করা হয়েছিল।

আমার ক্ষেত্রে সেই প্রাথমিক এন্ট্রিগুলি মাইগ্রেশনের মাধ্যমে ফিক্সচার থেকে লোড করা হয়েছিল।

এ সমস্যাটি এলোমেলো পিকে মান সহ কাস্টম এন্ট্রিগুলির মাধ্যমেও জটিল হয়ে উঠতে পারে।

যেমন বলুন। আপনার টেবিলে 10 টি প্রবেশ রয়েছে ries আপনি পিকে = 15 দিয়ে সুস্পষ্ট এন্ট্রি করেন। কোডের মাধ্যমে পরবর্তী চারটি সন্নিবেশ পুরোপুরি সূক্ষ্মভাবে কাজ করবে তবে 5 তম একটি ব্যতিক্রম বাড়িয়ে তুলবে।

DETAIL: Key (id)=(15) already exists.

এই পোস্টের জন্য আপনাকে ধন্যবাদ। আমি দীর্ঘদিন ধরে এই জাতীয় একটি মামলা ডিবাগ করছি। খুব কমই ঘটেছিল। এটি প্রমাণিত হয়েছে যে একটি নির্দিষ্ট "ম্যানুয়াল" অ্যাডমিন ফাংশনটি নিজেরাই আইডিগুলি সন্নিবেশ করতে পারে, পরিচয় কাউন্টারটি পুরানো মান সহ রেখে। এটি "পরিচয় হিসাবে জেনারেটেড হিসাবে পরিচয়" সহ সত্যই বিপদ। পরের বার আমি একটি পরিচয় কলাম সংজ্ঞায়িত করার পরে "সর্বদা" পরিবর্তে "বাই ডিফল্ট" ব্যবহার করার আগে দু'বার চিন্তা করব।
মাইকেল

4

আমি এখানে খুব একই ত্রুটি দিয়ে শেষ করেছি, যা খুব কমই ঘটেছিল, এবং ট্র্যাকিং করা শক্ত ছিল, কারণ আমি যেখানে খুঁজছি সেখানে তা খুঁজছিলাম না।

ফল্ট ছিল জেএস পুনরাবৃত্তি যা সার্ভারের দু'বার পোষ্ট করছিল! তাই কখনও কখনও এটি কেবল আপনার জ্যাঙ্গো (বা অন্য কোনও ওয়েব ফ্রেম ফ্রেম) দৃষ্টিভঙ্গি এবং ফর্মগুলিতে নয় তবে খুব সামনের দিকে কী ঘটে তাও একবার দেখার মতো।


1

হ্যাঁ অদ্ভুত জিনিস। মাইগ্রেশনে ডেটা লোড করার সময় আমার ক্ষেত্রে দৃশ্যত কিছু ভুল। আমি খালি মাইগ্রেশন যুক্ত করেছি এবং কিছু প্রাথমিক তথ্য যোগ করার জন্য লাইনগুলি লিখেছিলাম, আমার ক্ষেত্রে 6 টি রেকর্ড

db_alias = schema_editor.connection.alias
bulk = []
for item in items:
    bulk.append(MyModel(
        id=item[0],
        value=item[1],
        slug=item[2],
        name=item[3],
    ))

MyModel.objects.using(db_alias).bulk_create(bulk)

তারপরে অ্যাডমিন প্যানেলে আমি নতুন আইটেম যুক্ত করার চেষ্টা করেছি এবং পেয়েছি:

প্রথম প্রচেষ্টা:

DETAIL:  Key (id)=(1) already exists.

পরে প্রচেষ্টা:

DETAIL:  Key (id)=(2) already exists.
DETAIL:  Key (id)=(3) already exists.
DETAIL:  Key (id)=(4) already exists.
DETAIL:  Key (id)=(5) already exists.
DETAIL:  Key (id)=(6) already exists.

এবং অবশেষে সপ্তম এবং সময়ে সমস্ত সফল হয়

সুতরাং আমি বলছি সেখানে বাল্ক_ক্রিয়েট সম্পর্কিত কিছু থাকতে পারে কারণ আমি সেখানে items টি আইটেম লোড করেছি। এটি সম্ভবত আপনার জ্যাঙ্গো প্রকল্পের অনুরূপ কিছু হতে পারে causing

জাজানো 1.9 পোস্টগ্র্যাস এসকিউএল 9.3.14

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