Почему миграция Knex не заставляет столбец быть уникальным? - PullRequest
0 голосов
/ 08 ноября 2019

Я создаю базу данных SQLite с помощью этой миграции Knex. Когда я просматриваю БД в SQLiteStudio, это не означает, что столбец электронной почты уникален. Есть ошибка, которую я пропускаю?

exports.up = function (knex) {
    return knex.schema
        .createTable('users', users => {
            users.increments();
            users.string('email', 128).unique().notNullable();
            users.string('password', 256).notNullable();
        })

Сгенерированный код DDL:

CREATE TABLE users (
    id       INTEGER       NOT NULL
                           PRIMARY KEY AUTOINCREMENT,
    email    VARCHAR (128) NOT NULL,
    password VARCHAR (256) NOT NULL
);

Альтернативы, которые я пробовал, не работали:

-Переключениепорядок unique () и notNullable ()

users.string('email', 128).notNullable().unique()

-Создание отдельной строки для добавления ограничения Unique

        .createTable('users', users => {
            users.increments();
            users.string('email', 128).notNullable();
            users.string('password', 256).notNullable();
            users.unique('email');
        })

1 Ответ

1 голос
/ 10 ноября 2019

Это уникально, вы просто не увидите этого в выражении CREATE TABLE. SQLite устанавливает ограничение UNIQUE с помощью , создавая индекс с квалификатором UNIQUE. Возьмите следующую миграцию Knex, например:

exports.up = knex =>
  knex.schema.debug().createTable("users", t => {
    t.increments("id");
    t.string("name").unique();
  });

Примечание debug(), очень удобно, если вы хотите увидеть, какой SQL генерируется. Вот отладочный вывод:

[
  {
    sql: 'create table `users` (`id` integer not null ' +
      'primary key autoincrement, `name` ' +
      'varchar(255))',
    bindings: []
  },
  {
    sql: 'create unique index `users_name_unique` on `users` (`name`)',
    bindings: []
  }
]

Как видите, для создания ограничения UNIQUE выдается второй оператор. Если мы сейчас пойдем и посмотрим на базу данных, то увидим что-то вроде:

07:48 $ sqlite3 dev.sqlite3
sqlite> .dump users
BEGIN TRANSACTION;
CREATE TABLE `users` (`id` integer not null primary key autoincrement,
  `name` varchar(255));
CREATE UNIQUE INDEX `users_name_unique` on `users` (`name`);
COMMIT;

Кроме того, вы можете захотеть провести дополнительные исследования о возможной длине электронных писем пользователей. См. этот ответ в качестве отправной точки.

...