Sequelize model.sync() 抛出错误

Ikd*_*emm 1 mysql model node.js sequelize.js

我正在尝试使用sequelize 创建一个模型,然后添加,然后使用sync({force: true }) 如此处所示,使MySQL 创建表(如果不存在)。然而,它对我大喊大叫,说我的 MySQL 查询有错误(应该是由 Sequelize 生成的)。这是模型:

// admin.model.js
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = require('../db/connection');
const validator = require("validator")

const Admin = sequelize.define('Admin', {
    email: {
        type: DataTypes.STRING,
        allowNull: false,
        unique: true,
        validate(value) {
            if (!validator.isEmail(value)) {
                throw new Error('Invalid email');
            }
        },
    },
    password: {
        type: DataTypes.STRING,
        allowNull: false,
        validate(value) {
            if (!value.match(/\d/) || !value.match(/[a-zA-Z]/)) {
                throw new Error('Password must contain at least one letter and one number');
            }
        },
        private: true, // used by the toJSON plugin
    },
    firstName: {
        type: DataTypes.STRING,
        allowNull: false
    },
    lastName: {
        type: DataTypes.STRING,
        allowNull: false
    },
    phone: {
        type: DataTypes.NUMBER
    },
}, {
    freezeTableName: true
}
)

module.exports = Admin;
Run Code Online (Sandbox Code Playgroud)

这是我想要运行的函数

// sync.js
const Admin = require("../models/admin.model")

const synchronizeTables = async () => {
    try {
        await Admin.sync({ force: true })
        console.log("Admin Table synchronized")
    } catch (error) {
        console.error(error)
    }
}

module.exports = synchronizeTables
Run Code Online (Sandbox Code Playgroud)

然后我在 db 目录中有一个 index.js 文件,用于导出连接和同步:

// index.js
const db = require("./connection");
const sync = require("./sync");

module.exports = { db, sync };
Run Code Online (Sandbox Code Playgroud)

然后,我将它们导入 app.js 并运行同步

// app.js
const { db, sync } = require('./src/db');
sync()
Run Code Online (Sandbox Code Playgroud)

当我运行服务器时出现错误:

Server is up and running on port 8000
Executing (default): SELECT 1+1 AS result
Executing (default): DROP TABLE IF EXISTS `Admin`;
Connection has been established successfully.
Executing (default): CREATE TABLE IF NOT EXISTS `Admin` (`id` INTEGER NOT NULL auto_increment , `email` VARCHAR(255) NOT NULL UNIQUE, `password` VARCHAR(255) NOT NULL, `firstName` VARCHAR(255) NOT NULL, `lastName` VARCHAR(255) NOT NULL, `phone` NUMBER, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
DatabaseError [SequelizeDatabaseError]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NUMBER, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KE' at line 1
    at Query.formatError (/home/ikdem/work/upwork/saas/admin-side/node_modules/sequelize/lib/dialects/mysql/query.js:265:16)
    at Query.run (/home/ikdem/work/upwork/saas/admin-side/node_modules/sequelize/lib/dialects/mysql/query.js:77:18)
    at processTicksAndRejections (internal/process/task_queues.js:97:5) {
  parent: Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NUMBER, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KE' at line 1
      at Packet.asError (/home/ikdem/work/upwork/saas/admin-side/node_modules/mysql2/lib/packets/packet.js:712:17)
      at Query.execute (/home/ikdem/work/upwork/saas/admin-side/node_modules/mysql2/lib/commands/command.js:28:26)
      at Connection.handlePacket (/home/ikdem/work/upwork/saas/admin-side/node_modules/mysql2/lib/connection.js:425:32)
      at PacketParser.onPacket (/home/ikdem/work/upwork/saas/admin-side/node_modules/mysql2/lib/connection.js:75:12)
      at PacketParser.executeStart (/home/ikdem/work/upwork/saas/admin-side/node_modules/mysql2/lib/packet_parser.js:75:16)
      at Socket.<anonymous> (/home/ikdem/work/upwork/saas/admin-side/node_modules/mysql2/lib/connection.js:82:25)
      at Socket.emit (events.js:315:20)
      at addChunk (_stream_readable.js:295:12)
      at readableAddChunk (_stream_readable.js:271:9)
      at Socket.Readable.push (_stream_readable.js:212:10) {
    code: 'ER_PARSE_ERROR',
    errno: 1064,
    sqlState: '42000',
    sqlMessage: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NUMBER, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KE' at line 1",
    sql: 'CREATE TABLE IF NOT EXISTS `Admin` (`id` INTEGER NOT NULL auto_increment , `email` VARCHAR(255) NOT NULL UNIQUE, `password` VARCHAR(255) NOT NULL, `firstName` VARCHAR(255) NOT NULL, `lastName` VARCHAR(255) NOT NULL, `phone` NUMBER, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;',
    parameters: undefined
  },
Run Code Online (Sandbox Code Playgroud)

因此,Sequelize 生成的 SQL 查询似乎存在错误。可能是我没用对吧。请帮助 :)

Ikd*_*emm 5

所以这里的问题在于手机的数据类型。正如您所看到的,DataType.NUMBER 在查询中并没有变为 INTEGER,而是保留了 NUMBER,这在 SQL 中是不存在的。所以,我必须改变

phone: {
        type: DataTypes.NUMBER
    },
Run Code Online (Sandbox Code Playgroud)

phone: {
        type: DataTypes.INTEGER
    },
Run Code Online (Sandbox Code Playgroud)

另外,我使用sequelize.sync() 一次同步所有表,而不是逐一同步模型。