Knex: ๋ณต์†Œ์ˆ˜ ํ•ฉ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•

์— ๋งŒ๋“  2016๋…„ 08์›” 04์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: knex/knex

_(์ฐธ๊ณ : ์ €๋Š” Postgres๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ๋ฐฉ์–ธ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)_

ํ‰๊ท  ์ ์ˆ˜์™€ ํ€ด์ฆˆ๋ฅผ ํ†ต๊ณผํ•œ ์‚ฌ๋žŒ์˜ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋‚ด๊ฐ€ํ•˜๋ ค๋Š” ์ž‘์—…์˜ ๋‹จ์ˆœํ™” ๋œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

knex( 'quiz_submissions AS qs' )
        .select( 'q.name AS quiz_name' )
        .avg( 'qs.score' )
        .sum( '(case when qs.score >= 60 then 1 else 0 end) AS passedCount' )
        .innerJoin( 'quizzes AS q', 'q.id', 'qs.quiz_id' )
        .groupBy( 'q.name' );

( sum ์ฐธ๊ณ )

๋ถˆํ–‰ํžˆ๋„ ์˜ˆ์ƒ๋Œ€๋กœ SUM ๊ธฐ๋Šฅ์„ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

sum("(case when qs"."score >= 60 then 1 else 0 end)") as "passedCount"
  1. ํ˜„์žฌ "๋ณต์žกํ•œ" ํ•ฉ๊ณ„๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?
  2. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด sumRaw ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

#238์—์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. $#$ sum select ์—์„œ knex.raw ๋ฅผ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค. ์ง€๊ธˆ ์“ฐ๋‹ค๋ณด๋‹ˆ ๋ป”ํ•œ๋“ฏ...

knex( 'quiz_submissions AS qs' )
    .select( 'q.name AS quiz_name', knex.raw( 'SUM(case when qs.score >= 60 then 1 else 0 end) AS passedCount' ) )
    .avg( 'qs.score' )
    .innerJoin( 'quizzes AS q', 'q.id', 'qs.quiz_id' )
    .groupBy( 'q.name' );

๋ชจ๋“  3 ๋Œ“๊ธ€

knex.raw ๋กœ sum ์— ์ธ์ˆ˜๋ฅผ ๋ž˜ํ•‘ํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ... ํ•ฉ๊ณ„๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜๋ฉด :

.sum( knex.raw( '(case when qs.score >= 60 then 1 else 0 end) AS passedCount' ) )

"val.toLowerCase๊ฐ€ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค" ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

( as ๋ณ„์นญ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ๋นผ์„œ ๊ด„ํ˜ธ๋กœ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์˜ค๋ฅ˜๋Š” ๋งค๋ฒˆ ๋™์ผํ–ˆ์Šต๋‹ˆ๋‹ค)

์Šคํƒ ์ถ”์ :

TypeError: val.toLowerCase is not a function
    at QueryCompiler_PG.aggregate (../../src/query/compiler.js:166:25)
    at QueryCompiler_PG.columns (../../src/query/compiler.js:152:25)
    at ../../src/query/compiler.js:82:22
    at Array.map (native)
    at QueryCompiler_PG.select (../../src/query/compiler.js:81:35)
    at QueryCompiler_PG.toSQL (../../src/query/compiler.js:45:5)
    at QueryBuilder.toSQL (../../src/query/builder.js:41:49)
    at ../src/runner.js:34:7
    at tryCatcher (util.js:16:23)
    at using.js:185:26
    at tryCatcher (util.js:16:23)
    at Promise._settlePromiseFromHandler (promise.js:504:31)
    at Promise._settlePromise (promise.js:561:18)
    at Promise._settlePromise0 (promise.js:606:10)
    at Promise._settlePromises (promise.js:685:18)
    at Promise._fulfill (promise.js:630:18)
From previous event:
    at Promise.longStackTracesCaptureStackTrace [as _captureStackTrace] (debuggability.js:369:19)
    at Promise._then (promise.js:230:17)
    at Promise.then (promise.js:123:17)
    at Function.Promise.using (using.js:169:14)
    at Runner.run (../src/runner.js:27:20)
    at QueryBuilder.Target.then (../src/interface.js:22:50)
    at process._tickCallback (node.js:369:9)

knex ๋ฒ„์ „์€ 0.11.7์ด์ง€๋งŒ 0.11.9๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ๋Š”๋ฐ ๋™์ผํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

#238์—์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. $#$ sum select ์—์„œ knex.raw ๋ฅผ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค. ์ง€๊ธˆ ์“ฐ๋‹ค๋ณด๋‹ˆ ๋ป”ํ•œ๋“ฏ...

knex( 'quiz_submissions AS qs' )
    .select( 'q.name AS quiz_name', knex.raw( 'SUM(case when qs.score >= 60 then 1 else 0 end) AS passedCount' ) )
    .avg( 'qs.score' )
    .innerJoin( 'quizzes AS q', 'q.id', 'qs.quiz_id' )
    .groupBy( 'q.name' );
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰