首页 > 编程问答 >psycopg2.errors.InvalidTextRepresentation

psycopg2.errors.InvalidTextRepresentation

时间:2024-08-04 15:22:56浏览次数:16  
标签:python postgresql psycopg2

我正在尝试在 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

相关文章

  • 如何在python中使用xarray打开grib2文件?
    将xarray导入为xr导入cfgrib导入生态码将pandas导入为pddata=xr.open_dataset(r"C:\Users\new\forecast_data.grib2",engine="cfgrib")这是我的代码。我只想使用xarray读取这个文件。错误是:无法识别的引擎cfgrib必须是以下之一:['netcdf4'、'scipy'、'......
  • 如何在 java 或 python 中使用 HTTP(S) 解决无法解析的主机名或无法识别的名称错误?
    我尝试以编程方式访问网站的信息,但在Java和Python上都无法解析主机名。如果我指定IP地址,则会将错误更改为TLSV1_UNRECOGNIZED_NAME。不过,这个网站无需任何额外的工作就可以通过任何浏览器解决。我在这里浏览了很多潜在的解决方案,但对于Python,它说这个问题应该在2.7......
  • Python 请求 POST 请求与 websockets 库一起使用时挂起
    我使用Python中的requests库发送POST请求,同时维护与websockets库的WebSocket连接:importasyncioimportrequestsimportwebsocketsasyncdefwebsocket_handler(uri):asyncwithwebsockets.connect(uri)aswebsocket:whileTrue:me......
  • 在Python中,list1[::] = list2的空间复杂度是多少?
    此代码首先迭代列表nums,更新整数0、1、2(也分别称为红色、白色和蓝色)的计数。nums保证只有整数0、1和/或2。找到计数后,代码使用[::],这是一种就地修改列表的技巧,以排序numsdefsortColors(self,nums:List[int])->None:re......
  • [附开题]flask框架高校资产管理系统d8y3s(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育事业的快速发展,高校资产规模日益庞大,种类繁多,管理难度显著增加。传统的资产管理方式往往依赖于手工记录和纸质档案,不仅效率低......
  • [附开题]flask框架贺州图特产管理系统uuy79(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景贺州,这座历史悠久、文化底蕴深厚的城市,以其丰富的自然资源和独特的地理位置孕育了众多令人瞩目的特产。然而,在信息化快速发展的今天,贺州特......
  • [附开题]flask框架红枫超市会员管理系统ew5iq(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着零售行业的快速发展与消费者需求的日益多样化,超市作为人们日常生活中不可或缺的一部分,其管理效率和服务质量直接影响着顾客的购物体验......
  • PYTHON专题-(4)python叫你搞对象
    什么是面向过程编程?面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。什么是面向对象编程?面向对象编程——ObjectOrientedProgramming,简......
  • Python 基础教学:中文编码处理
    《Python基础教学:中文编码处理》在编程中,处理中文字符时经常会遇到编码问题。Python3默认使用UTF-8编码,但在处理文件、网络数据或与旧系统交互时,可能需要处理GBK、GB2312等其他编码。1.字符串的编码和解码在Python中,字符串(str)默认是Unicode编码。当你需要将......
  • Python 基础教学:深入了解 continue、break 和 pass 语句
    《Python基础教学:深入了解continue、break和pass语句》Python中的控制流语句不仅仅包括条件语句和循环,还包括continue、break和pass这三个特殊的关键字,它们在特定情况下可以控制程序的流程。1.continue语句continue用于跳过当前循环的剩余代码,在循环控制结......