2015-06-03 2 views
4

Я использую Sequelize с утомительным для доступа к SQL Server 2008.Утомительная или Sequelize использует неправильный синтаксис `findOne()`

Когда я делаю sequelizeModel.findOne() я получаю это исключение -

Unhandled rejection SequelizeDatabaseError: Invalid usage of the option NEXT in the FETCH statement.

I знаете, что SQL Server 2008 не поддерживает OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY, и поэтому исключение выбрано.

Но я также явно установил tdsVersion в нудных вариантах: 7_3_B.

Как описано здесь -
http://pekim.github.io/tedious/api-connection.html

Я пробовал все версии TdS и синтаксис запроса, который генерируется всегда содержит синтаксис FETCH/NEXT.

Я что-то упустил?

Не должен ли синтаксис быть конкретным для версии tds?

Я также подтвердил, что опция tdsVersion успешно передается в утомительную библиотеку соединений из sequelize.

Пример синтаксиса запроса генерируется -

SELECT 
    [id], [FIRST_NAME], [LAST_NAME] 
FROM 
    [USERs] AS [USERS] 
ORDER BY 
    [id] 
    OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY; 
+1

вы когда-нибудь выясню? Я на той же лодке, что и ты. –

+1

@Marc - я не нашел разрешения, поэтому я закончил использование 'findAll()', а затем взял первый результат. – Jeremy

ответ

4

Это вопрос в Sequelize - он использует OFFSET FETCH синтаксис, который поддерживается только в SQL Server 2012 и более поздней версии.

Я представил это как вопрос о GitHub: https://github.com/sequelize/sequelize/issues/4404

Проблема также влияет на метод findById. Обойти этот метод заключается в использовании findAll с where указать идентификатор, и просто использовать только первый элемент из возвращенного массива:

Thing.findAll({ 
    where: {id: id} 
}).then(function(things) { 
    if (things.length == 0) { 
    // handle error 
    } 
    doSomething(things[0]) 
}).catch(function(err) { 
    // handle error 
}); 
+2

Это происходит со мной: 'findAll ({limit: 10, offset: 10})' потому что он использует Fetch и Next для paginate, но я получаю ошибку с момента использования msssql 2008 – user1576978

+0

Я получаю ту же ошибку в SQL 2012, и проблема решена с помощью findAll. Ну что, как поживаешь? почему он не работает в 2012 году? – BelgoCanadian

+0

То же самое здесь, используя sql 2012 и не работает –

0

Если вы можете изменить библиотеку sequelize в узле модулях. Пожалуйста, выполните следующие действия: Goto Node_modules -> sequelize -> LIB -> MSSQL -> запросов generator.js

Вы найдете эту строку:

fragment += ' OFFSET ' + this.escape(offset) + ' ROWS';

Добавить строку над ним:

fragment += ' ORDER BY ' + this.quoteTable(options.tableAs || model.name) + '.' + this.quoteIdentifier(model.primaryKeyField);

Это должно выглядеть следующим образом:

fragment += ' ORDER BY ' + this.quoteTable(options.tableAs || model.name) + '.' + this.quoteIdentifier(model.primaryKeyField);

fragment += ' OFFSET ' + this.escape(offset) + ' ROWS';

Смежные вопросы