psycopg2.errors.InvalidTextRepresentation - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь выполнить необработанный запрос sql в приложении flask. вот что у меня есть

@app.route("/price/compare",methods=["POST"])
def post():
data= request.json
cur = conn.cursor()
query_stock = """SELECT name,size,MIN(price::float) as price,link
           FROM product
           WHERE name like '%{0}%' AND size='{1}'
           GROUP BY price,name,size,link
        """.format(data["name"],data["size"])
stock_r={}

try:
    cur.execute(query_stock)
    stock_r=cur.fetchone()
except Exception as e:
    raise e
    print(e)
    print("ERROR : ", str(e))
    stock_r={}

return jsonify({"stock_site":stock_r,"goat_site":goat_r})

, когда я делаю запрос на публикацию маршрута, я получаю следующую ошибку

return super(RealDictCursor, self).execute(query, vars)

psycopg2.errors.InvalidTextRepresentation: неверный синтаксис ввода для типа двойной точности : ""

что я делаю не так?

1 Ответ

0 голосов
/ 02 апреля 2020

Возможно, вы столкнулись с этой проблемой, потому что параметры подставлены неверно. Попробуйте использовать встроенную функцию params :

cur.execute("""
    INSERT INTO some_table (an_int, a_date, a_string)
    VALUES (%s, %s, %s);
    """,
    (10, datetime.date(2005, 11, 18), "O'Reilly"))

Ваш пример станет:

@app.route("/price/compare", methods=["POST"])
def post():
    data = request.json
    cur = conn.cursor()

    stock_r = {}
    goat_r = None

    query = """SELECT name,size,MIN(price::float) as price,link
                   FROM product
                   WHERE name like %(name)s AND size=%(size)s
                   GROUP BY price,name,size,link
                """
    query_data = {
        'name': '%{}%'.format(data['name']),
        'size': data['size']
    }

    cur.execute(query, query_data)
    stock_r = cur.fetchone()

    return jsonify({"stock_site": stock_r, "goat_site": goat_r})

Несколько замечаний: - вы используете переменную goat_r, но он не был объявлен - в блоке except вы сначала вызвали raise, что означает, что следующие два print не будут выполнены

...