এসকিউএএলএলচেমির ফিল্টার এবং ফিল্টার_বির মধ্যে পার্থক্য


304

কেউ কি এসকিউএলএলচেমির মধ্যে পার্থক্য filterএবং filter_byফাংশন ব্যাখ্যা করতে পারে? আমার কোনটি ব্যবহার করা উচিত?

উত্তর:


393

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'))


22
এই ফণা অধীন এই কাজ করে? করবে না db.users.name=='Ryan'একটি ধ্রুবক একবার মূল্যায়ন এবং তারপর তারপর থেকে অর্থহীন হবে? দেখে মনে হচ্ছে এটির কাজ করার জন্য একটি ল্যাম্বডা ব্যবহার করা দরকার।
হামিশ গ্রুবিজন

46
সাম্যতা অপারেটরটি ওভারলোড হয়ে গেছে
ড্যানিয়েল ভেলকভ

9
type(model.column_name == 'asdf')sqlalchemy.sql.elements.BinaryExpression
নিক টি

11
ব্যবহার করার সময় সতর্কতা অবলম্বন করুন .filter। মত একটি ক্যোয়ারী id=12345, query(users).filter(id == id)ফিল্টার করা হবে না users.id। পরিবর্তে, এটা মূল্যায়ন করবে id == idযেমন Trueএবং সমস্ত ব্যবহারকারী ফিরে যান। আপনাকে ব্যবহার করতে হবে .filter(users.id == id)(উপরে ডেমোড করা হিসাবে)। আমি আজ আগে এই ভুল করেছি।
নিকো সের্নেক

118

আমরা আসলে এগুলি একত্রে মূলত একত্রিত করেছিলাম, অর্থাত্ একটি "ফিল্টার" -র মতো পদ্ধতি ছিল যা স্বীকৃত হয়েছিল *argsএবং **kwargsযেখানে আপনি কোনও এসকিউএল এক্সপ্রেশন বা কীওয়ার্ড আর্গুমেন্ট (বা উভয়) পাস করতে পারেন। আমি আসলে এটি দেখতে পেয়েছি যে আরও অনেক সুবিধাজনক, তবে লোকেরা সর্বদা এটির দ্বারা বিভ্রান্ত হয়ে পড়েছিল, যেহেতু তারা সাধারণত এখনও column == expressionএবং এর মধ্যে পার্থক্যটি কাটিয়ে চলেছে keyword = expression। সুতরাং আমরা তাদের বিভক্ত।


30
আমি মনে করি column == expressionবনাম সম্পর্কে আপনার বক্তব্যটি এবং এর keyword = expressionমধ্যে পার্থক্য সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট । ধন্যবাদ! filterfilter_by
হলিস্টার

2
আমি স্ক্ল্যাচমিতে নতুন, তাই যদি এটি একটি মূ .় প্রশ্ন হয় তবে আমাকে ক্ষমা করুন, তবে ফিল্টার_বি () "দাম> = 100" এর মতো খুব সাধারণ শর্তেরও অনুমতি দেয় বলে মনে হয় না। সুতরাং, ফিল্টার_বি () যেভাবেই হোক ফাংশন রাখুন, আপনি যদি কেবলমাত্র এটি "প্রাইস = 100" এর মতো খুব সাধারণ অবস্থার জন্য ব্যবহার করতে পারেন?
পাভেলরমন

18
কারণ লোকেরা এটি পছন্দ করে
zzzeek

3
তাদের মধ্যে কোন পারফরম্যান্স পার্থক্য আছে? আমি ভাবছিলাম যে এর filter_byচেয়ে কিছুটা দ্রুত হতে পারে filter
দেবী

6
ব্যবহারের filter_byবিষয়টি হ'ল ক্ষেত্রের নামটি লিখতে সক্ষম হও সেই শ্রেণীর জন্য, কোনও প্রশ্ন জিজ্ঞাসা করা হয়নি - যখন flterসত্যিকারের কলামের বস্তুর প্রয়োজন হয় - যার জন্য সাধারণত একটি অপ্রয়োজনীয় শ্রেণীর নাম টাইপ করতে (এবং পড়তে) প্রয়োজন হবে will সুতরাং, কেউ যদি সাম্যের দ্বারা ফিল্টার করতে চান তবে এটি বরং সুবিধাজনক।
jsbueno

36

filter_byকীওয়ার্ড আর্গুমেন্ট ব্যবহার করে, যেখানে filterপাইথোনিক ফিল্টারিংয়ের পক্ষে যুক্তিগুলি পছন্দ করেfilter(User.name=="john")


34

এটি দ্রুত ক্যোয়ারী লেখার জন্য একটি সিনট্যাক্স চিনি। সিউডোকোডে এর বাস্তবায়ন:

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বৈশিষ্ট্যটি ক্যোয়ারি_প্রোপার্টি এবং এটি আজকাল এর বেশ মানসম্পন্ন চিনি
এনওমড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.