উত্তর:
আপনার নমুনা কোডটি যেমন কাজ করা উচিত ছিল তেমন। এসকিউএলএলকেমি এটির একটি স্বয়ং-জেনারেটিং f.idপ্রাথমিক কী কলামটি ধরে ধরে একটি মান প্রদান করা উচিত । প্রাথমিক-কী বৈশিষ্ট্যগুলি flush()উত্পন্ন হওয়ার সাথে সাথেই প্রক্রিয়াটির মধ্যে অবিলম্বে পপুলেট হয় এবং কোনও কল করার commit()প্রয়োজন হয় না। সুতরাং এখানে উত্তর নীচের এক বা একাধিক মধ্যে থাকে:
আমি ঠিক একই সমস্যাটি চালিয়েছি এবং পরীক্ষার পরে আমি দেখতে পেয়েছি যে এই উত্তরগুলির মধ্যে কোনওটিই যথেষ্ট নয়।
বর্তমানে, বা স্কেলচেমি হিসাবে 6++ এর একটি খুব সহজ সমাধান রয়েছে (এটি আমি পূর্ববর্তী সংস্করণে উপস্থিত কিনা তা আমি জানি না, যদিও আমি এটি কল্পনা করি):
session.refresh ()
সুতরাং, আপনার কোডটি এর মতো দেখতে লাগবে:
f = Foo(bar=x)
session.add(f)
session.flush()
# At this point, the object f has been pushed to the DB,
# and has been automatically assigned a unique primary key id
f.id
# is None
session.refresh(f)
# refresh updates given object in the session with its state in the DB
# (and can also only refresh certain attributes - search for documentation)
f.id
# is the automatically assigned primary key ID given in the database.
এটি কিভাবে করা যায়।
sessionmaker(autoflush=True), সেই কম্বো ডাব্লু / রিফ্রেশ () আমাকে সারি আইডি সরবরাহ করেছিল। #grrr
flush()এবং commit(): এখানে একটি ভাল ব্যাখ্যা stackoverflow.com/a/4202016/1252290
flush()ব্যবহারের পরিবর্তে commit()এবং তার ঠিক পরে - এটিকে রিফ্রেশ করুন session.refresh(f), আমার জন্য কাজ করে এবং আমি এসকিউএএইচএলএলকেমি সংস্করণ ব্যবহার করি0.6.7
সবার জন্য ধন্যবাদ। আমি কলাম ম্যাপিংটি সংশোধন করে আমার সমস্যার সমাধান করেছি। আমার জন্য, autoincrement=Trueপ্রয়োজন।
উত্স:
id = Column('ID', Integer, primary_key=True, nullable=False)
পরিবর্তিত পরে:
id = Column('ID', Integer, primary_key=True, autoincrement=True, nullable=True)
তারপর
session.flush()
print(f.id)
ঠিক আছে!
dpb দ্বারা প্রদত্ত উত্তরের মত নয়, একটি রিফ্রেশ প্রয়োজনীয় নয়। একবার আপনি ফ্লাশ করার পরে, আপনি আইডি ক্ষেত্রটি অ্যাক্সেস করতে পারবেন, স্কেলচেমি স্বয়ংক্রিয়ভাবে আইডিটি রিফ্রেশ করে যা ব্যাকএন্ডে স্বয়ংক্রিয়ভাবে উত্পন্ন হয়
আমি এই সমস্যার মুখোমুখি হয়েছি এবং কিছু তদন্তের পরে সঠিক কারণটি অনুধাবন করেছি, আমার মডেলটি আইডি দিয়ে ইন্টিজারফিল্ড হিসাবে তৈরি করা হয়েছিল এবং আমার ফর্মটিতে আইডিটি গোপনক্ষেত্রের সাথে উপস্থাপন করা হয়েছিল (যেহেতু আমি আমার ফর্মটিতে আইডিটি দেখাতে চাইনি)। লুকানো ক্ষেত্রটি ডিফল্টরূপে একটি পাঠ্য হিসাবে উপস্থাপিত হয়। আমি একবার উইজেট = লুকিয়ে থাকা ইনপুট () এর সাহায্যে ফর্মটি ইন্টিজারফিল্ডে পরিবর্তন করেছি সমস্যার সমাধান হয়ে গেছে।
এর session.save_or_update(f)পরিবর্তে আপনার ব্যবহার করার চেষ্টা করা উচিত session.add(f)।
save_or_update০.০ বা তার পর থেকে অবহেলা করা হয়েছে। session.add()এটা করা উচিত।
echo=Trueএবং ফ্লাশ-টাইমে এসকিউএল কার্যকর করা হয় তা দেখুন? আপনি যে বর্ণনা করেছেন তাতে কাজ করা উচিত এবং আপনাকে আইডি দেওয়া উচিত, তবে এটির অন্য কোনও সমস্যা হতে পারে যার ফলস্বরূপ f.id কিছুই হয় না।