0

我遇到了几个 sql server 错误,尝试使用羽毛 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

如本期所述,这似乎是 Sequelize 与旧版本的 MSSQL 服务器不兼容。此问题评论$sort中提到的羽毛特定解决方案添加$limit如下:

query: {
        $limit: 5,
        $sort: {createdAt: -1}
      }
于 2018-01-11T06:04:38.043 回答
2

正如 Daff 所引用的,我也发现对于 SQL Server 2014,Sequelize 仍然没有生成与 MSSQL 2014 兼容的代码。所以,鉴于这里建议指定低于 11.0.0 的 MSSQL 版本,我有点武断地指定了 10.0.0 的数据库版本。

这对我有用 - Sequelize 现在生成 2014(及更早)兼容的 tsql 代码。我在从 feathers-cli 生成的“sequelize.js”文件中生成 Sequelize 实例时传递的选项对象中的 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 回答