【问题标题】:single quote escape - sequelize migration单引号转义 - 续集迁移
【发布时间】:2017-04-07 07:26:40
【问题描述】:

我将 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

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案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 将 '' 更改为 '

    【讨论】:

    • 你为什么要这么做?
    • @7hibault 如果您在任何具有语法突出显示的编辑器中看到发送到服务器的查询,您会注意到撇号过早地分隔字符串:CREATE TYPE "public"."enum_Education_education_level" AS ENUM('Diploma', 'Bachelor's Degree', 'Master's Degree', 'Doctorate Degree');。第一个转义用于使用的编程语言,第二个用于 PostgreSQL 服务器。
    • @7hibault 欢迎您。我已经编辑了我的答案,更详细地解释了为什么需要这样做以及它是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2018-01-29
    • 2014-05-03
    相关资源
    最近更新 更多