কমিট করতে পারলে ফ্লাশ কেন?
ডেটাবেস এবং স্কেলচেমির সাথে কাজ করার ক্ষেত্রে নতুন হিসাবে, পূর্ববর্তী উত্তরগুলি - যা flush()
ডিবিতে এসকিউএল বিবৃতি প্রেরণ করে এবংcommit()
রাখে - আমার কাছে পরিষ্কার ছিল না। সংজ্ঞাগুলি অর্থবোধ করে তবে আপনি কেবল প্রতিশ্রুতি না দেওয়ার পরিবর্তে কেন ফ্লাশ ব্যবহার করবেন তা সংজ্ঞাগুলি থেকে অবিলম্বে পরিষ্কার হয় না।
যেহেতু একটি প্রতিশ্রুতি সর্বদা ফ্লাশ হয় ( https://docs.sqlalchemy.org/en/13/orm/session_basics.html# কমিটিং ) এই শব্দগুলি সত্যই অনুরূপ। আমি মনে করি যে হাইলাইট করার জন্য বড় সমস্যাটি হ'ল ফ্লাশ স্থায়ী নয় এবং পূর্বাবস্থায় ফেরা যায়, যদিও একটি প্রতিশ্রুতি স্থায়ী হয়, এই অর্থে যে আপনি ডেটাবেসকে শেষ প্রতিশ্রুতিটি পূর্বাবস্থায় রাখতে বলতে পারবেন না (আমি মনে করি)
@ স্নাপশো হাইলাইট করেছে যে আপনি যদি ডাটাবেসটিকে জিজ্ঞাসা করতে চান এবং সদ্য যুক্ত হওয়া বস্তুগুলিকে অন্তর্ভুক্ত করে এমন ফলাফল পেতে চান তবে আপনাকে প্রথমে ফ্লাশ করা দরকার (বা প্রতিশ্রুতিবদ্ধ যা আপনার জন্য প্রবাহিত হবে)। সম্ভবত এটি কিছু লোকের পক্ষে দরকারী যদিও আমি নিশ্চিত নই যে আপনি প্রতিশ্রুতি দেওয়ার চেয়ে কেন ঝাপিয়ে পড়তে চান (তুচ্ছ উত্তর ছাড়া এটি এটিকে পূর্বাবস্থায় ফেলা যায়)।
অন্য একটি উদাহরণে আমি একটি স্থানীয় ডিবি এবং একটি রিমোট সার্ভারের মধ্যে দস্তাবেজগুলি সিঙ্ক করছি এবং ব্যবহারকারী যদি বাতিল করার সিদ্ধান্ত নেন তবে সমস্ত সংযোজন / আপডেট / মুছে ফেলা উচিত (অর্থাত্ কোনও আংশিক সিঙ্ক নয়, কেবল একটি সম্পূর্ণ সিঙ্ক)। একটি একক দস্তাবেজ আপডেট করার সময় আমি কেবল পুরানো সারিটি মুছে ফেলার এবং দূরবর্তী সার্ভার থেকে আপডেট সংস্করণ যুক্ত করার সিদ্ধান্ত নিয়েছি। দেখা যাচ্ছে যে স্ক্ল্যাচলেমি লিখিতভাবে লেখার কারণে, প্রতিশ্রুতিবদ্ধ হওয়ার পরে অপারেশন করার গ্যারান্টি নেই। এর ফলে একটি সদৃশ সংস্করণ যুক্ত হয়েছিল (পুরানোটি মুছতে চেষ্টা করার আগে), যার ফলস্বরূপ ডিবি একটি অনন্য সীমাবদ্ধতা ব্যর্থ করেছিল। এটিকে ঘুরে দেখার জন্য আমি ব্যবহার flush()
করেছি যাতে অর্ডারটি বজায় থাকে তবে পরে সিঙ্ক প্রক্রিয়াটি ব্যর্থ হলে আমি এখনও পূর্বাবস্থায় ফিরতে পারি।
এটিতে আমার পোস্টটি এখানে দেখুন: স্কেলচেমিতে প্রতিশ্রুতিবদ্ধ করার সময় মুছে ফেলা বনাম কোনও আদেশ রয়েছে কি?
একইভাবে, কেউ জানেন কিনা অ্যাড অর্ডার রক্ষা করা হয় যখন সংগঠনের অর্থাৎ যদি আমি যোগ চেয়েছিলেন object1
তারপর যোগ object2
, নেই object1
সামনে ডাটাবেসের সাথে যুক্ত হয়ে object2
অর্ডার সংরক্ষণ করেন SQLAlchemy যখন সেশনের বস্তু যোগ করার পদ্ধতি?
আবার, এখানে সম্ভবত সম্ভবত ফ্লাশ () ব্যবহার করা পছন্দসই আচরণটি নিশ্চিত করবে। সুতরাং সংক্ষিপ্তসার হিসাবে, ফ্লাশের জন্য একটি ব্যবহার হ'ল অর্ডার গ্যারান্টি সরবরাহ করা (আমার মনে হয়) আবার নিজেকে নিজেকে এমন একটি "পূর্বাবস্থায়িত করুন" বিকল্প দেয় যা প্রতিশ্রুতি দেয় না।
অটোফ্ল্যাশ এবং স্বতঃসংশোধন
দ্রষ্টব্য, অটোফ্ল্যাশ একটি আপডেট করা ডাটাবেসে ক্যোয়ারী অ্যাক্ট নিশ্চিত করার জন্য ব্যবহার করা যেতে পারে কারণ কোয়েরিটি কার্যকর করার আগে স্ক্লাচেমি ফ্লাশ হবে। https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params.autoflush
অটোকোমিট এমন অন্য কিছু যা আমি পুরোপুরি বুঝতে পারি না তবে এটির ব্যবহারটি নিরুৎসাহিত করা বলে মনে হচ্ছে:
https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params। autocommit
স্মৃতি এর ব্যবহার
এখন আসল প্রশ্নটি আসলে স্মরণার্থের উদ্দেশ্যে প্রতিশ্রুতিবদ্ধ বনাম প্রতিশ্রুতির প্রভাব সম্পর্কে জানতে চেয়েছিল। যেমন অবিচল থাকার বা না রাখার ক্ষমতা ডাটাবেস অফার করে এমন কিছু (আমার মনে হয়), কেবলমাত্র ফ্লাশিং ডাটাবেসে অফলোড করার জন্য যথেষ্ট পরিমাণে হওয়া উচিত - যদিও প্রতিশ্রুতিতে আঘাত করা উচিত নয় (আসলে সম্ভবত সহায়তা করে - নীচে দেখুন) যদি আপনি পূর্বাবস্থায় ফিরে না যান তবে ।
স্ক্ল্যাচেমি ফ্ল্যাশ করা জিনিসগুলির জন্য দুর্বল রেফারেন্সিং ব্যবহার করে: https://docs.sqlalchemy.org/en/13/orm/session_state_management.html#session-references
এর অর্থ যদি আপনার কাছে কোনও তালিকা স্পষ্টভাবে অন্য কোথাও না ধরে থাকে, যেমন একটি তালিকা বা ডিকের মতো, স্ক্ল্যাচেমি এটিকে স্মরণে রাখবে না।
তবে, আপনার তখন চিন্তার মতো বিষয়গুলির ডাটাবেসের দিক রয়েছে। সম্ভবত প্রতিশ্রুতি না দিয়ে ফ্লাশিং লেনদেন বজায় রাখতে কিছু মেমরি জরিমানা নিয়ে আসে। আবার, আমি এটিতে নতুন তবে এখানে একটি লিঙ্ক যা ঠিক এটি প্রস্তাবিত বলে মনে হচ্ছে: https://stackoverflow.com/a/15305650/764365
অন্য কথায়, কমিটগুলির মেমোরির ব্যবহার হ্রাস করা উচিত, যদিও সম্ভবত এখানে মেমরি এবং কর্মক্ষমতাগুলির মধ্যে একটি বাণিজ্য বন্ধ রয়েছে। অন্য কথায়, আপনি সম্ভবত প্রতি একক ডাটাবেস পরিবর্তনের প্রতিশ্রুতি রাখতে চান না, একবারে একটি (পারফরম্যান্সের কারণে), তবে খুব বেশি সময় অপেক্ষা করা মেমরির ব্যবহারকে বাড়িয়ে তুলবে।