PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

पायथन पोस्टग्रेएसक्यूएल sqlalchemy क्वेरी एक DATERANGE कॉलम

क्वेरी

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 रेंज . का उपयोग करना आसान है टाइप करें और उन्हें विवरण संभालने दें।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. services.db के लिए असमर्थित विन्यास विकल्प:'छवियां'

  2. फ्लॉस यूके स्प्रिंग सम्मेलन

  3. PostgreSQL 9.3 . में सशर्त योग दो कॉलम कैसे करें

  4. किसी अन्य तालिका के लिए विदेशी कुंजी के रूप में उपयोग की जाने वाली स्वत:जेनरेट की गई प्राथमिक कुंजी का निर्धारण कैसे करें

  5. समग्र प्राथमिक कुंजी शामिल स्तंभों पर नल बाधाओं को लागू नहीं करती है