Feathers и Sequelize ошибки SQL Server

Я сталкиваюсь с несколькими ошибками сервера sql, пытаясь начать работу с простым API-интерфейсом для отдыха, используя перья js и сиквелиз. Я использую версию SQL Server 2012 (экспресс).

Сначала мой код:

const { db } = require('../database');
const Sequelize = require('sequelize');
const service = require('feathers-sequelize');
const app = require('../app');

const Model = db.define('workorder', {
  id: { type: Sequelize.INTEGER, primaryKey: true },
  created_by: Sequelize.STRING,
  modified_by: Sequelize.STRING,

  status_name: Sequelize.STRING,
  date_completed: Sequelize.DATE,
  category: Sequelize.STRING,
  location: Sequelize.STRING,
  details: Sequelize.TEXT,
  crew_name: Sequelize.STRING,
  assigned_to: Sequelize.STRING,
}, {
  schema: 'dbo',
  freezeTableName: true,
  createdAt: 'date_created',
  updatedAt: 'date_modified',
});

app.use('/api/workorders', service({
  Model,
  id: 'id',
  paginate: {
    default: 10,
    max: 100,
  },
}));

Когда я нажимаю на конечную точку API /api/workorders, возникает ошибка:

SequelizeDatabaseError: Недопустимое использование параметра NEXT в операторе FETCH.

Я вижу, что sql сгенерировал:

 Executing (default): SELECT [id], [created_by], [modified_by], [status_name], [date_completed], [category], [location], [details], [crew_name], [assigned_to], [date_created], [date_modified] FROM [dbo].[workorder] AS [workorder] OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;

Кажется, что сервер sql требует некоторого предложения ORDER BY. Поэтому я попытался отправить параметр в конечную точку /api/workorders?$sort=id

Это также приводит к ошибкам:

SequelizeDatabaseError: недопустимое имя столбца «1».

Сгенерированный SQL выглядит следующим образом:

Executing (default): SELECT [id], [created_by], [modified_by], [status_name], [date_completed], [category], [location], [details], [crew_name], [assigned_to], [date_created], [date_modified] FROM [dbo].[workorder] AS [workorder] ORDER BY [workorder].[0] DESC, [workorder].[1] DESC OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;

Эта ошибка более очевидна, нет столбцов 1 или 0.

Кто-нибудь сталкивался с этими проблемами раньше?


person twoLeftFeet    schedule 10.01.2018    source источник


Ответы (2)


Похоже, это несовместимость Sequelize со старыми версиями сервера MSSQL, как указано в этой проблеме< /а>. Специфическое решение Feathers упоминается в этом комментарии к проблеме для добавления $sort и $limit как это:

query: {
        $limit: 5,
        $sort: {createdAt: -1}
      }
person Daff    schedule 11.01.2018
comment
Хорошо, я думаю, что в этой проблеме упоминается sql server 2008. 2012 (это то, что я использую) поддерживает FETCH. Поэтому мне просто нужно добавлять параметр $sort каждый раз, когда я отправляю запрос, это то, что я вижу. Но похоже, что при работе с сортировкой возникают более глубокие проблемы, поскольку Sequelize пытается выбрать столбцы 0 и 1, которых не существует. Есть ли лучше поддерживаемая форма в перьях для сервера sql, о которой вы знаете? - person twoLeftFeet; 11.01.2018
comment
Я считаю, что KneJS (feathers-knex) также поддерживает MSSQL. Также может быть ошибка в адаптере feathers-sequelize, но я не думаю, что он делает что-то необычное. К сожалению, у нас нет простого способа проверить это с помощью MSSQL. - person Daff; 11.01.2018
comment
Да, это имеет смысл. К сожалению, мы застряли с сервером sql из-за некоторых других программных зависимостей. Я рассмотрю другие интеграции перьев (knex), чтобы попробовать. Спасибо! - person twoLeftFeet; 11.01.2018

Как упоминает Дафф, я также обнаружил, что для SQL Server 2014 Sequelize по-прежнему не генерирует код, совместимый с MSSQL 2014. Итак, учитывая предложение здесь указать версию MSSQL менее 11.0.0, я несколько произвольно указал версию базы данных 10.0.0.

Это сработало для меня - теперь Sequelize генерирует код tsql, совместимый с 2014 (и более ранними версиями). Я внес изменение в свойство databaseVersion в объекте параметров, переданном при создании экземпляра Sequelize в файле 'sequelize.js', сгенерированном из перьев-кли, следующим образом:

const sequelize = new Sequelize(database, username, password, {
  dialect: 'mssql',
  host: hostname,
  logging: console.log,
  define: {
    freezeTableName: true
  },
  // from https://github.com/sequelize/sequelize/issues/4404
  // use earlier SQL Server version to assure tsql compatible code generation
  databaseVersion: '10.0.0' 
});
person ElliotPsyIT    schedule 16.01.2018