Knex: ์„ ํƒ ์ฟผ๋ฆฌ์—์„œ ๋‹จ์ผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

knex์—์„œ ์„ ํƒ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

db('table_name').where({ id: 1 }).select();

๊ทธ๋Ÿฌ๋‚˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. id ์€ ๊ณ ์œ  ํ•œ ํ•„๋“œ์ด๋ฏ€๋กœ
๋‹จ์ผ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

db('table_name').where({ id: 1 }).select().then(result => result[0]);

๋‹จ์ผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” _official_ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

question

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

db('table_name').where({id: 1}).first().then((row) => row)

์ž‘๋™ํ•ด์•ผ

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

db('table_name').where({id: 1}).first().then((row) => row)

์ž‘๋™ํ•ด์•ผ

์•„, ์‹ค์ œ๋กœ first ์ด๊ณ  ๊ณ„์†ํ•ด์„œ one , selectOne ๋“ฑ์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

db ( 'table_name'). where ({id : 1}). first (); ์ด๊ฒƒ์€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ?

@ arch-mage ์ผ์น˜ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์–ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์ด๋ฅผ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ single ๊ตฌํ˜„์—์„œ๋Š” limit 2 ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. Knex์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import Knex from 'knex'

declare module 'knex' {
  interface QueryInterface {
    _method: string
    _isSelectQuery: () => boolean
    single: (columns?: string | string[], notFoundMessage?: string, notSingleMessage?: string) => Promise<any>
  }
}

Knex.QueryBuilder.extend('single', function single(
  this: Knex.QueryBuilder,
  columns: string | string[] = '*',
  notFoundMessage?: string,
  notSingleMessage?: string,
): any {
  // eslint-disable-next-line no-underscore-dangle
  if (!this._isSelectQuery() || this._method === 'first')
    // eslint-disable-next-line no-underscore-dangle
    throw new Error(`Cannot chain .single() on "${this._method}" query!`)
  // eslint-disable-next-line no-param-reassign
  if (typeof columns === 'string') columns = [columns]
  const allColumns = columns.includes('*')
  const singleColumn = !allColumns && columns.length === 1 ? columns[0] : false
  if (!allColumns) this.select(...columns)
  this.limit(2)
  return this.then((results: any[]) =>
    results.length === 1
      ? singleColumn
        ? results[0][singleColumn]
        : results[0]
      : results.length
      ? Promise.reject(notSingleMessage || `Query has more than one result: "${this.toSQL().sql}"`)
      : Promise.reject(notFoundMessage || `Query has no results: "${this.toSQL().sql}"`),
  )
} as any)

@wubzz single ๋ฉ”์„œ๋“œ๋ฅผ QueryInterface ์ถ”๊ฐ€ํ•˜๋Š” PR์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰