আমি যতদূর জানি, বাল্ক সন্নিবেশ জারি করার জন্য ওআরএম পাওয়ার কোনও উপায় নেই। আমি বিশ্বাস করি যে এর অন্তর্নিহিত কারণটি হচ্ছে এসকিউএলএলচেমিকে প্রতিটি বস্তুর পরিচয় (যেমন, নতুন প্রাথমিক কী) ট্র্যাক করা দরকার এবং বাল্ক সন্নিবেশগুলি এতে হস্তক্ষেপ করে। উদাহরণস্বরূপ, ধরে নেওয়া আপনার foo
টেবিলে একটি id
কলাম রয়েছে এবং এটি একটি Foo
শ্রেণিতে ম্যাপ করা হয়েছে :
x = Foo(bar=1)
print x.id
# None
session.add(x)
session.flush()
# BEGIN
# INSERT INTO foo (bar) VALUES(1)
# COMMIT
print x.id
# 1
যেহেতু এসকিউএলএলচেমি x.id
অন্য কোনও জিজ্ঞাসা জারি না করে এর জন্য মানটি তুলেছে , তাই আমরা অনুমান করতে পারি যে এটি সরাসরি INSERT
বিবৃতি থেকে পেয়েছে । যদি আপনার একই উদাহরণগুলির মাধ্যমে তৈরি অবজেক্টগুলিতে পরবর্তী অ্যাক্সেসের প্রয়োজন না হয় তবে আপনি নিজের প্রবেশের জন্য ওআরএম স্তরটি এড়িয়ে যেতে পারেন:
Foo.__table__.insert().execute([{'bar': 1}, {'bar': 2}, {'bar': 3}])
# INSERT INTO foo (bar) VALUES ((1,), (2,), (3,))
এসকিউএলএলচেমি যে কোনও বিদ্যমান বস্তুর সাথে এই নতুন সারিগুলি মেলে না, তাই পরবর্তী কোনও ক্রিয়াকলাপের জন্য আপনাকে তাদের নতুন করে জিজ্ঞাসা করতে হবে।
যতক্ষণ না বাসি ডেটা সম্পর্কিত, এটি মনে রাখা সহায়ক যে সেশনটির বাইরে ডাটাবেস কখন পরিবর্তন করা হয় তা সেশনের কোনও অন্তর্নিহিত উপায় নেই। বিদ্যমান দৃষ্টান্তগুলির মাধ্যমে বাহ্যিকভাবে পরিবর্তিত ডেটা অ্যাক্সেস করার জন্য, দৃষ্টান্তগুলি অবশ্যই মেয়াদোত্তীর্ণ হিসাবে চিহ্নিত করতে হবে । এটি ডিফল্টরূপে ঘটে session.commit()
, তবে কল করে session.expire_all()
বা দ্বারা নিজেই করা যেতে পারে session.expire(instance)
। একটি উদাহরণ (এসকিউএল বাদ দেওয়া):
x = Foo(bar=1)
session.add(x)
session.commit()
print x.bar
# 1
foo.update().execute(bar=42)
print x.bar
# 1
session.expire(x)
print x.bar
# 42
session.commit()
মেয়াদ শেষ হয়ে যায় x
, তাই প্রথম মুদ্রণ বিবৃতি সুস্পষ্টভাবে একটি নতুন লেনদেন এবং পুনরায় অনুসন্ধানের x
বৈশিষ্ট্যগুলি খোলে । যদি আপনি প্রথম মুদ্রণ বিবৃতিটি মন্তব্য করেন তবে আপনি লক্ষ্য করবেন যে দ্বিতীয়টি এখন সঠিক মানটি তুলবে, কারণ আপডেটের পরে নতুন ক্যোয়ারী নির্গত হয় না।
এটি লেনদেনের বিচ্ছিন্নতার দৃষ্টিকোণ থেকে বোঝা যায় - আপনার কেবল লেনদেনের মধ্যে বাহ্যিক পরিবর্তনগুলি বেছে নেওয়া উচিত। যদি এটি আপনার সমস্যার কারণ হয়ে থাকে তবে আমি আপনার অ্যাপ্লিকেশনটির লেনদেনের সীমানাটি তাত্ক্ষণিকভাবে পৌঁছানোর পরিবর্তে স্পষ্ট করার বা পুনরায় চিন্তা করার পরামর্শ দিচ্ছি session.expire_all()
।