我正在构建一个带有PostgreSQL数据库的平台(第一次),但我已经使用Oracle和MySQL数据库几年了。
我的问题是关于Postgres中的UUID数据类型。 我使用UUIDv4 uuid来识别多个表中的记录,因此对/ users / 2df2ab0c-bf4c-4eb5-9119-c37aa6c6b172的请求将响应具有该UUID的用户。我还有一个用于索引的自动增量ID字段。
我的查询只是一个select
where
条UUID
。但是,当用户输入此2df2ab0c-bf4c-4eb5-9119-c37aa6c6b17
之类的无效UUID(没有最后2
)时,数据库会响应此错误:Invalid input syntax for UUID
。
我想知道为什么它会返回此内容,因为select
上的integer
- 类型string
- 类型确实有效。
现在我需要在每个路由中设置一个中间件/检查,其中包含UUID
- 类型参数,否则服务器会崩溃。
顺便说一句,我使用的是Flask 0.12(Python)和PostgreSQL 9.6
答案 0 :(得分:2)
RFC 4122,ISO / IEC 9834-8:2005定义的UUID是一个128位的数量...写成一系列小写的十六进制数字...总共32位代表128位。 (Postgresql Docs)
没有从31位十六进制数字文本转换为128位UUID(抱歉)。你有一些选择:
在您的查询中转换为:: text(不是真的推荐,因为您每次都要转换每一行)。
SELECT * FROM my_table WHERE my_uuid::TEXT = 'invalid uid';
Postgres允许使用大写/小写,并且使用连字符是灵活的,因此预检只是简单地删除连字符,小写,计数[0-9[a-f]
& if == 32,你有一个可行的UUID。否则,您可以告诉他们,而不是告诉您的用户"未找到",而不是UUID",这可能更加用户友好。
答案 1 :(得分:0)
数据库引发错误,因为您试图在UUID类型的列中与不包含有效UUID 的查询进行匹配。整数或字符串查询不会发生这种情况,因为忽略那些确实的最后一个字符会导致生成有效的整数或字符串,而不是您可能想要的整数或字符串。
您可以通过验证输入来防止将无效的UUID传递到数据库(无论如何,出于其他原因,您都应该这样做),或者以某种方式捕获此错误。无论哪种方式,您都需要向用户展示人类可读的错误消息。
还要考虑用户是否首先应该输入带有UUID的URL,这不是非常用户友好的方式。如果它们只是单击链接而不是像通常那样键入链接,那么该错误怎么发生?很有可能这是某种形式的攻击,您应该做出相应的反应。