क्वेरी
the_daterange_lower = datetime.strptime(the_daterange[0], '%d.%m.%Y')
the_daterange_upper = datetime.strptime(the_daterange[1], '%d.%m.%Y')
bookings = UserBooks.query.\
filter(UserBooks.booked_date.lower >= the_daterange_lower,
UserBooks.booked_date.upper <= the_daterange_upper).\
all()
ऑपरेटर <@
. द्वारा "रेंज इज कंटेन्ड" का उपयोग करके कार्यान्वित किया जा सकता है . सही संकार्य पारित करने के लिए आपको <का एक उदाहरण बनाना होगा कोड>psycopg2.extras.DateRange
, जो एक Postgresql daterange
. का प्रतिनिधित्व करता है पायथन में मान:
the_daterange_lower = datetime.strptime(the_daterange[0], '%d.%m.%Y').date()
the_daterange_upper = datetime.strptime(the_daterange[1], '%d.%m.%Y').date()
the_daterange = DateRange(the_dateranger_lower, the_daterange_upper)
bookings = UserBooks.query.\
filter(UserBooks.booked_date.contained_by(the_daterange)).\
all()
ध्यान दें कि विशेषताएँ निचला
और ऊपरी
psycopg2.extras.Range
प्रकार। जैसा कि आपकी त्रुटि बताती है, SQLAlchemy श्रेणी स्तंभ प्रकार प्रदान नहीं करते हैं।
यदि आप अपरिष्कृत SQL का उपयोग करना चाहते हैं और दिनांक सीमाओं को पास करना चाहते हैं, तो आप उसी DateRange
का उपयोग कर सकते हैं मूल्यों को भी पारित करने के लिए वस्तुएं:
bookings = db_session.execute(
'SELECT * FROM usersbookrooms WHERE booked_date && %s',
(DateRange(the_daterange_lower, the_daterange_upper),))
आप मैन्युअल रूप से शाब्दिक निर्माण भी कर सकते हैं , अगर आप चाहते हैं:
bookings = db_session.execute(
'SELECT * FROM usersbookrooms WHERE booked_date && %s::daterange',
(f'[{the_daterange_lower}, {the_daterange_upper})',))
चाल पायथन में शाब्दिक निर्माण करना है और इसे एक ही मान के रूप में पास करना है - हमेशा की तरह प्लेसहोल्डर का उपयोग करना। इसे किसी भी SQL इंजेक्शन संभावनाओं से बचना चाहिए; केवल एक चीज हो सकती है कि शाब्दिक में daterange
. के लिए अमान्य सिंटैक्स है . वैकल्पिक रूप से आप एक रेंज कंस्ट्रक्टर
की सीमा पार कर सकते हैं। :
bookings = db_session.execute(
'SELECT * FROM usersbookrooms WHERE booked_date && daterange(%s, %s)',
(the_daterange_lower, the_daterange_upper))
कुल मिलाकर केवल Psycopg2 रेंज
. का उपयोग करना आसान है टाइप करें और उन्हें विवरण संभालने दें।