WedX - журнал о программировании и компьютерных науках

ACL CakePHP с первичными ключами UUID

Я разрабатываю приложение CakePHP, и я хотел бы использовать UUID в качестве первичных ключей, поскольку приложение будет распределено по нескольким базам данных, и я также хотел бы воспользоваться интегрированной структурой ACL в CakePHP 2.1.

Я собираюсь в соответствии с руководство, и я изменил схему БД, следуя

CREATE TABLE acos (
  id uuid NOT NULL,
  parent_id uuid DEFAULT NULL,
  model VARCHAR(255) DEFAULT '',
  foreign_key uuid DEFAULT NULL,
  alias VARCHAR(255) DEFAULT '',
  lft uuid DEFAULT NULL,
  rght uuid DEFAULT NULL,
  PRIMARY KEY  (id)
);

CREATE TABLE aros_acos (
  id uuid NOT NULL,
  aro_id uuid NOT NULL,
  aco_id uuid NOT NULL,
  _create CHAR(2) NOT NULL DEFAULT 0,
  _read CHAR(2) NOT NULL DEFAULT 0,
  _update CHAR(2) NOT NULL DEFAULT 0,
  _delete CHAR(2) NOT NULL DEFAULT 0,
  PRIMARY KEY(id)
);

CREATE TABLE aros (
  id uuid NOT NULL,
  parent_id uuid DEFAULT NULL,
  model VARCHAR(255) DEFAULT '',
  foreign_key uuid DEFAULT NULL,
  alias VARCHAR(255) DEFAULT '',
  lft uuid DEFAULT NULL,
  rght uuid DEFAULT NULL,
  PRIMARY KEY  (id)
);

Однако теперь я получаю сообщение об ошибке:

Ошибка: SQLSTATE[42883]: неопределенная функция: 7 ОШИБКА: функция max(uuid) не существует СТРОКА 1: ВЫБЕРИТЕ MAX("Аро"."право") КАК "право" ИЗ "общественности"."арос" КАК ". .. ^ ПОДСКАЗКА: Ни одна функция не соответствует заданному имени и типам аргументов.Возможно, вам потребуется добавить явное приведение типов.

Версия CakePHP 2.1.0-бета, и я использую PostgreSQL с типом данных UUID.

Кто-нибудь успешно использовал структуру ACL CakePHP с UUID? Я хотел бы, чтобы это работало с минимальными изменениями в структуре CakePHP, для будущей поддержки этого приложения.


Ответы:


1

Для типа данных UUID не определена агрегатная функция max(). Никакой UUID не считается "больше", чем другой UUID.

Рассмотрим следующую демонстрацию:

CREATE TEMP TABLE t(id uuid);
INSERT INTO t VALUES
 ('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11')
,('b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11');

SELECT max(id) FROM t;

Урожайность:

ERROR:  function max(uuid) does not exist
LINE 1: SELECT max(id) FROM t;
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

Вы можете обойти проблему. Приведите id к тексту, если вам нужно самое большое значение в алфавитном порядке:

SELECT max(id::text) FROM t;

Урожайность:

b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11

Но имейте в виду, что это всего лишь стандартное текстовое представление UUID. Один и тот же UUID может быть представлен во многих других формах.

02.02.2012
  • Ну, я знаю, почему это терпит неудачу, но я ищу самый простой способ обойти это в структуре ACL CakePHP, поэтому мне не нужно создавать свою собственную структуру ACL. Но вы правы в том, что изменение типов на character(36) позволяет коду работать без ошибок, хотя теперь вопрос в том, работает ли он до сих пор. 03.02.2012
  • @Marek Я бы не стал менять тип данных. Вопрос, а зачем вам максимальный UUID? Если вы это сделаете, приведите значение только для вычисления. Вы также можете написать свою собственную агрегатную функцию max(uuid). 03.02.2012
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]