Таблица базы данных не создается с использованием SQLitePorter - синтаксическая ошибка - PullRequest
0 голосов
/ 06 июня 2018

Итак, у меня проблема с созданием конкретной таблицы с помощью плагина SQLitePorter.

У меня есть файл в папке с активами initDB.sql, внутри которого у меня есть строка SQL:

CREATE TABLE IF NOT EXISTS `localListItems` (
   `id` INTEGER NOT NULL ,
   `quantity` TINYINT(2) NOT NULL , 
   `checked` TINYINT(1) NOT NULL DEFAULT 0 ,
   `listId` INTEGER NOT NULL , 
   `itemId` INTEGER NOT NULL , 
    PRIMARY KEY (`id`), 
    KEY `fkIdx_26` (`listId`), 
    CONSTRAINT `FK_26` 
      FOREIGN KEY `fkIdx_26` (`listId`) 
      REFERENCES `localLists` (`id`) 
      ON DELETE CASCADE, 
    KEY `fkIdx_30` (`itemId`), 
    CONSTRAINT `FK_30` 
      FOREIGN KEY `fkIdx_30` (`itemId`) 
      REFERENCES `localItems` (`id`) 
      ON DELETE CASCADE
);

Минимизированная версия:

CREATE TABLE IF NOT EXISTS `localListItems` ( `id` INTEGER NOT NULL , `quantity` TINYINT(2) NOT NULL , `checked` TINYINT(1) NOT NULL DEFAULT 0 , `listId` INTEGER NOT NULL , `itemId` INTEGER NOT NULL , PRIMARY KEY (`id`), KEY `fkIdx_26` (`listId`), CONSTRAINT `FK_26` FOREIGN KEY `fkIdx_26` (`listId`) REFERENCES `localLists` (`id`) ON DELETE CASCADE, KEY `fkIdx_30` (`itemId`), CONSTRAINT `FK_30` FOREIGN KEY `fkIdx_30` (`itemId`) REFERENCES `localItems` (`id`) ON DELETE CASCADE);

, которая минимизирована в документе и поэтому занимает одну строку для предотвращения экранирования ошибок '\ n'

Я вызываю этот файл, используяследующий машинописный код:

this.httpClient.get('assets/initDB.sql', { responseType: 'text' })
      .subscribe((sql:any) => {
        this.sqlitePorter.importSqlToDb(this.database, sql)
          .then(data => {
            this.databaseReady.next(true);
            this.storage.set('database_filled', this.databaseVersionControl);
          })
          .catch(e => console.log(e));
      });

Все остальные таблицы вставляются по мере необходимости (не показано выше), однако приведенный выше SQL отлично работает в PHPMyAdmin, но не работает при попытке создать его с помощью SQLite.

Ошибка, отображаемая в консоли, представляет собой следующий код JSON.

{
  "code":5,
  "message":"Failed to import SQL; message=near \"KEY\": syntax error",
  "statement":"CREATE TABLE IF NOT EXISTS `localListItems` ( `id` INTEGER NOT NULL , `quantity` TINYINT(2) NOT NULL , `checked` TINYINT(1) NOT NULL DEFAULT 0 , `listId` INTEGER NOT NULL , `itemId` INTEGER NOT NULL , PRIMARY KEY (`id`), KEY `fkIdx_26` (`listId`), CONSTRAINT `FK_26` FOREIGN KEY `fkIdx_26` (`listId`) REFERENCES `localLists` (`id`) ON DELETE CASCADE, KEY `fkIdx_30` (`itemId`), CONSTRAINT `FK_30` FOREIGN KEY `fkIdx_30` (`itemId`) REFERENCES `localItems` (`id`) ON DELETE CASCADE)"
}

Любая справка о том, почему это не работает, будет сильно оценена.Как я не могу понять код ошибки.

Спасибо.

  • Мэтт

1 Ответ

0 голосов
/ 06 июня 2018

Ваш оператор SQL использует синтаксис MySQL, но вы пытаетесь импортировать его в базу данных SQLite.

Например, KEY - это ключевое слово MySQL;его эквивалент SQLite равен INDEX ( см. здесь ).

В SQLite индекс не может быть создан в операторе CREATE TABLE, поэтому требуется отдельный оператор CREATE INDEX,Например,

CREATE INDEX fkIdx_30 ON localListItems(itemId)

Вы можете вставить свой SQL в онлайн-инструмент, такой как http://sqlfiddle.com,, установить движок на SQLite и нажать «Построить схему», чтобы проверить работу синтаксиса в SQLite.

...