খুব পুরানো পোস্ট, তবে আমি এটিতে কেবল এক বা দু' ঘন্টা সময় ব্যয় করেছি, তাই আমি আমার অনুসন্ধানটি ভাগ করে নিতে চেয়েছিলাম, বিশেষত যেহেতু তালিকাভুক্ত অন্যান্য মন্তব্যগুলির মধ্যে কিছু সঠিক নয়।
টি এল; ডিআর
সন্তানের টেবিলটিকে একটি বিদেশী দিন বা বিদ্যমান একটিকে সংশোধন করুন ondelete='CASCADE':
parent_id = db.Column(db.Integer, db.ForeignKey('parent.id', ondelete='CASCADE'))
আর এক নিম্নলিখিত সম্পর্কের:
ক) এটি পিতামাতার টেবিলে:
children = db.relationship('Child', backref='parent', passive_deletes=True)
খ) বা এটি সন্তানের টেবিলে:
parent = db.relationship('Parent', backref=backref('children', passive_deletes=True))
বিস্তারিত
প্রথমে গ্রহণযোগ্য উত্তর যা বলে তা সত্ত্বেও পিতামাতার / সন্তানের সম্পর্কটি ব্যবহার করে প্রতিষ্ঠিত হয় না relationship, এটি ব্যবহার করে প্রতিষ্ঠিত হয় ForeignKey। আপনি relationshipপিতামাতা বা সন্তানের টেবিলগুলির উপর এটি রাখতে পারেন এবং এটি দুর্দান্ত কাজ করবে। যদিও, স্পষ্টত শিশু টেবিলগুলিতে, আপনাকে backrefকীওয়ার্ড যুক্তি ছাড়াও ফাংশনটি ব্যবহার করতে হবে।
বিকল্প 1 (পছন্দসই)
দ্বিতীয়ত, স্কেলএলচেমি দুটি ভিন্ন ধরণের ক্যাসকেডিং সমর্থন করে। প্রথমটি এবং আমি প্রস্তাবিত একটিটি আপনার ডেটাবেজে অন্তর্নির্মিত হয় এবং সাধারণত বিদেশী কী ঘোষণার ক্ষেত্রে সীমাবদ্ধতার রূপ নেয়। PostgreSQL এ দেখতে এটির মতো দেখাচ্ছে:
CONSTRAINT child_parent_id_fkey FOREIGN KEY (parent_id)
REFERENCES parent_table(id) MATCH SIMPLE
ON DELETE CASCADE
এর অর্থ হ'ল আপনি যখন কোনও রেকর্ড মুছবেন parent_table, তারপরে থাকা সমস্ত সম্পর্কিত সারিগুলি child_tableআপনার জন্য ডেটাবেস দ্বারা মুছে ফেলা হবে। এটি দ্রুত এবং নির্ভরযোগ্য এবং সম্ভবত আপনার সেরা বাজি। আপনি এটিকে স্কাইলএলচেমিতে এটি স্থাপন করেছেন ForeignKey(চাইল্ড টেবিল সংজ্ঞার অংশ):
parent_id = db.Column(db.Integer, db.ForeignKey('parent.id', ondelete='CASCADE'))
parent = db.relationship('Parent', backref=backref('children', passive_deletes=True))
ondelete='CASCADE'অংশ সৃষ্টি করে ON DELETE CASCADEটেবিলের উপর।
Gotcha!
এখানে একটি গুরুত্বপূর্ণ ক্যাভিয়েট আছে। লক্ষ্য করুন আমি কীভাবে relationshipনির্দিষ্ট করে রেখেছি passive_deletes=True? আপনার যদি তা না থাকে তবে পুরো জিনিসটি কার্যকর হবে না। এটি কারণ হ'ল ডিফল্টরূপে আপনি যখন পিতামাতার রেকর্ডটি মুছবেন তখন স্কেলএলচেমি সত্যিই অদ্ভুত কিছু করে। এটি সমস্ত সন্তানের সারিগুলির বিদেশী কীগুলি সেট করে NULL। তাই আপনি যদি আপনার কাছ থেকে একটি সারি মুছে ফেলতে parent_tableযেখানে id= 5, তাহলে এটি মূলত চালানো হবে
UPDATE child_table SET parent_id = NULL WHERE parent_id = 5
কেন আপনি এটি চান আমার কোন ধারণা নেই। আমি অবাক হব যদি অনেক ডাটাবেস ইঞ্জিন আপনাকে NULLএতিম তৈরির জন্য একটি বৈধ বিদেশী কী সেট করার অনুমতি দেয় । একটি খারাপ ধারণা বলে মনে হচ্ছে, তবে সম্ভবত ব্যবহারের কেস রয়েছে। যাইহোক, আপনি যদি এসকিএলএলকেমিকে ON DELETE CASCADEএটি করতে দেন , আপনি সেটআপ করা ব্যবহার করে ডাটাবেসগুলি বাচ্চাদের পরিষ্কার করতে সক্ষম হবেন না । এটি হ'ল এটি কোন বিদেশী কীগুলি মুছতে হবে তা জানার জন্য বিদেশী কীগুলিতে নির্ভর করে। স্কেলএলচেমি সব একবারে সেট করে নিলে NULLডাটাবেস সেগুলি মুছতে পারে না। সেট passive_deletes=Trueকরা থেকে আটকায় SqlAlchemy NULLবিদেশী কি খুঁজে ing।
আপনি স্ক্যালএলচেমি ডক্সে প্যাসিভ মোছার বিষয়ে আরও পড়তে পারেন ।
বিকল্প 2
অন্য যেভাবে আপনি এটি করতে পারেন তা হল স্ক্ল্যএলচেমিকে এটি আপনার জন্য করতে দেওয়া। এটি cascadeআর্গুমেন্ট ব্যবহার করে সেট আপ করা হয়েছে relationship। আপনার যদি পিতামাতার টেবিলে সম্পর্কটি সংজ্ঞায়িত করা হয় তবে এটি এমন দেখাচ্ছে:
children = relationship('Child', cascade='all,delete', backref='parent')
যদি সন্তানের উপর সম্পর্ক থাকে তবে আপনি এটি এরকম করুন:
parent = relationship('Parent', backref=backref('children', cascade='all,delete'))
আবার এটি বাচ্চা তাই আপনাকে একটি পদ্ধতি কল করতে হবে backrefএবং সেখানে ক্যাসকেড ডেটা স্থাপন করতে হবে।
এটি স্থানে রেখে আপনি যখন প্যারেন্ট সারিটি মুছবেন, স্কেলএলচেমি আপনার পক্ষে শিশু সারিগুলি পরিষ্কার করার জন্য মুছুন বিবৃতিগুলি চালাবে। আপনার পক্ষে যদি আমি এটি প্রস্তাব না করি তবে সম্ভবত এটি এই ডাটাবেসটিকে হ্যান্ডেল দেওয়ার মতো দক্ষ হবে না not
এটি যে ক্যাসকেডিং বৈশিষ্ট্যগুলি সমর্থন করে তার উপর স্কেলএলকেমি ডক্স এখানে রয়েছে ।