Sequelize抱怨"滥用聚合:SUM()"在原始查询中使用双引号和单引号时

时间:2017-05-03 18:27:17

标签: sql node.js sqlite sequelize.js

当我在DB Browser for SQLite中运行此查询时:

SELECT week
, SUM (CASE when activityType = 'rockclimbing' then elapsedTime else 0 END) AS rockclimbing
, SUM (CASE when activityType = 'hike' then elapsedTime else 0 END) AS hike
, SUM (CASE when activityType = 'run' then elapsedTime else 0 END) AS run
FROM activity
WHERE year=2016
AND activityType IN ('rockclimbing', 'hike', 'run')
GROUP BY week
ORDER BY week;

它返回我要查找的数据:

week rockclimbing hike run

"1" "0" "0" "2.09"

"2" "0" "0" "4.63"

"3" "0" "0" "7.22"

"4" "0" "0" "2.94"

"5" "0" "0" "5.59"

(忽略"引号"。随后复制/粘贴包含它们的数据。)

然而,当我使用.query()将此查询传递给Sequelize时,我收到错误:misuse of aggregate: SUM()

这是我的Sequelize代码:

sequelize.query('SELECT week, SUM (CASE when activityType = "rockclimbing" then elapsedTime else 0 END) AS rockclimbing, SUM (CASE when activityType = "hike" then elapsedTime else 0 END) AS hike, SUM (CASE when activityType = "run" then elapsedTime else 0 END) AS run FROM activity WHERE year=2016 AND activityType IN ("rockclimbing", "hike", "run") GROUP BY week ORDER BY week;', { model: Activity }).then(...etc..).catch(...etc...);

以下是Sequelize生成的查询并在我的控制台中输出:

Executing (default): SELECT week, SUM (CASE when activityType = "rockclimbing" then elapsedTime else 0 END) AS rockclimbing, SUM (CASE when activityType = "hike" then elapsedTime else 0 END) AS hike, SUM (CASE when activityType = "run" then elapsedTime else 0 END) AS run FROM activity WHERE year=2016 AND activityType IN ("rockclimbing", "hike", "run") GROUP BY week ORDER BY week;

我的JavaScript .catch()错误并将其记录到控制台:

.catch(function(err) {
  console.log('Error! ', err);
});

所以我看到这个错误对象已经注销到我的控制台:

{ SequelizeDatabaseError: SQLITE_ERROR: misuse of aggregate: SUM()
    at Query.formatError (/xxx/xxx/project_name/node_modules/sequelize/lib/dialects/sqlite/query.js:348:14)
    at afterExecute (/xxx/xxx/project_name/node_modules/sequelize/lib/dialects/sqlite/query.js:112:29)
    at replacement (/xxx/xxx/project_name/node_modules/sqlite3/lib/trace.js:19:31)
    at Statement.errBack (/xxx/xxx/project_name/node_modules/sqlite3/lib/sqlite3.js:16:21)
  name: 'SequelizeDatabaseError',
  message: 'SQLITE_ERROR: misuse of aggregate: SUM()',
  parent: 
   { Error: SQLITE_ERROR: misuse of aggregate: SUM()
       at Error (native)
     errno: 1,
     code: 'SQLITE_ERROR',
     sql: 'SELECT week, SUM (CASE when activityType = "rockclimbing" then elapsedTime else 0 END) AS rockclimbing, SUM (CASE when activityType = "hike" then elapsedTime else 0 END) AS hike, SUM (CASE when activityType = "run" then elapsedTime else 0 END) AS run FROM activity WHERE year=2016 AND activityType IN ("rockclimbing", "hike", "run") GROUP BY week ORDER BY week;' },
  original: 
   { Error: SQLITE_ERROR: misuse of aggregate: SUM()
       at Error (native)
     errno: 1,
     code: 'SQLITE_ERROR',
     sql: 'SELECT week, SUM (CASE when activityType = "rockclimbing" then elapsedTime else 0 END) AS rockclimbing, SUM (CASE when activityType = "hike" then elapsedTime else 0 END) AS hike, SUM (CASE when activityType = "run" then elapsedTime else 0 END) AS run FROM activity WHERE year=2016 AND activityType IN ("rockclimbing", "hike", "run") GROUP BY week ORDER BY week;' },
  sql: 'SELECT week, SUM (CASE when activityType = "rockclimbing" then elapsedTime else 0 END) AS rockclimbing, SUM (CASE when activityType = "hike" then elapsedTime else 0 END) AS hike, SUM (CASE when activityType = "run" then elapsedTime else 0 END) AS run FROM activity WHERE year=2016 AND activityType IN ("rockclimbing", "hike", "run") GROUP BY week ORDER BY week;' }

这是什么问题?为什么此查询在数据库浏览器中有效但在我的应用程序中无效?

我在发布此问题之前搜索了Internet和Stackoverflow。虽然some questions did touch on my issue当我尝试时没有任何建议/解决方案帮助我/工作。

1 个答案:

答案 0 :(得分:2)

这里有一些细微差别,其中一个很重要:我在javascript中转换了'"个字符。

> Executing (default): SELECT * FROM `activity`
[ { activityType: 'rockclimbing',
    year: 2017,
    week: 1,
    elapsedTime: 1.2345 },
  { activityType: 'rockclimbing',
    year: 2017,
    week: 2,
    elapsedTime: 1.2345 },
  { activityType: 'rockclimbing',
    year: 2017,
    week: 3,
    elapsedTime: 66.45 },
  { activityType: 'hike', year: 2017, week: 1, elapsedTime: 1.2345 },
  { activityType: 'hike',
    year: 2017,
    week: 2,
    elapsedTime: 3.141592 },
  { activityType: 'hike', year: 2017, week: 3, elapsedTime: -1 },
  { activityType: 'hike', year: 2017, week: 4, elapsedTime: 10000 },
  { activityType: 'run', year: 2017, week: 4, elapsedTime: 10 },
  { activityType: 'run', year: 2017, week: 5, elapsedTime: 100 },
  { activityType: 'run', year: 2017, week: 6, elapsedTime: 1000 } ]

> sequelize.query("SELECT week, SUM (CASE when activityType = 'rockclimbing' then elapsedTime else 0 END) AS rockclimbing, SUM (CASE when activityType = 'hike' then elapsedTime else 0 END) AS hike, SUM (CASE when activityType = 'run' then elapsedTime else 0 END) AS run FROM activity     WHERE year=2017 AND activityType IN ('rockclimbing', 'hike', 'run') GROUP BY week ORDER BY week", { type: sequelize.QueryTypes.SELECT}).then(function(activities) {console.log(activities)})
Promise {
  _bitField: 0,
  _fulfillmentHandler0: undefined,
  _rejectionHandler0: undefined,
  _promise0: undefined,
  _receiver0: undefined }
> Executing (default): SELECT week, SUM (CASE when activityType = 'rockclimbing' then elapsedTime else 0 END) AS rockclimbing, SUM (CASE when activityType = 'hike' then elapsedTime else 0 END) AS hike, SUM (CASE when activityType = 'run' then elapsedTime else 0 END) AS run FROM     activity WHERE year=2017 AND activityType IN ('rockclimbing', 'hike', 'run') GROUP BY week ORDER BY week

结果:

[ { week: 1, rockclimbing: 1.2345, hike: 1.2345, run: 0 },
  { week: 2, rockclimbing: 1.2345, hike: 3.141592, run: 0 },
  { week: 3, rockclimbing: 66.45, hike: -1, run: 0 },
  { week: 4, rockclimbing: 0, hike: 10000, run: 10 },
  { week: 5, rockclimbing: 0, hike: 0, run: 100 },
  { week: 6, rockclimbing: 0, hike: 0, run: 1000 } ]

DDL& DML:

sqlite> create table activity ( activityType varchar(20), year int, week int, elapsedTime float);
sqlite> insert into activity values ('rockclimbing',2017,1,1.2345);
sqlite> insert into activity values ('rockclimbing',2017,2,1.2345);
sqlite> insert into activity values ('rockclimbing',2017,3,66.45);
sqlite> insert into activity values ('hike',2017,1,1.2345);
sqlite> insert into activity values ('hike',2017,2,3.141592);
sqlite> insert into activity values ('hike',2017,3,-1);
sqlite> insert into activity values ('hike',2017,4,10000);
sqlite> insert into activity values ('run',2017,4,10);
sqlite> insert into activity values ('run',2017,5,100);
sqlite> insert into activity values ('run',2017,6,1000);

SQLite期待单引号,并且似乎抛出了错误的错误。

> sequelize.query('SELECT week, SUM (CASE when activityType = "rockclimbing" then elapsedTime else 0 END) AS rockclimbing, SUM (CASE when activityType = "hike" then elapsedTime else 0 END) AS hike, SUM (CASE when activityType = "run" then elapsedTime else 0 END) AS run FROM activity     WHERE year=2017 AND activityType IN ("rockclimbing", "hike", "run") GROUP BY week ORDER BY week', { type: sequelize.QueryTypes.SELECT}).then(function(activities) {console.log(activities)})
Promise {
  _bitField: 0,
  _fulfillmentHandler0: undefined,
  _rejectionHandler0: undefined,
  _promise0: undefined,
  _receiver0: undefined }
> )Executing (default): SELECT week, SUM (CASE when activityType = "rockclimbing" then elapsedTime else 0 END) AS rockclimbing, SUM (CASE when activityType = "hike" then elapsedTime else 0 END) AS hike, SUM (CASE when activityType = "run" then elapsedTime else 0 END) AS run FROM     activity WHERE year=2017 AND activityType IN ("rockclimbing", "hike", "run") GROUP BY week ORDER BY week
Unhandled rejection SequelizeBaseError: SQLITE_ERROR: misuse of aggregate: SUM()
    at Query.formatError (/Users/bryan/node_modules/sequelize/lib/dialects/sqlite/query.js:348:14)
    at afterExecute (/Users/bryan/node_modules/sequelize/lib/dialects/sqlite/query.js:112:29)
    at Statement.errBack (/Users/bryan/node_modules/sqlite3/lib/sqlite3.js:16:21)
相关问题