使用sqlite自动增量进行Sequelize奇怪的错误。使用 AutoIncrement 时没有错误,但没有自动增量,但使用 autoIncrement 时出错

问题描述 投票:0回答:1

我正在创建一个不和谐的机器人。有 2 个斜杠命令。一个名为 /setup 的命令用于将 guildId 和 adminChannel 添加到数据库。还有一个名为 /onduty 的命令,用于将用户、上班和下班时间添加到数据库。

/setup 命令运行良好。 /onduty 命令会产生问题。但我的主要问题是处理时间的数据库表的模型。当我尝试自动增量时出现错误。

这是我的 guild.js 文件:

import { Sequelize } from 'sequelize';
import { sequelize } from '../utils/database.js';

import { Time } from './times.js'

const Guild = sequelize.define('guilds', {
    guildId: {
        type: Sequelize.STRING,
        primaryKey: true
    },
    adminChannel: {
        type: Sequelize.STRING,
        allowNull: true
    }
});

Guild.hasMany(Time, {
    foreignKey: 'guildId',
    onUpdate: 'CASCADE',
    onDelete: 'CASCADE'
})
Time.belongsTo(Guild, {foreignKey: 'guildId'});

export { Guild };

这是我的 times.js 文件

import { Sequelize, DataTypes } from 'sequelize';
import { sequelize } from '../utils/database.js';

const Time = sequelize.define('times', {
    id: {
        type: Sequelize.INTEGER,
        AutoIncrement: true,
        primaryKey: true
    },
    guildId: {
        type: Sequelize.STRING,
        allowNull: false,
        primaryKey: true,
        references: {
            model: 'guilds',
            key: 'guildId',
        }
    },
    user: {
        type: Sequelize.STRING,
        allowNull: false
    },
    onDutyTime: {
        type: Sequelize.STRING,
        allowNull: false
    },
    offDutyTime: {
        type: Sequelize.STRING,
        allowNull: true
    },
});

export { Time };

这是我的续集数据库初始化文件(database.js)

import { Sequelize } from 'sequelize';

const sequelize = new Sequelize('database', 'user', 'password', {
    dialect: 'sqlite',
    host: 'localhost',
    storage: 'database.sqlite',
    logging: true,
});

export {sequelize};

这是我的数据库的图像: database.sqlite file

这是我在 times.js 文件中使用 AutoIncrement: true 时得到的结果:

(node:42984) [SEQUELIZE0002] DeprecationWarning: The logging-option should be either a function or false. Default: console.log
(Use `node --trace-deprecation ...` to show where the warning was created)
Executing (default): DROP TABLE IF EXISTS `times`;
Executing (default): DROP TABLE IF EXISTS `guilds`;
Executing (default): PRAGMA foreign_keys = OFF
Executing (default): DROP TABLE IF EXISTS `times`;
Executing (default): DROP TABLE IF EXISTS `guilds`;
Executing (default): PRAGMA foreign_keys = ON
Executing (default): DROP TABLE IF EXISTS `guilds`;
Executing (default): CREATE TABLE IF NOT EXISTS `guilds` (`guildId` VARCHAR(255) PRIMARY KEY, `adminChannel` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL);  
Executing (default): PRAGMA INDEX_LIST(`guilds`)
Executing (default): PRAGMA INDEX_INFO(`sqlite_autoindex_guilds_1`)
Executing (default): DROP TABLE IF EXISTS `times`;
Executing (default): CREATE TABLE IF NOT EXISTS `times` (`id` INTEGER NOT NULL, `guildId` VARCHAR(255) NOT NULL REFERENCES `guilds` (`guildId`) ON DELETE CASCADE ON UPDATE CASCADE, `user` VARCHAR(255) NOT NULL, `onDutyTime` VARCHAR(255) NOT NULL, `offDutyTime` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`, `guildId`));      
Executing (default): PRAGMA INDEX_LIST(`times`)
Executing (default): PRAGMA INDEX_INFO(`sqlite_autoindex_times_1`)

这是我在 times.js 文件中使用 autoIncrement: true 时得到的结果:

(node:125932) [SEQUELIZE0002] DeprecationWarning: The logging-option should be either a function or false. Default: console.log
(Use `node --trace-deprecation ...` to show where the warning was created)
Executing (default): DROP TABLE IF EXISTS `times`;
Executing (default): DROP TABLE IF EXISTS `guilds`;
Executing (default): PRAGMA foreign_keys = OFF
Executing (default): DROP TABLE IF EXISTS `times`;
Executing (default): DROP TABLE IF EXISTS `guilds`;
Executing (default): PRAGMA foreign_keys = ON
Executing (default): DROP TABLE IF EXISTS `guilds`;
Executing (default): CREATE TABLE IF NOT EXISTS `guilds` (`guildId` VARCHAR(255) PRIMARY KEY, `adminChannel` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL);
Executing (default): PRAGMA INDEX_LIST(`guilds`)
Executing (default): PRAGMA INDEX_INFO(`sqlite_autoindex_guilds_1`)
Executing (default): DROP TABLE IF EXISTS `times`;
Executing (default): CREATE TABLE IF NOT EXISTS `times` (`id` INTEGER NOT NULL AUTOINCREMENT, `guildId` VARCHAR(255) NOT NULL REFERENCES `guilds` (`guildId`) ON DELETE CASCADE ON UPDATE CASCADE, `user` VARCHAR(255) NOT NULL, `onDutyTime` VARCHAR(255) NOT NULL, `offDutyTime` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`, `guildId`));
node:internal/process/promises:289
            triggerUncaughtException(err, true /* fromPromise */);
            ^

Error
    at Database.<anonymous> (D:\A - Discord Bots\DiscordBot-Template-Master\node_modules\sequelize\lib\dialects\sqlite\query.js:185:27)
    at D:\A - Discord Bots\DiscordBot-Template-Master\node_modules\sequelize\lib\dialects\sqlite\query.js:183:50
    at new Promise (<anonymous>)
    at Query.run (D:\A - Discord Bots\DiscordBot-Template-Master\node_modules\sequelize\lib\dialects\sqlite\query.js:183:12)
    at D:\A - Discord Bots\DiscordBot-Template-Master\node_modules\sequelize\lib\sequelize.js:315:28
    at async SQLiteQueryInterface.createTable (D:\A - Discord Bots\DiscordBot-Template-Master\node_modules\sequelize\lib\dialects\abstract\query-interface.js:98:12)
    at async times.sync (D:\A - Discord Bots\DiscordBot-Template-Master\node_modules\sequelize\lib\model.js:942:7)
    at async Sequelize.sync (D:\A - Discord Bots\DiscordBot-Template-Master\node_modules\sequelize\lib\sequelize.js:377:9) {
  name: 'SequelizeDatabaseError',
  parent: [Error: SQLITE_ERROR: near "AUTOINCREMENT": syntax error] {
    errno: 1,
    code: 'SQLITE_ERROR',
    sql: 'CREATE TABLE IF NOT EXISTS `times` (`id` INTEGER NOT NULL AUTOINCREMENT, `guildId` VARCHAR(255) NOT NULL REFERENCES `guilds` (`guildId`) ON DELETE CASCADE ON UPDATE CASCADE, `user` VARCHAR(255) NOT NULL, `onDutyTime` VARCHAR(255) NOT NULL, `offDutyTime` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`, `guildId`));'  
  },
  original: [Error: SQLITE_ERROR: near "AUTOINCREMENT": syntax error] {
    errno: 1,
    code: 'SQLITE_ERROR',
    sql: 'CREATE TABLE IF NOT EXISTS `times` (`id` INTEGER NOT NULL AUTOINCREMENT, `guildId` VARCHAR(255) NOT NULL REFERENCES `guilds` (`guildId`) ON DELETE CASCADE ON UPDATE CASCADE, `user` VARCHAR(255) NOT NULL, `onDutyTime` VARCHAR(255) NOT NULL, `offDutyTime` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`, `guildId`));'  
  },
  sql: 'CREATE TABLE IF NOT EXISTS `times` (`id` INTEGER NOT NULL AUTOINCREMENT, `guildId` VARCHAR(255) NOT NULL REFERENCES `guilds` (`guildId`) ON DELETE CASCADE ON UPDATE CASCADE, `user` VARCHAR(255) NOT NULL, `onDutyTime` VARCHAR(255) NOT NULL, `offDutyTime` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`, `guildId`));',   
  parameters: {}
}

Node.js v21.6.1

我尝试这样做:

import { Sequelize, DataTypes } from 'sequelize';
import { sequelize } from '../utils/database.js';

const Time = sequelize.define('times', {
    id: {
        type: Sequelize.INTEGER,
        autoIncrement: true,
        primaryKey: true
    },
    guildId: {
        type: Sequelize.STRING,
        allowNull: false,
        primaryKey: true,
        references: {
            model: 'guilds',
            key: 'guildId',
        }
    },
    user: {
        type: Sequelize.STRING,
        allowNull: false
    },
    onDutyTime: {
        type: Sequelize.STRING,
        allowNull: false
    },
    offDutyTime: {
        type: Sequelize.STRING,
        allowNull: true
    },
}, { 
    initialAutoIncrement: 1
});

我收到了这个错误:

(node:213712) [SEQUELIZE0002] DeprecationWarning: The logging-option should be either a function or false. Default: console.log
(Use `node --trace-deprecation ...` to show where the warning was created)
Executing (default): DROP TABLE IF EXISTS `times`; 
Executing (default): DROP TABLE IF EXISTS `guilds`;
Executing (default): PRAGMA foreign_keys = OFF
Executing (default): DROP TABLE IF EXISTS `times`;
Executing (default): DROP TABLE IF EXISTS `guilds`;
Executing (default): PRAGMA foreign_keys = ON
Executing (default): DROP TABLE IF EXISTS `guilds`;
Executing (default): CREATE TABLE IF NOT EXISTS `guilds` (`guildId` VARCHAR(255) PRIMARY KEY, `adminChannel` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL);
Executing (default): PRAGMA INDEX_LIST(`guilds`)
Executing (default): PRAGMA INDEX_INFO(`sqlite_autoindex_guilds_1`)
Executing (default): DROP TABLE IF EXISTS `times`;
Executing (default): CREATE TABLE IF NOT EXISTS `times` (`id` INTEGER NOT NULL AUTOINCREMENT, `guildId` VARCHAR(255) NOT NULL REFERENCES `guilds` (`guildId`) ON DELETE CASCADE ON UPDATE CASCADE, `user` VARCHAR(255) NOT NULL, `onDutyTime` VARCHAR(255) NOT NULL, `offDutyTime` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`, `guildId`));
node:internal/process/promises:289
            triggerUncaughtException(err, true /* fromPromise */);
            ^

Error
    at Database.<anonymous> (D:\A - Discord Bots\DiscordBot-Template-Master\node_modules\sequelize\lib\dialects\sqlite\query.js:185:27)
    at D:\A - Discord Bots\DiscordBot-Template-Master\node_modules\sequelize\lib\dialects\sqlite\query.js:183:50
    at new Promise (<anonymous>)
    at Query.run (D:\A - Discord Bots\DiscordBot-Template-Master\node_modules\sequelize\lib\dialects\sqlite\query.js:183:12)
    at D:\A - Discord Bots\DiscordBot-Template-Master\node_modules\sequelize\lib\sequelize.js:315:28
    at async SQLiteQueryInterface.createTable (D:\A - Discord Bots\DiscordBot-Template-Master\node_modules\sequelize\lib\dialects\abstract\query-interface.js:98:12)
    at async times.sync (D:\A - Discord Bots\DiscordBot-Template-Master\node_modules\sequelize\lib\model.js:942:7)
    at async Sequelize.sync (D:\A - Discord Bots\DiscordBot-Template-Master\node_modules\sequelize\lib\sequelize.js:377:9) {
  name: 'SequelizeDatabaseError',
  parent: [Error: SQLITE_ERROR: near "AUTOINCREMENT": syntax error] {
    errno: 1,
    code: 'SQLITE_ERROR',
    sql: 'CREATE TABLE IF NOT EXISTS `times` (`id` INTEGER NOT NULL AUTOINCREMENT, `guildId` VARCHAR(255) NOT NULL REFERENCES `guilds` (`guildId`) ON DELETE CASCADE ON UPDATE CASCADE, `user` VARCHAR(255) NOT NULL, `onDutyTime` VARCHAR(255) NOT NULL, `offDutyTime` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`, `guildId`));'  
  },
  original: [Error: SQLITE_ERROR: near "AUTOINCREMENT": syntax error] {
    errno: 1,
    code: 'SQLITE_ERROR',
    sql: 'CREATE TABLE IF NOT EXISTS `times` (`id` INTEGER NOT NULL AUTOINCREMENT, `guildId` VARCHAR(255) NOT NULL REFERENCES `guilds` (`guildId`) ON DELETE CASCADE ON UPDATE CASCADE, `user` VARCHAR(255) NOT NULL, `onDutyTime` VARCHAR(255) NOT NULL, `offDutyTime` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`, `guildId`));'  
  },
  sql: 'CREATE TABLE IF NOT EXISTS `times` (`id` INTEGER NOT NULL AUTOINCREMENT, `guildId` VARCHAR(255) NOT NULL REFERENCES `guilds` (`guildId`) ON DELETE CASCADE ON UPDATE CASCADE, `user` VARCHAR(255) NOT NULL, `onDutyTime` VARCHAR(255) NOT NULL, `offDutyTime` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`, `guildId`));',   
  parameters: {}
}

Node.js v21.6.1

我希望只获取 id 列上具有自动增量的表。

javascript node.js sqlite discord.js sequelize.js
1个回答
0
投票

AUTOINCREMENT
关键字只能存在于
INTEGER PRIMARY KEY
字段中。

您的主键是由 id,guildId 组成的

复合键
,这实际上没有意义:
(1,77), (2,55), (3,33)
id
 上的索引一样唯一
1, 2, 3

id
作为您的(单数、普通)主键。
guildId
更改为常规索引列,而不是主键的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.