PostgreSQL UUID日期类型

时间:2017-02-07 18:11:49

标签: python postgresql uuid

我正在构建一个带有PostgreSQL数据库的平台(第一次),但我已经使用Oracle和MySQL数据库几年了。

我的问题是关于Postgres中的UUID数据类型。 我使用UUIDv4 uuid来识别多个表中的记录,因此对/ users / 2df2ab0c-bf4c-4eb5-9119-c37aa6c6b172的请求将响应具有该UUID的用户。我还有一个用于索引的自动增量ID字段。

我的查询只是一个select whereUUID。但是,当用户输入此2df2ab0c-bf4c-4eb5-9119-c37aa6c6b17之类的无效UUID(没有最后2)时,数据库会响应此错误:Invalid input syntax for UUID

我想知道为什么它会返回此内容,因为select上的integer - 类型string - 类型确实有效。

现在我需要在每个路由中设置一个中间件/检查,其中包含UUID - 类型参数,否则服务器会崩溃。

顺便说一句,我使用的是Flask 0.12(Python)和PostgreSQL 9.6

2 个答案:

答案 0 :(得分:2)

  

RFC 4122,ISO / IEC 9834-8:2005定义的UUID是一个128位的数量...写成一系列小写的十六进制数字...总共32位代表128位。 (Postgresql Docs)

没有从31位十六进制数字文本转换为128位UUID(抱歉)。你有一些选择:

  1. 在您的查询中转换为:: text(不是真的推荐,因为您每次都要转换每一行)。

    SELECT * FROM my_table WHERE my_uuid::TEXT = 'invalid uid';
    
  2. 不要将其存储为UUID类型。如果您不想/需要UUID语义,请将其存储为varchar。
  3. 检查您的客户输入。 (我的推荐)。从概念上讲,这与要求某个人的年龄和获得ABC'作为回应。
  4. Postgres允许使用大写/小写,并且使用连字符是灵活的,因此预检只是简单地删除连字符,小写,计数[0-9[a-f]& if == 32,你有一个可行的UUID。否则,您可以告诉他们,而不是告诉您的用户"未找到",而不是UUID",这可能更加用户友好。

答案 1 :(得分:0)

数据库引发错误,因为您试图在UUID类型的列中与不包含有效UUID 的查询进行匹配。整数或字符串查询不会发生这种情况,因为忽略那些确实的最后一个字符会导致生成有效的整数或字符串,而不是您可能想要的整数或字符串。

您可以通过验证输入来防止将无效的UUID传递到数据库(无论如何,出于其他原因,您都应该这样做),或者以某种方式捕获此错误。无论哪种方式,您都需要向用户展示人类可读的错误消息。

还要考虑用户是否首先应该输入带有UUID的URL,这不是非常用户友好的方式。如果它们只是单击链接而不是像通常那样键入链接,那么该错误怎么发生?很有可能这是某种形式的攻击,您应该做出相应的反应。