2015-08-28 40 views
5

db'de bir uuid nesnesi (uuid [] türü) dizisi olan tek bir sütun içeren bir tablonun olması gerekirBir uuid dizisi ile bir kayıt nodejs pg-promise kitaplığı kullanarak bir pg tablosuna nasıl eklenir?

i adında bir nodejs kitaplığı kullanarak içine eklemeye çalıştığınızda

ama döküm veya

{"name":"error","length":206,"severity":"ERROR","code":"42804","hint":"You will need to rewrite or cast the expression.","position":"230","file":"src\\backend\\parse 
r\\parse_target.c","line":"510","routine":"transformAssignedExpr"} 

bu ifadeyi yeniden yazmak gerekir bu i aşağıdaki hata iletisi bana olsun

başarısız pg-söz kesinlikle hiçbir sorunum olmadığından garip Aynı tam tabloya başka bir sütuna tek bir uuid girmeye çalıştığımda (anlam, uuid'i temsil eden bir sorunum yok, btw bunları başka bir libreden bir metin değişkeni olarak oluşturuyorum, ancak düz eski metin değişkenleridir)

ve aynı sütuna bir TEXT nesnesi dizisi girmeye çalıştığımda bir sorunum var (tabloyu UUID [] sütun yerine TEXT [] sütununa değiştirmek için değiştirirseniz)

İşte benim kodum Eğer tipiçine UUID-ler geçiyoruz çünkü UUID-s bir dizi takma

//////////////// 

var Promise = require('bluebird'); 
var pgpLib = require('pg-promise'); 
var pgp = pgpLib(); 
var cn = confUtil.pgDbConnectionConfiguration(); 
var db = pgp(cn); 

////////////////// 

var newEntity={}; 
newEntity.hash  = uuid.v4();  
newEntity.location = {X:2394876,Y:2342342}; 
newEntity.mother = uuid.v4(); 
newEntity.timestamp = Date.now(); 
newEntity.content = {content:"blah"}; 
newEntity.sobList = [uuid.v4(),uuid.v4(),uuid.v4()]; 
addEntity (newEntity); 

//////////////////// 

function addEntity(newEntity) { 
    var insertEntityQueryPrefix='insert into entities ('; 
    var insertEntityQueryMiddle=') values ('; 
    var insertEntityQueryPostfix=""; 
    var insertEntityQuery=""; 

    Object.keys(newEntity).forEach(function(key){ 
     insertEntityQueryPrefix=insertEntityQueryPrefix+'"'+key+'",'; 
     insertEntityQueryPostfix=insertEntityQueryPostfix+'${'+key+'},'; 
    }); 
    insertEntityQueryPrefix=insertEntityQueryPrefix.slice(0,-1); 
    insertEntityQueryPostfix=insertEntityQueryPostfix.slice(0,-1)+")"; 
    insertEntityQuery=insertEntityQueryPrefix+insertEntityQueryMiddle+insertEntityQueryPostfix; 

    //longStoryShort this is how the query template i used looked like 
    /* 
     "insert into entities ("hash","location","mother","timestamp","content","sobList") values (${hash},${location},${mother},${timestamp},${content},${sobList})" 
    */ 
    //and this is the parameters object i fed to the query i ran it when it failed 
    /* 
     { 
      "hash": "912f6d85-8b47-4d44-98a2-0bbef3727bbd", 
      "location": { 
       "X": 2394876, 
       "Y": 2342342 
      }, 
      "mother": "87312241-3781-4d7c-bf0b-2159fb6f7f74", 
      "timestamp": 1440760511354, 
      "content": { 
       "content": "bla" 
      }, 
      "sobList": [ 
       "6f2417e1-b2a0-4e21-8f1d-31e64dea6358", 
       "417ade4b-d438-4565-abd3-a546713be194", 
       "e4681d92-0c67-4bdf-973f-2c6a900a5fe4" 
      ] 
     } 
    */ 

    return db.tx(function() { 
     var processedInsertEntityQuery = this.any(insertEntityQuery,newEntity); 
     return Promise.all([processedInsertEntityQuery]) 
    }) 
    .then(
     function (data) { 
      return newEntity; 
     }, 
     function (reason) { 
      throw new Error(reason); 
     }); 
} 

cevap

3

, açık türü çevrim gerektiren özel bir durum Bir dizi metin dizesi olarak.

INSERT sorgunuzu değiştirmeniz gerekiyor: ${sobList} ürününü ${sobList}::uuid[] ile değiştirin. Bu PostgeSQL dizisini dizileri UUID-s dizisine dönüştürmek için talimat verecektir.

Sorunuzla ilgili olarak, yalnızca bir istekte bulunulurken db.tx'un içinde Promise.all'u kullanmanız gerekmez. Tek isteği yürütmek için bir işlem kullanılarak eşit anlamsız :)

GÜNCELLEME

pg-promise son sürümü Custom Type Formatting destekler olmasına rağmen

return this.none(insertEntityQuery,newEntity); 

: Sadece insert isteğinden sonuç döndürüyor Bu nedenle, sorgu biçimlendirme için kendi özel türlerinizi yazabilir, açık tipte dökümden kaçınabilirsiniz.

function UUID(value) { 
    this.uuid = value; 
    this.rawType = true; // force raw format on output; 
    this.toPostgres = function() { 
     return this.uuid.v4(); 
    }; 
} 
+0

çok teşekkürler vitaly: Bir dizinin içindeki UUID-s kullanmanın sizin Örneğin

, kendi UUID türünü uygulayabilirsiniz. Bu tam olarak meseleydi. Reasion bir duygu vardı, ama sözdizimi casting eklemek nasıl bilmiyordum. Şimdi bunun hakkında düşündüğüm – Tal

+0

. pg-promise yazan aynı vitalisin, değil mi? iyi, iyi iş! :) harika lib (fark ettiğim gibi, ben sadece kullanmaya başladı, ve çoğunlukla yanlış şekilde) ama tüm söz doğrudan lib gelen destek büyüktür. – Tal

+0

evet, bu benim :) projenin web sitesiyle ilgili soru sormaktan çekinmeyin: [pg-promise] (https://github.com/vitaly-t/pg-promise) –

İlgili konular