2017-02-07 11 views
0

Я создаю платформу с базой данных PostgreSQL (первый раз), но у меня есть опыт работы с базами данных Oracle и MySQL в течение нескольких лет.PostgreSQL UDID тип даты

Мой вопрос касается типа данных UUID в Postgres. Я использую UUIDv4 uuid для указания записи в нескольких таблицах, поэтому запрос/users/2df2ab0c-bf4c-4eb5-9119-c37aa6c6b172 будет отвечать пользователю, имеющему этот UUID. У меня также есть поле auto increment ID для индексации.

Мой запрос: select с положением where на UUID. Но когда пользователь вводит недопустимый UUID, такой как 2df2ab0c-bf4c-4eb5-9119-c37aa6c6b17 (без последнего 2), тогда база данных отвечает этой ошибкой: Invalid input syntax for UUID.

Мне было интересно, почему он вернулся, потому что, когда вы select на integer -type с string -типом это действительно работает.

Теперь мне нужно установить промежуточное ПО/проверку каждого маршрута, в котором есть параметр -type UUID, потому что в противном случае сервер сбой.

Btw Я использую флягу 0.12 (Python) и PostgreSQL 9.6

ответ

2

UUID as defined by RFC 4122, ISO/IEC 9834-8:2005... is a 128-bit quantity ... written as a sequence of lower-case hexadecimal digits... for a total of 32 digits representing the 128 bits. (Postgresql Docs)

Там нет преобразования из 31 шестнадцатеричных текста в цифры в 128-битном UUID (пардон). У вас есть несколько вариантов:

  1. Измени :: текст на запрос (на самом деле не рекомендуется, так как вы будете преобразовывать каждую строку, каждый раз).

    SELECT * FROM my_table WHERE my_uuid::TEXT = 'invalid uid'; 
    
  2. Не храните его как тип UUID. Если вам не нужна/нужна семантика UUID, сохраните ее как varchar.
  3. Проверьте свой клиентский ввод. (Моя рекомендация). Концептуально это ничем не отличается от просьбы о чьем-то возрасте и получения «ABC» в качестве ответа.

Postgres позволяет верхний/нижний регистр, и гибкость в использовании дефисов, поэтому предварительно проверка просто обнажать черточки, строчные буквы, считать [0-9[a-f] & если == 32, у вас есть работоспособный UUID. В противном случае, вместо того, чтобы сообщать вашему пользователю «не найден», вы можете сказать им «не UUID», который, вероятно, более удобен для пользователя.

+0

Спасибо. Я также подумал, что проверка uuid - лучший и удобный для пользователя вариант –

 Смежные вопросы

  • Нет связанных вопросов^_^