2017-12-22 5 views
0

RESTful Webサービス用のマイクロサービスを作成しようとしています。 私はデータベースをPostgresqlで作成し、現在はFlaskとpsycopg2(dbオブジェクトからjsonオブジェクトへの変換用)を使用しています。 以下は私のコードの一部ですが、何らかの理由でエラーが発生しています。私が確立しようとしているURIは、これと少し似ていますlocalhost/events/20171222これを処理するにはどうすればよいでしょうか?Pythonを使用してFlaskでエンドポイントを作成中に発生する

コード:

app = Flask(__name__) 
conn = psycopg2.connect("dbname='postgresdb'") 
cur = conn.cursor(cursor_factory=RealDictCursor) 

@app.route('/events/<dated>', methods=['GET']) 
def getDatedEvents(dated): 
    date_obj = datetime.strptime(dated, '%Y%m%d') 
    #print(type(date_obj)) 
    #print(date_obj) 

    cur.execute(""" 
     SELECT event_id, timestamp 
     FROM event_tbl 
     WHERE timestamp < date_obj 
     ORDER BY timestamp 
     LIMIT 25 
     """) 

    return json.dumps(cur.fetchall(), default=json_serial) 

エラー出力:

psycopg2.ProgrammingError: column "date_obj" does not exist 
LINE 4: WHERE timestamp < date_obj 
        ^

localhost - - [22/Dec/2017 17:22:29] "GET /events/20161020 HTTP/1.1" 500 - 

答えて

-1

あなたのクエリを変更する必要があります。現在、タイムスタンプと文字列date_objを比較しています。これは、タイムスタンプと文字列を比較できないため、postgreSQLがエラーを投げている理由です。その文字列フォーマットを使用しての点に注意して、以下のコメントで述べたように

cur.execute(""" 
    SELECT event_id, timestamp 
    FROM event_tbl 
    WHERE timestamp < %s 
    ORDER BY timestamp 
    LIMIT 25 
    """, (date_obj,))` 

docsによると、答えの前のリビジョンは、SQLインジェクションを引き起こす可能性が

、および使用:クエリであなたの date_objを渡すためのフォーマット文字列を使用しますAPIを正しく。

+0

ありがとうございました:) @py_dude –

+0

@ GabbarSinghあなたが役に立った場合、この回答を正しいとマークすることができます:) –

+3

あなたのコードにSQL注入脆弱性を作成する方法です。クエリパラメータを使用します。https://stackoverflow.com/questions/1466741/parameterized-queries-with-psycopg2-python-db-api-and-postgresql – leovp

関連する問題