我正在尝试在 Flask 应用程序中运行原始 sql 查询。这就是我所拥有的
@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:双精度类型的输入语法无效:“”
我做错了什么?
错误消息“psycopg2.errors.InvalidTextRepresentation: 无效的输入语法,用于类型双精度: "”” 表示正在尝试将一个空字符串 ("") 插入到数据库表中名为
price
的
double precision
列中。
此错误出现在的 SQL 查询的这一部分中:
MIN(price::float) as price
这里的问题是,如果
price
列最初在的数据库中定义为
text
或类似类型,并且包含非数字值(如空字符串或文本),则在尝试将其转换为
float
时会出现问题。
可以通过以下方法解决此问题:
1. 在数据库中更正数据类型:
-
理想情况下,如果希望存储数字价格,则
price
列应具有numeric
或double precision
数据类型。 - 可以修改数据库架构以更改此列的类型。
- 警告: 确保在执行此操作之前备份数据,因为此操作可能会导致数据丢失。
ALTER TABLE product ALTER COLUMN price TYPE numeric(10, 2); -- 将“price”更改为具有 2 位小数的数字
2. 在 SQL 查询中处理非数字值:
-
可以使用
CASE
语句在转换之前检查price
列中是否存在非数字值。
修改后的查询:
query_stock = """
SELECT name, size, MIN(CASE WHEN price ~ '^[0-9]+.?[0-9]*$' THEN price::float ELSE NULL END) as price, link
FROM product
WHERE name LIKE %s AND size = %s
GROUP BY price, name, size, link
"""
此查询仅在
price
包含数字值时才将其转换为浮点数,否则将使用
NULL
。这可以防止因尝试转换非数字值而导致的错误。
3. 在 Python 代码中清理数据:
-
可以通过在将其插入数据库之前检查和清理
price
值来防止此问题。
在将数据插入数据库之前,确保
price
值为数字或
None
。
通过实施这些解决方案之一,可以解决“psycopg2.errors.InvalidTextRepresentation”错误并确保的 Flask 应用程序正常工作。
标签:python,postgresql,psycopg2 From: 60983029