এসকিউএলএলকেমি: ক্যাসকেড মোছা


116

এসকিউএএলএলচেমির ক্যাসকেড বিকল্পগুলির সাথে আমার অবশ্যই তুচ্ছ কিছু অনুপস্থিত হবে কারণ সঠিকভাবে পরিচালনার জন্য আমি একটি সাধারণ ক্যাসকেড মুছতে পারি না - যদি কোনও পিতামণ্ডল উপাদান মুছে ফেলা হয় তবে বাচ্চারা nullবিদেশী কীগুলি সহ অবিচল থাকে ।

আমি এখানে একটি সংক্ষিপ্ত পরীক্ষার মামলা রেখেছি:

from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Parent(Base):
    __tablename__ = "parent"
    id = Column(Integer, primary_key = True)

class Child(Base):
    __tablename__ = "child"
    id = Column(Integer, primary_key = True)
    parentid = Column(Integer, ForeignKey(Parent.id))
    parent = relationship(Parent, cascade = "all,delete", backref = "children")

engine = create_engine("sqlite:///:memory:")
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)

session = Session()

parent = Parent()
parent.children.append(Child())
parent.children.append(Child())
parent.children.append(Child())

session.add(parent)
session.commit()

print "Before delete, children = {0}".format(session.query(Child).count())
print "Before delete, parent = {0}".format(session.query(Parent).count())

session.delete(parent)
session.commit()

print "After delete, children = {0}".format(session.query(Child).count())
print "After delete parent = {0}".format(session.query(Parent).count())

session.close()

আউটপুট:

Before delete, children = 3
Before delete, parent = 1
After delete, children = 3
After delete parent = 0

পিতা-মাতার এবং সন্তানের মধ্যে একটি সাধারণ, একের সাথে অনেকের মধ্যে সম্পর্ক রয়েছে। স্ক্রিপ্টটি পিতামাতাকে তৈরি করে, 3 টি শিশু যুক্ত করে, তারপরে কমিট করে। এর পরে, এটি পিতামাতাকে মুছে ফেলে তবে বাচ্চারা অবিচল থাকে। কেন? আমি কীভাবে বাচ্চাদের ক্যাসকেড মুছতে পারি?


দস্তাবেজে এই বিভাগে (অন্তত এখন, 3 বছর পরে আসল পোস্ট পরে) উপর এই বেশ সহায়ক বলে মনে হয়: docs.sqlalchemy.org/en/rel_0_9/orm/session.html#cascades
Soferio

উত্তর:


183

সমস্যাটি হচ্ছে স্ক্ল্যাচমিটি Childপিতামাতাকে বিবেচনা করে, কারণ এটিই আপনি নিজের সম্পর্কের সংজ্ঞা দিয়েছেন (এটি অবশ্যই বিবেচনা করে না যে আপনি এটি অবশ্যই "শিশু" বলেছিলেন)।

পরিবর্তে যদি আপনি Parentক্লাসে সম্পর্কটিকে সংজ্ঞায়িত করেন তবে এটি কার্যকর হবে:

children = relationship("Child", cascade="all,delete", backref="parent")

( "Child"একটি স্ট্রিং হিসাবে নোট করুন : ঘোষণামূলক শৈলী ব্যবহার করার সময় এটি অনুমোদিত হয়, যাতে আপনি এমন কোনও শ্রেণীর উল্লেখ করতে সক্ষম হন যা এখনও সংজ্ঞায়িত হয়নি)

আপনি এগুলিও যুক্ত করতে চাইতে পারেন delete-orphan( deleteপিতামাতার মুছে ফেলা হলে বাচ্চাদের মুছে ফেলা হতে পারে, পিতামাতাকে মুছে delete-orphanফেলা না থাকলেও পিতামাতার থেকে "মুছে ফেলা" এমন কোনও শিশুকেও মুছে ফেলবে)

সম্পাদনা: সবেমাত্র পাওয়া গেছে: আপনি যদি ক্লাসের সাথে সম্পর্কটি সত্যই সংজ্ঞায়িত করতে চান তবে আপনি এটি Childকরতে পারেন, তবে আপনাকে ব্যাকেরেফে (স্পষ্টভাবে ব্যাকরেফ তৈরি করে) ক্যাসকেডটি সংজ্ঞায়িত করতে হবে :

parent = relationship(Parent, backref=backref("children", cascade="all,delete"))

(বোঝানো from sqlalchemy.orm import backref)


6
আহা, এই। আমি চাই ডকুমেন্টেশন এই সম্পর্কে আরও স্পষ্ট হয়!
কার্ল

15
আয়ে। খুব উপকারী. এসকিউএএলএলচেমির ডকুমেন্টেশন নিয়ে আমার সবসময় সমস্যা ছিল।
আয়াজ

1
এই ভাল বর্তমান দস্তাবেজে অন্তর্ভুক্ত ব্যাখ্যা করা হয় docs.sqlalchemy.org/en/rel_0_9/orm/cascades.html
Epoc

1
@ লাইমান জেরগা: ওপি'র উদাহরণে: আপনি যদি কোনও Childবস্তুটি সরিয়ে ফেলেন parent.children, তবে সেই বস্তুটি ডাটাবেস থেকে মুছে ফেলা উচিত, বা কেবল পিতামাতার রেফারেন্সটি সরিয়ে দেওয়া উচিত (যেমন parentid, সারিটি মোছার পরিবর্তে কলামটি নালায় সেট করুন )
স্টিভেন

1
অপেক্ষা করুন, relationshipপিতামাতা-সন্তানের সেটআপ হুকুম দেয় না। ForeignKeyএকটি টেবিলে ব্যবহার করা যা এটি সন্তানের হিসাবে সেট করে। এটি relationshipবাবা-মা বা সন্তানের উপর রয়েছে কিনা তা বিবেচ্য নয় ।
d512

110

@ আপনি যখন মুছে ফেলছেন তখন স্টিভেনের অ্যাঞ্জার ভাল হয় session.delete()যা আমার ক্ষেত্রে কখনই ঘটে না। আমি লক্ষ্য করেছি যে বেশিরভাগ সময় আমি মুছে ফেলি session.query().filter().delete()(যা মেমরিতে উপাদান রাখে না এবং সরাসরি ডিবি থেকে মুছে দেয়)। এই পদ্ধতিটি স্কেলচেমির ব্যবহার cascade='all, delete'করে কাজ করে না। যদিও এর একটি সমাধান রয়েছে: ON DELETE CASCADEডিবিয়ের মাধ্যমে (নোট: সমস্ত ডাটাবেস এটি সমর্থন করে না)।

class Child(Base):
    __tablename__ = "children"

    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey("parents.id", ondelete='CASCADE'))

class Parent(Base):
    __tablename__ = "parents"

    id = Column(Integer, primary_key=True)
    child = relationship(Child, backref="parent", passive_deletes=True)

3
এই পার্থক্যটি ব্যাখ্যা করার জন্য ধন্যবাদ - আমি চেষ্টা করার চেষ্টা করছিলাম session.query().filter().delete()এবং সমস্যাটি
সন্ধানের

4
আমাকে passive_deletes='all'পিতামাতাকে মুছে ফেলা হলে ডাটাবেস ক্যাসকেড দ্বারা বাচ্চাদের মুছে ফেলার জন্য আমাকে সেট করতে হয়েছিল। এর সাথে passive_deletes=True, পিতামাতার মোছার আগে বাচ্চাদের জিনিসগুলি বিচ্ছিন্ন করা হয়েছিল (পিতামাতারা NUL এ সেট করেছেন), সুতরাং ডাটাবেস ক্যাসকেড কিছুই করছে না।
মিলোরাদ পপ-টসিক

@ মিলোরাডপপ-ট্যাসিক আমি 3 বছরেরও বেশি সময় ধরে এসকিউএএলএলকেমি ব্যবহার করি নি তবে ডকটি পড়া প্যাসিভ_ডিলেটগুলির মতো দেখাচ্ছে = সত্য এখনও সঠিক জিনিস।
অ্যালেক্স Okrushko

2
আমি নিশ্চিত করতে পারি যে passive_deletes=Trueএই পরিস্থিতিতে সঠিকভাবে কাজ করে।
d512

মুছে ফেলাতে ক্যাসকেড অন্তর্ভুক্ত করে অ্যাল্যাম্বিক অটো উত্পাদিত সংশোধনগুলি নিয়ে আমার সমস্যা হয়েছিল - এটি উত্তর ছিল।
জেএনডাব্লু

105

খুব পুরানো পোস্ট, তবে আমি এটিতে কেবল এক বা দু' ঘন্টা সময় ব্যয় করেছি, তাই আমি আমার অনুসন্ধানটি ভাগ করে নিতে চেয়েছিলাম, বিশেষত যেহেতু তালিকাভুক্ত অন্যান্য মন্তব্যগুলির মধ্যে কিছু সঠিক নয়।

টি এল; ডিআর

সন্তানের টেবিলটিকে একটি বিদেশী দিন বা বিদ্যমান একটিকে সংশোধন করুন 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

এটি যে ক্যাসকেডিং বৈশিষ্ট্যগুলি সমর্থন করে তার উপর স্কেলএলকেমি ডক্স এখানে রয়েছে ।


ব্যাখ্যার জন্য ধন্যবাদ। এটা এখন জ্ঞান করে তোলে।
ওডিন

1
Columnচাইল্ড টেবিলে একটি ঘোষণাকে ForeignKey('parent.id', ondelete='cascade', onupdate='cascade')কাজ করে না কেন ? আমি বাচ্চাদের পিতামাতার সারণী সারিটিও মুছে ফেলা হবে বলে আশা করেছি expected পরিবর্তে, এসকিউএলএ হয় বাচ্চাদের একটিতে সেট করে parent.id=NULLবা তাদের "যেমন আছে" তে রেখে দেয়, তবে কোনও মুছা হয় না। যে মূলত সংজ্ঞায়িত পর relationshipযেমন পিতা বা মাতা মধ্যে children = relationship('Parent', backref='parent')বা relationship('Parent', backref=backref('parent', passive_deletes=True)); ডিবি cascadeডিডিএলে বিধিগুলি দেখায় (এসকিউএলাইট 3-ভিত্তিক প্রুফ-অফ-কনসেপ্ট)। থটস?
কোড_ড্রেড

1
এছাড়াও, আমার নোট করা উচিত যে আমি যখন ব্যবহার backref=backref('parent', passive_deletes=True)করি তখন আমি নিম্নলিখিত সতর্কতা পাই: SAWarning: On Parent.children, 'passive_deletes' is normally configured on one-to-many, one-to-one, many-to-many relationships only. "relationships only." % selfপ্রস্তাবনা এটি কোনও কারণে passive_deletes=Trueএক-একাধিক পিতা-সন্তানের সম্পর্কের ক্ষেত্রে (স্পষ্ট) একাধিক পিতা-সন্তানের সম্পর্কের ব্যবহার পছন্দ করে না।
কোড_ড্রেড

দুর্দান্ত ব্যাখ্যা। একটি প্রশ্ন - deleteঅনর্থক হয় cascade='all,delete'?
zaggi

1
@zaggi deleteমধ্যে অপ্রয়োজনীয় cascade='all,delete'অনুযায়ী যেহেতু SQLAlchemy এর ডক্স , allজন্য একটি প্রতিশব্দ হল:save-update, merge, refresh-expire, expunge, delete
pmsoltani

7

স্টিভেন ঠিক বলেছেন যে আপনাকে স্পষ্টভাবে ব্যাকরিফ তৈরি করতে হবে, এর ফলে পিতামাতার উপর ক্যাসকেড প্রয়োগ করা হয় (পরীক্ষার দৃশ্যের মতো এটি সন্তানের ক্ষেত্রেও প্রয়োগ করা হয় তার বিপরীতে)।

তবে সন্তানের উপর সম্পর্কের সংজ্ঞা দেওয়া শিশুকে পিতামাতার বিবেচনা করে না। সম্পর্কের যেখানে সংজ্ঞা দেওয়া হয়েছে (শিশু বা পিতা বা মাতা), এটি বৈদেশিক কী যা দুটি টেবিলের সাথে লিঙ্ক করে তা নির্ধারণ করে যে কোনটি পিতামাতা এবং কোনটি শিশু।

যদিও এটি একটি সম্মেলনে আটকে থাকা অর্থপূর্ণ এবং স্টিভেনের প্রতিক্রিয়ার ভিত্তিতে আমি আমার সমস্ত সন্তানের সম্পর্ককে পিতামাতার উপর সংজ্ঞায়িত করছি।


6

আমি ডকুমেন্টেশনগুলির সাথেও লড়াই করেছিলাম, কিন্তু দেখেছি যে ডকাস্ট্রিংগুলি নিজে ম্যানুয়ালটির চেয়ে সহজ হয়ে থাকে। উদাহরণস্বরূপ, যদি আপনি sqlalchemy.orm থেকে সম্পর্ক আমদানি করেন এবং সহায়তা (সম্পর্ক) করেন, এটি আপনাকে ক্যাসকেডের জন্য নির্দিষ্ট করতে পারে এমন সমস্ত বিকল্প দেয়। বুলেট delete-orphanবলে:

যদি কোনও পিতামাতার সাথে সন্তানের ধরণের কোনও আইটেম সনাক্ত না করা হয় তবে এটি মোছার জন্য চিহ্নিত করুন।
নোট করুন যে এই বিকল্পটি সন্তানের শ্রেণির একটি মুলতুবি আইটেমটি পিতামাতাকে উপস্থিত না করে স্থির রাখতে বাধা দেয়।

আমি বুঝতে পারি যে আপনার পিতা-মাতার সম্পর্ককে সংজ্ঞায়িত করার জন্য ডকুমেন্টেশনটি আরও বেশি ছিল। তবে দেখে মনে হয়েছিল আপনার ক্যাসকেড বিকল্পগুলির সাথেও সমস্যা হতে পারে, কারণ এটি "all"অন্তর্ভুক্ত "delete""delete-orphan"একমাত্র বিকল্প এটি অন্তর্ভুক্ত করা হয় নি "all"


বস্তু ব্যবহার help(..)করে sqlalchemyঅনেক সাহায্য করে! ধন্যবাদ :-)))! পাইচার্ম প্রসঙ্গ ডকগুলিতে কিছুই দেখায় না এবং স্পষ্টতই এটি পরীক্ষা করতে ভুলে গেছে help। আপনাকে অনেক ধন্যবাদ!
দিমিত্রি_রোমানভ

5

স্টিভেনের উত্তরটি শক্ত। আমি একটি অতিরিক্ত জড়িত নির্দেশ করতে চাই।

ব্যবহার করে relationshipআপনি অ্যাপ লেয়ারকে (ফ্লাস্ক) রেফারেন্সিয়াল অখণ্ডতার জন্য দায়বদ্ধ করে তুলছেন। এর অর্থ হ'ল অন্যান্য প্রক্রিয়া যা ফ্লাস্কের মাধ্যমে ডেটাবেস অ্যাক্সেস করে না, যেমন একটি ডাটাবেস ইউটিলিটি বা সরাসরি ডাটাবেসে সংযুক্ত ব্যক্তি, সেগুলি সীমাবদ্ধতাগুলি অনুভব করতে পারে না এবং আপনার ডেটা এমনভাবে পরিবর্তন করতে পারে যা আপনি ডিজাইনে এত কঠোর পরিশ্রম করেছেন লজিকাল ডেটা মডেলটিকে ভেঙে দেয় ।

যখনই সম্ভব, ForeignKeyd512 এবং অ্যালেক্স দ্বারা বর্ণিত পদ্ধতির ব্যবহার করুন । ডিবি ইঞ্জিন সত্যিকার অর্থে বাধা প্রয়োগে (অপ্রয়োজনীয় উপায়ে) খুব ভাল, সুতরাং এটি ডেটা অখণ্ডতা বজায় রাখার জন্য সেরা কৌশল। ডেটাবেসগুলি হ্যান্ডেল করতে না পারলে কেবলমাত্র ডেটা অখণ্ডতা হ্যান্ডেল করার জন্য আপনাকে যখন কোনও অ্যাপের উপর নির্ভর করতে হবে তা হল, এসকিউএলাইটের সংস্করণগুলি যা বিদেশী কী সমর্থন করে না।

পিতা-সন্তানের অবজেক্ট সম্পর্ক নেভিগেট করার মতো অ্যাপ্লিকেশন আচরণ সক্ষম করার জন্য আপনাকে যদি সত্তাদের মধ্যে আরও যোগসূত্র তৈরি করার প্রয়োজন হয় তবে backrefএর সাথে মিলিয়ে ব্যবহার করুন ForeignKey


2

স্টিভানের উত্তর সঠিক। আপনি যদি এখনও ত্রুটি পেয়ে থাকেন। এর উপরে অন্যান্য সম্ভাব্য চেষ্টাগুলি হ'ল -

http://vincentaudebert.github.io/python/sql/2015/10/09/cascade-delete-sqlalchemy/

লিঙ্ক থেকে অনুলিপি-

আপনি যদি আপনার মডেলগুলিতে একটি ক্যাসকেড মোছা নির্দিষ্ট করে থাকেন তবে এমনকি যদি আপনি কোনও বিদেশী কী নির্ভরতা নিয়ে সমস্যায় পড়ে যান তবে দ্রুত পরামর্শ।

এসকিউএএলএলকেমি ব্যবহার করে, cascade='all, delete'আপনার পিতামাতার টেবিলে আপনার থাকা উচিত একটি ক্যাসকেড মোছা নির্দিষ্ট করতে । ঠিক আছে তবে তারপরে আপনি যখন এমন কিছু কার্যকর করেন:

session.query(models.yourmodule.YourParentTable).filter(conditions).delete()

এটি আসলে আপনার বাচ্চাদের টেবিলে ব্যবহৃত একটি বিদেশী কী সম্পর্কে ত্রুটি ঘটায়।

সমাধানটি আমি অবজেক্টটিকে জিজ্ঞাসা করতে এবং তারপরে এটি মুছতে ব্যবহার করেছি:

session = models.DBSession()
your_db_object = session.query(models.yourmodule.YourParentTable).filter(conditions).first()
if your_db_object is not None:
    session.delete(your_db_object)

এটির সাথে আপনার পিতামাতার রেকর্ড এবং এর সাথে যুক্ত সমস্ত শিশুদের মুছে ফেলা উচিত।


1
কলিং .first()প্রয়োজন? কোন ফিল্টার শর্তাবলী অবজেক্টগুলির একটি তালিকা ফিরিয়ে দেয় এবং সমস্ত কিছু মুছতে হবে? কলিং কি .first()কেবল প্রথম বস্তু পায় না ? @ প্রশান্ত
রাজু এস

2

অ্যালেক্স ওকরুশকো উত্তর প্রায় আমার জন্য সবচেয়ে ভাল কাজ করেছে। অনডিলিট = 'ক্যাসকেড' এবং প্যাসিভ_ডিলেটস = সত্য সম্মিলিত Used তবে স্ক্লাইটের জন্য এটি কাজ করার জন্য আমাকে অতিরিক্ত কিছু করতে হয়েছিল।

Base = declarative_base()
ROOM_TABLE = "roomdata"
FURNITURE_TABLE = "furnituredata"

class DBFurniture(Base):
    __tablename__ = FURNITURE_TABLE
    id = Column(Integer, primary_key=True)
    room_id = Column(Integer, ForeignKey('roomdata.id', ondelete='CASCADE'))


class DBRoom(Base):
    __tablename__ = ROOM_TABLE
    id = Column(Integer, primary_key=True)
    furniture = relationship("DBFurniture", backref="room", passive_deletes=True)

এটি স্ক্লাইটের জন্য কাজ করে তা নিশ্চিত করার জন্য এই কোডটি যুক্ত করার বিষয়টি নিশ্চিত করুন।

from sqlalchemy import event
from sqlalchemy.engine import Engine
from sqlite3 import Connection as SQLite3Connection

@event.listens_for(Engine, "connect")
def _set_sqlite_pragma(dbapi_connection, connection_record):
    if isinstance(dbapi_connection, SQLite3Connection):
        cursor = dbapi_connection.cursor()
        cursor.execute("PRAGMA foreign_keys=ON;")
        cursor.close()

এখান থেকে চুরি হয়েছে: এসকিউএলএলএকচেমি এক্সপ্রেশন ভাষা এবং এসকিউএলসাইটগুলি ক্যাসকেড মোছার বিষয়ে


0

টিএলডিআর: যদি উপরের সমাধানগুলি কাজ না করে তবে আপনার কলামে nullable = মিথ্যা যুক্ত করার চেষ্টা করুন।

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

আমি এখানে বর্ণিত প্রতিটি সমাধানের চেষ্টা করেছি, তবে আমার সন্তানের সারণিতে সারিগুলিতে প্যারেন্ট সারিটি মোছার পরে তাদের বিদেশী কীটি বাতিল হয়ে যেতে থাকে। আমি এখানে সমস্ত সমাধান চেষ্টা করেছিলাম কোনও লাভ হয়নি। তবে, ক্যাসকেডটি একবার কাজ করে আমি বিদেশী কী দিয়ে শিশু কলামটি বাতিল / মিথ্যাতে সেট করি।

সন্তানের টেবিলে আমি যুক্ত করেছি:

Column('parent_id', Integer(), ForeignKey('parent.id', ondelete="CASCADE"), nullable=False)
Child.parent = relationship("parent", backref=backref("children", passive_deletes=True)

এই সেটআপের সাথে, ক্যাসকেডটি প্রত্যাশা অনুযায়ী কাজ করেছিল।

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