sql >> データベース >  >> RDS >> PostgreSQL

PythonpostgreSQLsqlalchemyが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()
    

    「範囲は次のように含まれています」演算子<@を使用して実装できます 。正しいオペランドを渡すには、<のインスタンスを作成する必要があります。 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を使用する方が簡単です。 タイプし、詳細を処理させます。




    1. SQL Server のテーブルにない乱数を生成する

    2. エスケープ文字のエスケープは機能しません–SQLLIKE演算子

    3. AWSのKubernetesクラスターからPostgresRDSにアクセスする

    4. PostgreSQLでlobjectのサイズを取得する