node.js - 单引号转义 - sequelize 迁移

标签 node.js postgresql sequelize.js

我将 NodeJSSequelize ORMPostgress 数据库一起使用 我正在使用迁移文件在表中创建名为 education_levelENUM 列,枚举值(学士学位)有单引号,当我尝试运行迁移时它给出以下错误, 谢谢帮忙!

迁移文件

'use strict';
module.exports = {
  up: function(queryInterface, Sequelize) {
    return queryInterface.createTable('Education', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      school: {
        type: Sequelize.STRING
      },
      degree: {
        type: Sequelize.STRING
      },
      field_of_study: {
        type: Sequelize.STRING
      },
      year_started: {
        type: Sequelize.STRING(4)
      },
      year_graduated: {
        type: Sequelize.STRING(4)
      },
      education_level: {
        type: Sequelize.ENUM,
        values: ['Diploma','Bachelor\'s Degree','Master\'s Degree','Doctorate Degree'],
      },
      profile_id: {
        type: Sequelize.INTEGER,
        allowNull: true
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: function(queryInterface, Sequelize) {
    return queryInterface.dropTable('Education');
  }
};

错误

{ SequelizeBaseError: syntax error at or near "s"
migrate_1        |     at Query.formatError (/usr/src/app/node_modules/sequelize/lib/dialects/postgres/query.js:357:14)
migrate_1        |     at Query.<anonymous> (/usr/src/app/node_modules/sequelize/lib/dialects/postgres/query.js:88:19)
migrate_1        |     at emitOne (events.js:96:13)
migrate_1        |     at Query.emit (events.js:191:7)
migrate_1        |     at Query.handleError (/usr/src/app/node_modules/pg/lib/query.js:108:8)
migrate_1        |     at Connection.<anonymous> (/usr/src/app/node_modules/pg/lib/client.js:171:26)
migrate_1        |     at emitOne (events.js:96:13)
migrate_1        |     at Connection.emit (events.js:191:7)
migrate_1        |     at Socket.<anonymous> (/usr/src/app/node_modules/pg/lib/connection.js:109:12)
migrate_1        |     at emitOne (events.js:96:13)
migrate_1        |     at Socket.emit (events.js:191:7)
migrate_1        |     at readableAddChunk (_stream_readable.js:176:18)
migrate_1        |     at Socket.Readable.push (_stream_readable.js:134:10)
migrate_1        |     at TCP.onread (net.js:563:20)
migrate_1        |   name: 'SequelizeDatabaseError',
migrate_1        |   message: 'syntax error at or near "s"',
migrate_1        |   parent:
migrate_1        |    { error: syntax error at or near "s"
migrate_1        |        at Connection.parseE (/usr/src/app/node_modules/pg/lib/connection.js:539:11)
migrate_1        |        at Connection.parseMessage (/usr/src/app/node_modules/pg/lib/connection.js:366:17)
migrate_1        |        at Socket.<anonymous> (/usr/src/app/node_modules/pg/lib/connection.js:105:22)
migrate_1        |        at emitOne (events.js:96:13)
migrate_1        |        at Socket.emit (events.js:191:7)
migrate_1        |        at readableAddChunk (_stream_readable.js:176:18)
migrate_1        |        at Socket.Readable.push (_stream_readable.js:134:10)
migrate_1        |        at TCP.onread (net.js:563:20)
migrate_1        |      name: 'error',
migrate_1        |      length: 90,
migrate_1        |      severity: 'ERROR',
migrate_1        |      code: '42601',
migrate_1        |      detail: undefined,
migrate_1        |      hint: undefined,
migrate_1        |      position: '84',
migrate_1        |      internalPosition: undefined,
migrate_1        |      internalQuery: undefined,
migrate_1        |      where: undefined,
migrate_1        |      schema: undefined,
migrate_1        |      table: undefined,
migrate_1        |      column: undefined,
migrate_1        |      dataType: undefined,
migrate_1        |      constraint: undefined,
migrate_1        |      file: 'scan.l',
migrate_1        |      line: '1086',
migrate_1        |      routine: 'scanner_yyerror',
migrate_1        |      sql: 'CREATE TYPE "public"."enum_Education_education_level" AS ENUM(\'Diploma\', \'Bachelor\'s Degree\', \'Master\'s Degree\', \'Doctorate Degree\');' },
migrate_1        |   original:
migrate_1        |    { error: syntax error at or near "s"
migrate_1        |        at Connection.parseE (/usr/src/app/node_modules/pg/lib/connection.js:539:11)
migrate_1        |        at Connection.parseMessage (/usr/src/app/node_modules/pg/lib/connection.js:366:17)
migrate_1        |        at Socket.<anonymous> (/usr/src/app/node_modules/pg/lib/connection.js:105:22)
migrate_1        |        at emitOne (events.js:96:13)
migrate_1        |        at Socket.emit (events.js:191:7)
migrate_1        |        at readableAddChunk (_stream_readable.js:176:18)
migrate_1        |        at Socket.Readable.push (_stream_readable.js:134:10)
migrate_1        |        at TCP.onread (net.js:563:20)
migrate_1        |      name: 'error',
migrate_1        |      length: 90,
migrate_1        |      severity: 'ERROR',
migrate_1        |      code: '42601',
migrate_1        |      detail: undefined,
migrate_1        |      hint: undefined,
migrate_1        |      position: '84',
migrate_1        |      internalPosition: undefined,
migrate_1        |      internalQuery: undefined,
migrate_1        |      where: undefined,
migrate_1        |      schema: undefined,
migrate_1        |      table: undefined,
migrate_1        |      column: undefined,
migrate_1        |      dataType: undefined,
migrate_1        |      constraint: undefined,
migrate_1        |      file: 'scan.l',
migrate_1        |      line: '1086',
migrate_1        |      routine: 'scanner_yyerror',
migrate_1        |      sql: 'CREATE TYPE "public"."enum_Education_education_level" AS ENUM(\'Diploma\', \'Bachelor\'s Degree\', \'Master\'s Degree\', \'Doctorate Degree\');' },
migrate_1        |   sql: 'CREATE TYPE "public"."enum_Education_education_level" AS ENUM(\'Diploma\', \'Bachelor\'s Degree\', \'Master\'s Degree\', \'Doctorate Degree\');' }
api_migrate_1 exited with code 1

最佳答案

您需要用另一个单引号转义该单引号。所以也许这会起作用:

education_level: {
    type: Sequelize.ENUM,
    values: ['Diploma','Bachelor\'\'s Degree','Master\'\'s Degree','Doctorate Degree'],
  },

解释

发送到服务器的初始查询:

CREATE TYPE "public"."enum_Education_education_level" AS ENUM(
  'Diploma', 'Bachelor's Degree', 'Master's Degree', 'Doctorate Degree'
);

正如您通过语法着色所见,它不会将 'Bachelor's Degree' 视为单个字符串,而是将 'Bachelor's Degree '。发生这种情况是因为转义的撇号用于为 JavaScript 构建字符串(撇号用反斜杠转义)。它不会为 PostgreSQL 转义字符串。

为了解决这个问题,我们需要在 PostgreSQL 端转义撇号,因为 PostgreSQL 使用撇号转义撇号,我们的目标是:

CREATE TYPE "public"."enum_Education_education_level" AS ENUM(
  'Diploma', 'Bachelor''s Degree', 'Master''s Degree', 'Doctorate Degree'
);

因此,在 JavaScript 方面,我们使用两个转义的撇号 'Bachelor\'\'s Degree' 构造字符串。 JavaScript 将 \'\' 更改为 '' 并将 PostgreSQL '' 更改为 '

关于node.js - 单引号转义 - sequelize 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43272128/

相关文章:

jquery - 错误 : Cannot find module 'jquery' on require. 解析 ('jquery' ) webpack

javascript - 缺少回调时 `await promisify(setTimeout)(ms)` 是如何工作的?

javascript - 在页面加载之前加载数据 AngularJS 和 NodeJS

java - 如何提高PostgreSQL数据库中海量数据的查询效率?

postgresql - PostgreSQL 中基于游标的记录

Node.js Sequelize 返回日期减去 1 天

javascript - Nodejs GET REST API 和频繁访问 MongoDb 数据库

java - Postgres : How to get SELECT to detect new insertions within a specific table

javascript - 在 Sequelize 中减去 2 个字段

electron - 导入sequelize时的循环依赖