উত্তর:
filter_by
নিয়মিত কাওয়ার্গস ব্যবহার করে কলামের নামগুলিতে সাধারণ প্রশ্নের জন্য ব্যবহার করা হয়
db.users.filter_by(name='Joe')
একই সহযোগে এটি করা যাবে filter
, kwargs ব্যবহার করছেন না, কিন্তু এর পরিবর্তে '==' সমতা অপারেটর, যা db.users.name বস্তুর উপর ওভারলোড হয়েছে ব্যবহার করছে:
db.users.filter(db.users.name=='Joe')
আপনি আরও শক্তিশালী কোয়েরি ব্যবহার করে filter
যেমন লিখতে পারেন যেমন:
db.users.filter(or_(db.users.name=='Ryan', db.users.country=='England'))
type(model.column_name == 'asdf')
→sqlalchemy.sql.elements.BinaryExpression
.filter
। মত একটি ক্যোয়ারী id=12345
, query(users).filter(id == id)
ফিল্টার করা হবে না users.id
। পরিবর্তে, এটা মূল্যায়ন করবে id == id
যেমন True
এবং সমস্ত ব্যবহারকারী ফিরে যান। আপনাকে ব্যবহার করতে হবে .filter(users.id == id)
(উপরে ডেমোড করা হিসাবে)। আমি আজ আগে এই ভুল করেছি।
আমরা আসলে এগুলি একত্রে মূলত একত্রিত করেছিলাম, অর্থাত্ একটি "ফিল্টার" -র মতো পদ্ধতি ছিল যা স্বীকৃত হয়েছিল *args
এবং **kwargs
যেখানে আপনি কোনও এসকিউএল এক্সপ্রেশন বা কীওয়ার্ড আর্গুমেন্ট (বা উভয়) পাস করতে পারেন। আমি আসলে এটি দেখতে পেয়েছি যে আরও অনেক সুবিধাজনক, তবে লোকেরা সর্বদা এটির দ্বারা বিভ্রান্ত হয়ে পড়েছিল, যেহেতু তারা সাধারণত এখনও column == expression
এবং এর মধ্যে পার্থক্যটি কাটিয়ে চলেছে keyword = expression
। সুতরাং আমরা তাদের বিভক্ত।
column == expression
বনাম সম্পর্কে আপনার বক্তব্যটি এবং এর keyword = expression
মধ্যে পার্থক্য সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট । ধন্যবাদ! filter
filter_by
filter_by
চেয়ে কিছুটা দ্রুত হতে পারে filter
।
filter_by
বিষয়টি হ'ল ক্ষেত্রের নামটি লিখতে সক্ষম হও সেই শ্রেণীর জন্য, কোনও প্রশ্ন জিজ্ঞাসা করা হয়নি - যখন flter
সত্যিকারের কলামের বস্তুর প্রয়োজন হয় - যার জন্য সাধারণত একটি অপ্রয়োজনীয় শ্রেণীর নাম টাইপ করতে (এবং পড়তে) প্রয়োজন হবে will সুতরাং, কেউ যদি সাম্যের দ্বারা ফিল্টার করতে চান তবে এটি বরং সুবিধাজনক।
filter_by
কীওয়ার্ড আর্গুমেন্ট ব্যবহার করে, যেখানে filter
পাইথোনিক ফিল্টারিংয়ের পক্ষে যুক্তিগুলি পছন্দ করেfilter(User.name=="john")
এটি দ্রুত ক্যোয়ারী লেখার জন্য একটি সিনট্যাক্স চিনি। সিউডোকোডে এর বাস্তবায়ন:
def filter_by(self, **kwargs):
return self.filter(sql.and_(**kwargs))
এবং এর জন্য আপনি কেবল লিখতে পারেন:
session.query(db.users).filter_by(name='Joe', surname='Dodson')
BTW
session.query(db.users).filter(or_(db.users.name=='Ryan', db.users.country=='England'))
হিসাবে লেখা যেতে পারে
session.query(db.users).filter((db.users.name=='Ryan') | (db.users.country=='England'))
এছাড়াও আপনি get
পদ্ধতির মাধ্যমে পিকে সরাসরি অবজেক্ট পেতে পারেন :
Users.query.get(123)
# And even by a composite PK
Users.query.get(123, 321)
get
কেস ব্যবহার করার সময় এটির গুরুত্বপূর্ণ বিষয়টিকে ডাটাবেস অনুরোধ ছাড়াই প্রত্যাবর্তন করা identity map
যেতে পারে যা থেকে ক্যাশে হিসাবে ব্যবহার করা যেতে পারে (লেনদেনের সাথে যুক্ত)
users.filter
পূর্ববর্তী উত্তর থেকে পুনরুত্পাদন । এবং এটি আমার দোষ হতে পারে :) query
বৈশিষ্ট্যটি ক্যোয়ারি_প্রোপার্টি এবং এটি আজকাল এর বেশ মানসম্পন্ন চিনি
db.users.name=='Ryan'
একটি ধ্রুবক একবার মূল্যায়ন এবং তারপর তারপর থেকে অর্থহীন হবে? দেখে মনে হচ্ছে এটির কাজ করার জন্য একটি ল্যাম্বডা ব্যবহার করা দরকার।