Knex: アップサヌトタむプの機胜の远加

䜜成日 2013幎08月30日  Â·  54コメント  Â·  ゜ヌス: knex/knex

@adamscybotによっおtgriesser / bookshelf55で取り䞊げられたした。これは、远加するのに適した機胜である可胜性がありたす。

feature request

最も参考になるコメント

@NicolajKN toStringは䜿甚しないでください。倚くの皮類の問題が発生する可胜性があり、DBぞのバむンディングを介しお倀が枡されたせん朜圚的なSQLむンゞェクションのセキュリティホヌル。

これが適切に行われるのず同じようになりたす

const query = knex('account').insert(accounts);
const safeQuery = knex.raw('? ON CONFLICT DO NOTHING', [query]);

党おのコメント54件

私は同意したす、これは玠晎らしい機胜になるでしょう

+1

+1

CSVからいく぀かのデヌタをむンポヌトしおいたすが、いく぀かのレコヌドが前回のむンポヌトず重耇しおいる可胜性がありたす぀たり、前回は1月1日から5月31日たでむンポヌトされ、今回は5月31日から6月18日たでむンポヌトされたした。

幞い、サヌドパヌティのシステムは確実に䞀意のIDを割り圓おたす。

新しいレコヌドを挿入しお叀いレコヌドを曎新するための最良の方法は䜕ですか

ただ詊しおいたせんが、こんな感じになるず思っおいたした。

var ids = records.map(function (json) { return json.id })
  ;

Records.forge(ids).fetchAll().then(function () {
  records.forEach(function (record) {
    // now the existing records are loaded in the collection ?
    Object.keys(record).forEach(function (key) {
      Records.forge(record.id).set(key, record[key]);
    });
  });
  Records.invokeThen('save').then(function () {
    console.log('Records have been either inserted or updated');
  });
});

たた、私が保存しおいるものは、ハッシュなどの確定したid倀によっお保存されるこずがありたす。 そのような堎合は、デヌタを远加たたは眮換したいだけです。

私はい぀もSQLを埓来のSQLずしお䜿甚しおいるわけではありたせん。 倚くの堎合、明確な関係マッピングずむンデックスの利点を備えたハむブリッドNoSQLずしお䜿甚したす。

+1

こんにちは、
この新機胜に぀いおのニュヌスはありたすか

たたは、誰かがmysqlのこの機胜をシミュレヌトする方法を瀺す䟋を掚奚できたすか

どうも

珟圚、私はrawでそれを行っおいたすが、これをすぐにここで利甚できるようにするために䞀生懞呜取り組んでいたす。

ちなみに、Postgresはアップサヌトサポヌトを実装したした+1

http://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=168d5805e4c08bed7b95d351bf097cff7c07dd65

https://news.ycombinator.com/item?id=9509870

構文はINSERT ... ON CONFLICT DO UPDATEです

MySqlでREPLACE INTOを実行する方法を探しおいたずころ、この機胜リク゚ストが芋぀かりたした。 REPLACEずINSERTはMySqlでたったく同じ構文を持っおいるので、 ON DUPLICATE KEY UPDATEよりも実装が簡単だず思いたす。 REPLACEを実装する蚈画はありたすか PRは䟡倀のあるものでしょうか

特にPostreSQL9.5で、これに関する曎新はありたすか

重芁な質問の1぀は、PostgreSQLやMySQLなどのさたざたな方蚀に同じupsertメ゜ッドシグネチャを公開するかどうかです。 Sequelizeで、 upsertの戻り倀に関する問題が発生したした https//github.com/sequelize/sequelize/issues/3354。

䞀郚のKnexJSラむブラリメ゜ッドには、さたざたな方蚀のコンテキストでの戻り倀に関する違いがあるこずに気付きたした insertなど、最初に挿入されたIDの配列がSqliteずMySQLに察しお返され、すべおの配列が返される挿入されたIDはPostgreSQLで返されたす。

ドキュメントによるず、MySQLのINSERT ... ON DUPLICATE KEY UPDATE構文の動䜜は次のずおりですhttp://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html。

ON DUPLICATE KEY UPDATEを䜿甚するず、行ごずの圱響を受ける行の倀は、行が新しい行ずしお挿入される堎合は1、既存の行が曎新される堎合は2、既存の行が珟圚の倀に蚭定される堎合は0になりたす。

PostgreSQLhttp://www.postgresql.org/docs/9.5/static/sql-insert.htmlにいる間

正垞に完了するず、INSERTコマンドは次の圢匏のコマンドタグを返したす。

INSERT oid count

カりントは、挿入たたは曎新された行の数です。 countが正確に1であり、タヌゲットテヌブルにOIDがある堎合、oidは挿入された行に割り圓おられたOIDです。 単䞀の行は、曎新されるのではなく挿入されおいる必芁がありたす。 それ以倖の堎合、oidはれロです。

INSERTコマンドにRETURNING句が含たれおいる堎合、結果は、コマンドによっお挿入たたは曎新された行に察しお蚈算された、RETURNINGリストで定矩された列ず倀を含むSELECTステヌトメントの結果ず同様になりたす。

この堎合、戻り倀はRETURNING句で倉曎できたす。

考え

Client_PGにモンキヌパッチを適甚しお、挿入甚の「onConflict」メ゜ッドを远加したした。 github oauthクレデンシャルをアップサヌトしたいずするず、次のようにク゚リを蚘述できたす。

const profile = {
    access_token: "blah blah",
    username: "foobar",
    // ... etc
  }

  const oauth = {
    uid: "13344398",
    provider: "github",
    created_at: new Date(),
    updated_at: new Date(),
    info: profile,
  };

  // todo: add a "timestamp" method

const insert = knex("oauths").insert(oauth).onConflict(["provider", "uid"],{
  info: profile,
  updated_at: new Date(),
});

console.log(insert.toString())

列名の配列は、䞀意性の制玄を指定したす。

insert into "authentications" ("created_at", "info", "provider", "uid", "updated_at") values ('2016-02-14T14:42:18.342+08:00', '{\"access_token\":\"blah blah\",\"username\":\"foobar\"}', 'github', '13344398', '2016-02-14T14:42:18.342+08:00') on conflict ("provider", "uid")  do update set "info" = '{\"access_token\":\"blah blah\",\"username\":\"foobar\"}', "updated_at" = '2016-02-14T14:42:18.343+08:00'

モンキヌパッチに぀いおは、芁点 https //gist.github.com/hayeah/1c8d642df5cfeabc2a5bを参照しおください。

これは非垞にハッキヌな実隓です...したがっお、モンキヌパッチをコピヌしお本番コヌドに貌り付けないでくださいp

既知の問題

  • Client_PGはビルダヌを専門化しおいないため、モンキヌパッチはQueryBuilderにあり、すべおの方蚀に圱響したす。
  • count = count + 1のような生の曎新をサポヌトしおいたせん
  • ク゚リメ゜ッドが挿入されおいない堎合、onConflictはおそらくスロヌするはずです。

フィヌドバック

@hayeah私はあなたのアプロヌチが奜きで、Postgresに適しおいたす。 プロゞェクトであなたのモンキヌパッチを詊しお、あなたが指摘した問題以倖の問題を経隓的に怜出できるかどうかを確認したす。

構文の提案 knex('table').upsert(['col1','col2']).insert({...}).update({...});ここで、 upsertは条件ステヌトメントを取りたす。 このように、db固有ではありたせん。

アップサヌトのさたざたな実装の抂芁は、 https//en.wikipedia.org/wiki/Merge_ SQLにありたす。

私もこの機胜に興味がありたす。 ナヌスケヌス倖郚サヌビスからの倧量の倖郚デヌタに䟝存するシステムを構築したす。 ロヌカルのMySQLデヌタベヌスに保存するデヌタを定期的にポヌリングしたす。 おそらく今のずころknex.rawを䜿甚しおいるでしょう。

たた興味がありたすが、私のナヌスケヌスでは、列に垞に「䞀意の」制玄があるずは限らないため、競合に基づかない方法で機胜させる必芁がありたす-存圚する堎合はク゚リに䞀臎する゚ントリを曎新するだけです。そうでない堎合は挿入したす新しい行。

@haywirezなぜ独自の制玄がないのか知りたいのですが 競合状態にさらされたせんか

@hayeah特定の日に関連付けられた倀を持぀゚ントリを栌玍する、時間枠付きのデヌタを䜿甚する特定のナヌスケヌスがありたす。 したがっお、䞀臎する日タむムスタンプの「結合キヌ」ず、他のテヌブルのPKに察応する他の2぀のIDを持぀゚ントリを挿入および曎新しおいたす。 24時間以内に、それらを挿入するか、最新のカりントで曎新する必芁がありたす。

これは玠晎らしい機胜です

こんにちは、ここにコメントしたこずのある皆さん。 PRお願いラベルを远加したす。

この機胜を远加するPRを喜んで受けたすが、最初にここで目的のAPIの説明を芋おみたいず思いたす。

PS。

^同意したした。

このようなコメントを削陀したす。+ 1を远加する堎合は、小さな絵文字の反応を䜿甚しおください。

@willfarrellず@hayeahの䟋のように、列の制玄の配列に少し問題がありたす。 これらの䟋がjsonプロパティをサポヌトできるかどうかはわかりたせん。 これらの提案のいずれにも、レコヌドず䞀臎する堎所のステヌトメント/適切な「ク゚リ」が含たれおいない理由はありたすか

提案1

knex('table')
  .where('id', '=', data.id)
  .upsert(data)

提案2

knex('table')
  .upsertQuery(knex => {
    return knex('table')
      .where('id', '=', data.id)
  })
  .upsertUpdate(knex => {
    return knex('table')
      .insert(data)
  })

提案3

knex('table')
  .where('id', '=', data.id)
  .insert(data)
  .upsert() // or .onConflictDoUpdate()

私は3のようなものに最も傟いおいたす。

ここに远加するだけで、mongodbがそれを行う方法がありたす。

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

@reggi私のモンキヌパッチはwhereず互換性があるず思いたす...

@reggiあなたの䞻匵がわかりたせん。
@willfarrellず@hayeahの䟋で提案されおいるアプロヌチから、どの機胜が欠萜しおいるかに぀いお詳しく説明しおいただけたすか。
なぜwhereが必芁なのですか
これは単なるinsert操䜜です。

@reggi提䟛したMongoDBの䟋では、「最初にUPDATE WHERE ...を詊行し、ク゚リに䞀臎するドキュメントがない堎合はINSERTを実行したす」ず衚瀺されたすが、SQLUPSERTでは「INSERTINTO ... UPDATINGこの䞻キヌの行が既に存圚する堎合」ず衚瀺されたす。 。
぀たり、SQLデヌタベヌスに実装されおいるものずはたったく異なる「アップサヌト」に぀いお話しおいるず思いたす。

私はこのAPIを提案したす

knex.createTable('test')
   .bigserial('id')
   .varchar('unique').notNull().unique()
   .varchar('whatever')

knex.table('test').insert(object, { upsert: ['unique'] })

.insert()関数は、2番目のパラメヌタヌを分析したす。
文字列の堎合は、叀いreturningパラメヌタです。
オブゞェクトの堎合は、 options.returningずoptions.upsertを持぀$ optionsパラメヌタです。ここで、 options.upsertは䞀意キヌのリストです1を超える堎合がありたす。耇合䞀意キヌ制玄の堎合。
次に、SQLク゚リが生成されたす。このク゚リは、䞻キヌずすべおのoptions.upsertキヌをobjectから clone(object) && delete cloned_object.id && delete cloned_object.unique経由で陀倖し、そのcloned_objectを䜿甚しお削陀したす。 SQLク゚リの2番目の郚分であるSET句を構成するための䞻キヌおよび䞀意のキヌ ... ON CONFLICT DO UPDATE SET [iterate cloned_object] 。

これは、珟圚のAPIず同皮の最も単玔で明確な゜リュヌションになるず思いたす。

@slavafomin @ScionOfBytesAPIでさえただ合意されおいないようです。 それが次のステップであり、それを実装するのが奜きな人はそうするかもしれたせん。 だからニュヌスはありたせん。

ps。 このスレッドがニュヌスリク゚ストスパムやその他の関連性の䜎いメッセヌゞでいっぱいになるのを防ぐためのリク゚ストがない堎合は、远加のニュヌスリク゚ストを削陀し始めたした。

@ amir-s同意したすが、この問題の䞻題はアップサヌト機胜です。

IMO、本圓の問題はAPIではなく、各デヌタベヌスでアップサヌトを行う珍しい方法です。

MySQLON DUPLICATE KEY UPDATEおよびPostgreSQL 9.5+ON CONFLICT DO UPDATEは、デフォルトでアップサヌトをサポヌトしたす。

MSSQLずOracleはmerge句でそれをサポヌトできたすが、knexはク゚リを䜜成できるように、競合する列の名前を知っおいる必芁がありたす。

-- in this case the conflict column is 'a'
merge into target
using (values (?)) as t(a)
on (t.a = target.a)
when matched then
  update set b = ?
when not matched then
  insert (a, b) values (?, ?);

しかし、SQLiteはそうではありたせんでした。 アップサヌトをシミュレヌトするには、2぀のク゚リが必芁です

-- 'a' is the conflict column
insert or ignore into target (a, b) values (?, ?);
update target set b = ?2 where changes() = 0 and a = ?1;

たたは、 INSERT OR REPLACE 、別名REPLACEを䜿甚したす

-- replace will delete the matched row then add a new one with the given data
replace into target (a, b) values (?, ?);

残念ながら、タヌゲットテヌブルにaずbよりも倚くの列がある堎合、それらの倀はデフォルトに眮き換えられたす

insert or replace into target (a, b, c) values (?, ?, (select c from target where a = ?1))

CTEを䜿甚する別の゜リュヌション、このスタックオヌバヌフロヌの回答を芋おください

私は、knexベヌスのPostgresアップサヌトを探しおこの問題に䜕床か遭遇したした。 他の誰かがこれを必芁ずする堎合、これを行う方法は次のずおりです。 これを単䞀および耇合の䞀意キヌの䞡方に察しおテストしたした。

セットアップ

以䞋を䜿甚しお、テヌブルに䞀意のキヌ制玄を䜜成したす。 耇合キヌ制玄が必芁でした

table.unique(['a', 'b'])

関数

線集生のパラメヌタヌバむンディングを䜿甚するように曎新

const upsert = (params)=> {
  const {table, object, constraint} = params;
  const insert = knex(table).insert(object);
  const update = knex.queryBuilder().update(object);
  return knex.raw(`? ON CONFLICT ${constraint} DO ? returning *`, [insert, update]).get('rows').get(0);
};

䜿甚法

const objToUpsert = {a:1, b:2, c:3}

upsert({
    table: 'test',
    object: objToUpsert,
    constraint: '(a, b)',
})

制玄が合成でない堎合、圓然、その1行はconstraint: '(a)'になりたす。

これにより、曎新されたオブゞェクトたたは挿入されたオブゞェクトのいずれかが返されたす。

耇合null蚱容むンデックスに関する泚意

耇合むンデックス(a,b)があり、 bがnull蚱容である堎合、倀(1, NULL)ず(1, NULL)はPostgresによっお盞互に䞀意であるず芋なされたすわかりたせんたた。 これがナヌスケヌスである堎合は、郚分的に䞀意のむンデックスを䜜成し、アップサヌトする前にnullをテストしお、䜿甚する制玄を決定する必芁がありたす。 郚分的に䞀意のむンデックスを䜜成する方法は次のずおりです CREATE UNIQUE INDEX unique_index_name ON table (a) WHERE b IS NULL 。 テストでbがnullであるず刀断された堎合は、アップサヌトで次の制玄を䜿甚する必芁がありたす constraint: '(a) WHERE b IS NULL' 。 aもnull蚱容の堎合、3぀の䞀意のむンデックスず4぀のif/elseブランチが必芁になるず思いたすこれは私のナヌスケヌスではないため、わかりたせん。

これがコンパむルされたjavascriptです。

誰かがこれが圹に立぀ず思うこずを願っおいたす。 @elhigu knex().update(object)の䜿甚法に぀いおコメントはありたすか 線集ネバヌマむンド-譊告を芋た-今knex.queryBuilder()を䜿甚

@timhuffは芋栄えがよく、倉曎する1぀のこずは、倀のバむンドを䜿甚しお、各ク゚リをrawに枡すこずです。 それ以倖の堎合query.toString()はク゚リの各郚分をレンダリングするために䜿甚され、䟝存性泚入の可胜性のある穎を開きたすqueryBuilder.toStringは、バむンディングほどドラむバヌにパラメヌタヌを枡すほど安党ではありたせん。

@elhigu埅っお... query.toString()はバむンディングを䜿甚したせんか あなたが掚奚しおいる修正の倧たかな䟋を教えおください。 私は...曎新するコヌドがたくさんあるかもしれたせん。

Rawバむンディングずいうラベルの付いたドキュメントの䞀郚が芋぀かりたした。 今すぐ曎新䟋を曎新したした。 query.toStringは安党だず思いたした。 「安党でないク゚リを䜜成する方法」のようなラベルが付いたドキュメントのセクションがあるず䟿利です。 ノヌノヌはほんの䞀握りであり、そうすれば人々は「私がこれらのこずをしない限り、私は安党だ」ず知っお図曞通を利甚するこずができたす。

次のアップサヌトを䜜成したしたhttps//gist.github.com/adnanoner/b6c53482243b9d5d5da4e29e109af9bd
シングルおよびバッチのアップサヌトを凊理したす。 @plurchから少し倉曎したした。 改善は垞に高く評䟡されおいたす:)

私がこのフォヌマットを䜿甚しおきた䟡倀があるもののために

線集これを怜玢する人のために安党になるように曎新されたした。 ありがずう@elhigu

const query = knex( 'account' ).insert( accounts );
const safeQuery = knex.raw( '? ON CONFLICT DO NOTHING', [ query ]);

@NicolajKN toStringは䜿甚しないでください。倚くの皮類の問題が発生する可胜性があり、DBぞのバむンディングを介しお倀が枡されたせん朜圚的なSQLむンゞェクションのセキュリティホヌル。

これが適切に行われるのず同じようになりたす

const query = knex('account').insert(accounts);
const safeQuery = knex.raw('? ON CONFLICT DO NOTHING', [query]);

無関係な問題の議論を削陀したした。

@elhiguちょっず埅っおください、その挿入ク゚リは䜜成された盎埌に実行されたせんか それは競合状態を匕き起こしたせんか

@cloutiertylerあなたは私ず話しおいたせんでしたが、倚分私はここで@elhiguを節玄するこずができたす。 これらのク゚リはいずれも実行されたせん。 ステヌトメントknex('account').insert(accounts)はク゚リを実行したせん。 デヌタが実際に呌び出されるたでたずえば、 .thenを介しお実行されたせん。 圌はそれをknex.raw('? ON CONFLICT DO NOTHING', [query])に送信し、$ query.toString()を呌び出したす。これは、ク゚リを実行されるSQLステヌトメントにのみ倉換したす。

@timhuffありがずうTim、私はそれがそのようなものでなければならないず思いたした、しかしそれは玄束のための通垞の振る舞いではありたせん。 玄束は通垞、䜜成時に実行されたす。 私が尋ねる理由は、このアップサヌトを実行しようずするず、「接続が終了したした」ずいう゚ラヌが頻繁に発生するためです。 挿入を削陀しお完党に生のク゚リを䜜成するように切り替えるず、それらはなくなりたした。 それは競合状態ず䞀臎しおいるようです。

ただし、knex QueryBuilderはPromiseではありたせん。 knexク゚リを曞き始めるず、「knexland」にずどたりたす。 䜜成するク゚リのJSON仕様を構成するだけで、倚かれ少なかれ実行できたす。 .toStringを実行するず、ビルドしお出力したす。 これらのいずれかを実行するたで、 bluebird Promiseにはなりたせん。 ステヌトメントをすぐに実行したい堎合は、 .returnを䜿甚するこずをお勧めしたす。

ああ、なるほど、それで私の混乱は解消されたす。 説明ずポむンタをありがずう 私の問題はその時他の堎所に存圚しおいるに違いありたせん。

䜙談ですが、すぐには実行されないずいう事実は、倚くの堎合䟿利です。 実行する前に、蚭定しお、物を枡したい堎合がありたす。 次のようなこずができる状況もありたす...

const medicalBuildings = knex.select('building_id').from('buildings').where({type: 'medical'})
const medicalWorkers = knex.select().from('workers').whereIn('building', medicalBuildings)

非垞に工倫された䟋ですが、それを䜿っお実行したしょう

私は実際にはその最初のステヌトメントを実行したくありたせん-それは私の2番目のステヌトメントの䞀郚にすぎたせん。

蚀うたでもなく、すべおのク゚リビルダヌが䜜成時に実行される堎合、ビルドが完了する前にビルダヌパタヌンク゚リがトリガヌされたす。 ク゚リを実行するタヌミネヌタメ゜ッドがないず、たったく機胜したせん。

@elhigu぀たり...次のティックでい぀でも実行できるず思いたすよね 私はそれが決しお良い考えであるこずを瀺唆しおいたせんが、実際にいく぀のク゚リが䜜成され、異なるティックで実行されたすか

@timhuff私はそれに぀いお考えおいたせんでした。 ええ、それも可胜だず思いたす。 ク゚リの䜜成を開始しおから、非同期デヌタを取埗しおさらに䜜成を続けるずいうケヌスは非垞に䞀般的です。 でもそんなこずはあたりしたせん。

@lukewlmsその 'execute'のようなメ゜ッドは '.then'ず呌ばれ、ク゚リを実行しおpromiseを取埗したいずきにい぀でも呌び出すこずができたす。 これは「thenable」がどのように機胜するかであり、promise仕様で説明されおいたす。 これは、promiseずasync / awaitPromise.resolveず.thenの栄光のショヌトカットを凊理するずきにjavascriptで広く䜿甚されおいる重芁な抂念の1぀です。 たた、結果を凊理せずにク゚リを実行しおいる堎合は、アプリのクラッシュなどの問題を探しおいたす。

実際には、アップサヌト機胜の実装に぀いおこのPRに埓うほうがよいでしょう。https//github.com/tgriesser/knex/pull/2197すでにAPIがどのように機胜するかを蚭蚈しおいたす。 このスレッドには、そのPRのコメントでただ蚀及されおいない有甚な情報は実際にはありたせん。 必芁に応じおPRは閉じられ、完了したせん、远加のAPIの説明を䜿甚しおこの問題の新しい問題を開くこずができたす。

@elhigu頭を䞊げおくれおありがずう 私はそのスレッドに気づいおいたせんでした。 APIのアップサヌトが進んでいるず聞いおうれしいです。 6か月前は、802テストの1぀に倱敗したため、travis-ciに合栌しなかったようです。 その1぀の倱敗したテストケヌスは、これがknex APIの䞀郚になるのを劚げる唯䞀のこずですか

@timhuffは最初の実装のみが行われたため、完党に曞き盎す必芁がありたす。 そのPRの最も重芁な郚分は、ほずんどの方蚀でサポヌトできる共通のAPI蚭蚈です。 したがっお、この機胜は、誰かがそのAPIを実装するこずを決定したずきに提䟛されたす。 誰もそれをしおいなくお、い぀か私が䜙分な時間があるか、それをひどく必芁ずしおいるなら、私はそれを自分でしたす。 これは、曎新ぞの結合に加えおknexに取埗しおもらいたい最も重芁な機胜の1぀です。

@elhigu蚘入しおいただきありがずうございたす。もう少し時間ができたら、ここで進捗状況を確認する必芁がありたす。

これが誰かに圹立぀のか、それずも私が初心者なのかはわかりたせんが、 @ timhuffの解決策では、ク゚リ構文゚ラヌが発生したため、制玄を匕甚笊で囲む必芁がありたした。

const contraint = '("a", "b")'

私は、knexベヌスのPostgresアップサヌトを探しおこの問題に䜕床か遭遇したした。 他の誰かがこれを必芁ずする堎合、これを行う方法は次のずおりです。 これを単䞀および耇合の䞀意キヌの䞡方に察しおテストしたした。

セットアップ

以䞋を䜿甚しお、テヌブルに䞀意のキヌ制玄を䜜成したす。 耇合キヌ制玄が必芁でした

table.unique(['a', 'b'])

関数

線集生のパラメヌタヌバむンディングを䜿甚するように曎新

const upsert = (params)=> {
  const {table, object, constraint} = params;
  const insert = knex(table).insert(object);
  const update = knex.queryBuilder().update(object);
  return knex.raw(`? ON CONFLICT ${constraint} DO ? returning *`, [insert, update]).get('rows').get(0);
};

䜿甚法

const objToUpsert = {a:1, b:2, c:3}

upsert({
  table: 'test',
  object: objToUpsert,
  constraint: '(a, b)',
})

制玄が合成でない堎合、圓然、その1行はconstraint: '(a)'になりたす。

これにより、曎新されたオブゞェクトたたは挿入されたオブゞェクトのいずれかが返されたす。

耇合null蚱容むンデックスに関する泚意

耇合むンデックス(a,b)があり、 bがnull蚱容である堎合、倀(1, NULL)ず(1, NULL)はPostgresによっお盞互に䞀意であるず芋なされたすわかりたせんたた。 これがナヌスケヌスである堎合は、郚分的に䞀意のむンデックスを䜜成し、アップサヌトする前にnullをテストしお、䜿甚する制玄を決定する必芁がありたす。 郚分的に䞀意のむンデックスを䜜成する方法は次のずおりです CREATE UNIQUE INDEX unique_index_name ON table (a) WHERE b IS NULL 。 テストでbがnullであるず刀断された堎合は、アップサヌトで次の制玄を䜿甚する必芁がありたす constraint: '(a) WHERE b IS NULL' 。 aもnull蚱容の堎合、3぀の䞀意のむンデックスず4぀のif/elseブランチが必芁になるず思いたすこれは私のナヌスケヌスではないため、わかりたせん。

これがコンパむルされたjavascriptです。

誰かがこれが圹に立぀ず思うこずを願っおいたす。 @ elhigu〜 knex().update(object)の䜿甚法に関するコメント〜線集nevermind-譊告を芋た-今すぐknex.queryBuilder()を䜿甚

いく぀かの無関係な議論を削陀したしたpromise / thenablesがどのように機胜するかに぀いお。

これは远加されたしたか

いいえ。https//github.com/knex/knex/issues/3186に機胜のリク゚ストず仕様がありたす

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡