クエリ
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()
「範囲は次のように含まれています」演算子<@
を使用して実装できます 。正しいオペランドを渡すには、<のインスタンスを作成する必要があります。 code> psycopg2.extras.DateRange
、Postgresql daterange
を表します Pythonの値:
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()
属性がlower
であることに注意してください およびupper
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})',))
秘訣は、Pythonでリテラルを作成し、それを単一の値として渡すことです–いつものようにプレースホルダーを使用します。 SQLインジェクションの可能性を回避する必要があります。発生する可能性があるのは、リテラルの daterange
の構文が無効であるということだけです。 。または、境界を範囲コンストラクター
に渡すこともできます。 :
bookings = db_session.execute(
'SELECT * FROM usersbookrooms WHERE booked_date && daterange(%s, %s)',
(the_daterange_lower, the_daterange_upper))
全体として、Psycopg2の Range
を使用する方が簡単です。 タイプし、詳細を処理させます。