Ржавчина Дизеля не распознает первичный ключ

#mysql #sql #rust #rust-diesel

Вопрос:

Это мой файл up.sql:

     `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `first_name` VARCHAR(255),
    `last_name` VARCHAR(255),
    `user_name` VARCHAR(255) NOT NULL UNIQUE,
    `email` VARCHAR(255) NOT NULL UNIQUE,
    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
);
 

При запуске миграции дизельного топлива я получаю следующую ошибку:

Дизель поддерживает только таблицы с первичными ключами. Таблица пользователи не имеет первичного ключа

Не знаю, что я делаю не так, любая помощь была бы очень признательна!

Ответ №1:

Я закончил тем, что вручную создал таблицу непосредственно в mysql, однако, когда я попытался сгенерировать схему, я снова получил сообщение об ошибке «нет первичного ключа» от интерфейса командной строки diesel. Поэтому я начал играть со своим sql, чтобы посмотреть, смогу ли я заставить его работать, и в конце концов он сделал это, используя следующее:

 CREATE TABLE users (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `first_name` VARCHAR(255),
    `last_name` VARCHAR(255),
    `user_name` VARCHAR(255) NOT NULL UNIQUE,
    `email` VARCHAR(255) NOT NULL UNIQUE,
    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
 

Похоже, что для того, чтобы diesel распознал столбец как имеющий ПЕРВИЧНЫЙ КЛЮЧ, атрибут первичного ключа должен быть указан последним.

Я не уверен, является ли это ошибкой, известной причудой или допустимым синтаксисом. В любом случае, было довольно неприятно выслеживать это. Я проведу еще несколько тестов и приму этот ответ, если он покажется надежным решением.

(правка: я также проверил это с помощью аналогичного SQL-запроса, где AUTO_INCREMENT пришел после ПЕРВИЧНОГО КЛЮЧА, и это не сработало)

Комментарии:

1. Дизель использует информационную схему, предоставленную mysql, для получения информации о текущей схеме. Это включает в себя имя таблицы, соответствующую информацию о любом столбце и информацию о внешних и первичных ключах. Если cli diesel выдает сообщение об отсутствии первичного ключа для определенной таблицы, это связано с тем, что в информационной схеме нет первичного ключа. Кроме того, это, по-видимому, сильно зависит от платформы. Если вы заинтересованы в том, чтобы помочь решить эту проблему, не стесняйтесь добавлять информацию в соответствующую проблему( github.com/diesel-rs/diesel/issues/2786 )