Читая документацию на knex и обманутую страницу, я обнаружил, что в приведенных примерах. .where()
всегда вызывается сразу после ссылки на таблицу:
knex('users')
.where({ id: 2 })
.update({ name: 'Homer' })
// UPDATE 'users' SET 'name'='Homer' WHERE 'id'=2
Вышеприведенный код выглядит логичным, потому что полный набор данных сужен до запуска .update()
.
Что меня смутило, так это то, что методы обмена производят один и тот же SQL-запрос:
knex('users')
.update({ name: 'Homer' })
.where({ id: 2 })
// UPDATE 'users' SET 'name'='Homer' WHERE 'id'=2
новичок может интуитивно ожидать, что WHERE
будет применяться после того, как UPDATE
будет выполнен, аналогично методам массива javascript.
Попытка других примеров, таких как knex.select().table('books')
, экспериментально, я выяснил, что построитель запросов просто "собирает" все методы между knex
и .then()
(или в конце инструкции) и составляет их в один запрос и запускает его.
Я был бы полностью удовлетворен, если кто-то подтвердит вышеуказанное выражение ссылкой на документацию или какой-либо другой ресурс knex.
Обычно построитель запросов собирает все вызванные вызовы вызываемого метода, и порядок их вызова не имеет значения. Это связано с тем, что сгенерированный SQL не может быть сгенерирован в каком-либо другом порядке.
Однако есть некоторые методы, когда порядок их вызова действительно имеет значение. Наиболее заметны с помощью .clearSelect
, .clearWhere
и .clearOrder
методы http://knexjs.org/#Builder-clear
Также, когда несколько столбцов являются обновлениями в одном заявлении, порядок обновлений фактически отражает порядок вывода операторов SET
.
Вероятно, есть и другие тонкости, где порядок имеет значение, но я не верю, что кто-то их проследил.