Sequelize.query преобразует имя таблицы в маленький символ вместо точного имени, как я указал в необработанном запросе - PullRequest
0 голосов
/ 10 апреля 2020

Ниже мой код:

 sequelize
      .query(req.body.data, {
        type: Sequelize.QueryTypes.SELECT
      })
      .then(tables => {
        res.send(tables);
      })
      .catch(function(error) {
        console.log("error", error);
        res.json(error);
      });

выше "req.body.data" = select * from frameworkPage. Но frameworkPage преобразуется в frameworkpage, когда я запускаю запрос выше, вызывая ошибку «error: отношение« frameworkpage »не существует», поскольку имя моей таблицы - frameworkPage. Что я делаю сейчас. Пожалуйста, помогите.

1 Ответ

1 голос
/ 13 апреля 2020

Я использую postgres в качестве диалекта sequelize. Имена идентификаторов и ключевых слов в PostgreSQL не чувствительны к регистру. Подробнее см. https://www.postgresql.org/docs/9.6/sql-syntax-lexical.html, Вам необходимо добавить двойную кавычку для имени таблицы.

Например, index.ts

import { sequelize } from '../../db';
import Sequelize, { Model } from 'sequelize';

class FrameworkPage extends Model {}
FrameworkPage.init({}, { sequelize, modelName: 'frameworkPage' });

(async function test() {
  try {
    // create tables
    await sequelize.sync({ force: true });
    // seed
    await FrameworkPage.create({});
    // test
    const req = { body: { data: 'select * from "frameworkPage"' } };
    const result = await sequelize.query(req.body.data, { type: Sequelize.QueryTypes.SELECT });
    console.log(result);
  } catch (error) {
    console.log(error);
  } finally {
    await sequelize.close();
  }
})();

Результаты выполнения:

Executing (default): DROP TABLE IF EXISTS "frameworkPage" CASCADE;
Executing (default): DROP TABLE IF EXISTS "frameworkPage" CASCADE;
Executing (default): CREATE TABLE IF NOT EXISTS "frameworkPage" ("id"   SERIAL , PRIMARY KEY ("id"));
Executing (default): SELECT i.relname AS name, ix.indisprimary AS primary, ix.indisunique AS unique, ix.indkey AS indkey, array_agg(a.attnum) as column_indexes, array_agg(a.attname) AS column_names, pg_get_indexdef(ix.indexrelid) AS definition FROM pg_class t, pg_class i, pg_index ix, pg_attribute a WHERE t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND t.relkind = 'r' and t.relname = 'frameworkPage' GROUP BY i.relname, ix.indexrelid, ix.indisprimary, ix.indisunique, ix.indkey ORDER BY i.relname;
Executing (default): INSERT INTO "frameworkPage" ("id") VALUES (DEFAULT) RETURNING *;
Executing (default): select * from "frameworkPage"
[ { id: 1 } ]
...