এসকিউএলএলচেমিতে ওআর ব্যবহার করা


190

আমি দস্তাবেজগুলি দেখেছি এবং এসকিউএএলএলচেমিতে কীভাবে একটি ও কোয়েরি করব তা আমি খুঁজে পাচ্ছি না। আমি এই কোয়েরিটি করতে চাই।

SELECT address FROM addressbook WHERE city='boston' AND (lastname='bulger' OR firstname='whitey')

কিছু হতে হবে

addr = session.query(AddressBook).filter(City == "boston").filter(????)

উত্তর:


322

টিউটোরিয়াল থেকে :

from sqlalchemy import or_
filter(or_(User.name == 'ed', User.name == 'wendy'))

72
নোট করুন যে এই পদ্ধতিটি জেনারেটরগুলি ব্যবহার করে সমর্থন করে, সুতরাং আপনার কাছে ওআর এর বিষয়ে দীর্ঘ তালিকা থাকলে আপনি এটি করতে পারেনfilter(or_(User.name == v for v in ('Alice', 'Bob', 'Carl')))
রব্রু ২

66
@ রব্রুর পরামর্শ অকারণে অক্ষম fficient আপনার যদি ইতিমধ্যে কোনও সংগ্রহ থাকে তবে আপনার এভাবে in_অপারেটরটি ব্যবহার করা উচিত :filter(User.name.in_(['Alice', 'Bob', 'Carl']))
intgr

5
আহ ধন্যবাদ আমি স্কেলচেমির সচেতন ছিলাম না যে ফিল্টারটি ছিল
রব্রু

8
@intgr রব্রু দ্বারা প্রদর্শিত উদাহরণটি এখনও কার্যকর, যদি আপনি in_ এর পরিবর্তে অন্য অপারেটর ব্যবহার করতে চান, উদাহরণস্বরূপ LIKE অপারেটর।
Lhassan Baazzi

2
@intgr ওরাকল এর সাথে আমার অভিজ্ঞতা দেখায় যে "OR" এর ক্রম "IN" ব্যবহারের চেয়ে অনেক দ্রুত। এছাড়াও "IN" 1000 ডলার এন্ট্রিগুলির মধ্যে সীমাবদ্ধ, যখন "OR" হয় না not
গা

318

এসকিউএলএলচেমি বিটওয়াইস অপারেটরগুলিকে ওভারলোড করে &, |এবং ~তাই কুরুচিপূর্ণ এবং হার্ড-টু-রিড প্রিফিক্স সিনট্যাক্সের পরিবর্তে or_()এবং and_()( বাসটিয়ানের উত্তরের মতো ) আপনি এই অপারেটরগুলি ব্যবহার করতে পারেন:

.filter((AddressBook.lastname == 'bulger') | (AddressBook.firstname == 'whitey'))

উল্লেখ্য, বন্ধনী দ্বারা ঐচ্ছিক না bitwise অপারেটরদের এর প্রাধান্য কারণে।

সুতরাং আপনার পুরো ক্যোয়ারী এটির মতো দেখতে পেল:

addr = session.query(AddressBook) \
    .filter(AddressBook.city == "boston") \
    .filter((AddressBook.lastname == 'bulger') | (AddressBook.firstname == 'whitey'))

8
+1, তবে আপনি পরিবর্তে আরও দুটি বন্ধনীতে শেষ দুটি ফিল্টার যুক্তিগুলি মোড়ানো করতে পারেন &এবং filterএকই প্রভাবের জন্য তাদের এবং প্রথমটির মধ্যে একটি (দ্বিতীয় কল ব্যবহার না করে ) ব্যবহার করতে পারেন?
14.313

21
@ চেজস্যান্ডম্যান: হ্যাঁ আপনি করতে পারতেন। তবে কি আরও বেশি পঠনযোগ্য? নং
চোরমাস্টার

1
উত্তরে এসকিউএএএলএলএকমি ডক্সের সাথে একটি লিঙ্ক পাওয়া ভাল হবে!
চেচে

@ থিফমাস্টার কাকতালীয় যে আপনার ওরফে চোর রয়েছে এবং আপনার উদাহরণে হোয়াইট বালগার রয়েছে ?
TheRealChx101

34

or_() অজানা সংখ্যক ও কোয়েরি উপাদানগুলির ক্ষেত্রে ফাংশনটি কার্যকর হতে পারে।

উদাহরণস্বরূপ, ধরে নেওয়া যাক যে আমরা কয়েকটি alচ্ছিক ফিল্টার দিয়ে একটি রেস্ট সার্ভিস তৈরি করছি, যদি কোনও ফিল্টার সত্য হয় তবে রেকর্ডটি ফিরিয়ে আনা উচিত। অন্যদিকে, যদি কোনও অনুরোধে প্যারামিটার সংজ্ঞায়িত না করা হয়, তবে আমাদের কোয়েরিটি পরিবর্তন করা উচিত নয়। or_()ফাংশন ছাড়াই আমাদের অবশ্যই এটির মতো কিছু করতে হবে:

query = Book.query
if filter.title and filter.author:
    query = query.filter((Book.title.ilike(filter.title))|(Book.author.ilike(filter.author)))
else if filter.title:
    query = query.filter(Book.title.ilike(filter.title))
else if filter.author:
    query = query.filter(Book.author.ilike(filter.author))

সঙ্গে or_()ফাংশন এটি পুনর্লিখিত করা যেতে পারে:

query = Book.query
not_null_filters = []
if filter.title:
    not_null_filters.append(Book.title.ilike(filter.title))
if filter.author:
    not_null_filters.append(Book.author.ilike(filter.author))

if len(not_null_filters) > 0:
    query = query.filter(or_(*not_null_filters))

1
অত্যন্ত সহায়ক উত্তর
রায় তোয়াল

3

এটি সত্যিই সহায়ক হয়েছে। প্রদত্ত যে কোনও টেবিলের জন্য আমার বাস্তবায়ন এখানে রয়েছে:

def sql_replace(self, tableobject, dictargs):

    #missing check of table object is valid
    primarykeys = [key.name for key in inspect(tableobject).primary_key]

    filterargs = []
    for primkeys in primarykeys:
        if dictargs[primkeys] is not None:
            filterargs.append(getattr(db.RT_eqmtvsdata, primkeys) == dictargs[primkeys])
        else:
            return

    query = select([db.RT_eqmtvsdata]).where(and_(*filterargs))

    if self.r_ExecuteAndErrorChk2(query)[primarykeys[0]] is not None:
        # update
        filter = and_(*filterargs)
        query = tableobject.__table__.update().values(dictargs).where(filter)
        return self.w_ExecuteAndErrorChk2(query)

    else:
        query = tableobject.__table__.insert().values(dictargs)
        return self.w_ExecuteAndErrorChk2(query)

# example usage
inrow = {'eqmtvs_id': eqmtvsid, 'datetime': dtime, 'param_id': paramid}

self.sql_replace(tableobject=db.RT_eqmtvsdata, dictargs=inrow)

দুঃখিত, আমি কিছুটা ভুল করেছি, চ্যানেকে নিম্নলিখিত পংক্তিতে: ক্যোরি = সিলেক্ট করুন ([টেবিলবজেক্ট]) where যেখানে (এবং _ (* ফিল্টারগারস))
ডেলপোজভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.