0

私はいくつかのSQLサーバーエラーに遭遇しています.feathers jsとsequelizeを使用して単純なrest APIを使い始めようとしています. SQL Server 2012 (express) バージョンを使用しています。

最初に私のコード:

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: FETCH ステートメントでのオプション NEXT の使用法が無効です。

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 Server には 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 はありません。

以前にこれらの問題に遭遇した人はいますか?

4

2 に答える 2

2

Daff が参照しているように、私も SQL Server 2014 の場合、Sequelize が MSSQL 2014 互換コードを生成しないことを発見しました。したがって、 11.0.0 より前のバージョンの MSSQL を指定するよう ここで提案されているので、私はやや恣意的に 10.0.0 のデータベース バージョンを指定しました。

これは私にとってはうまくいきました-Sequelizeは2014年(およびそれ以前)と互換性のあるtsqlコードを生成するようになりました。次のように、feathers-cli から生成された「sequelize.js」ファイルで Sequelize インスタンスを生成するときに渡される options オブジェクトの databaseVersion プロパティを変更しました。

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' 
});
于 2018-01-16T16:45:06.367 に答える