2015-08-28 14 views
5

tôi cần có bảng trong db của mình chứa một cột duy nhất là một mảng các đối tượng uuid (uuid [] type)cách chèn bản ghi với mảng uuid vào bảng pg bằng cách sử dụng thư viện pj-promise nodejs

nhưng khi tôi cố gắng để chèn vào nó sử dụng một thư viện nodejs tên pg-hứa nó không

tôi nhận được thông báo lỗi sau đây nói với tôi tôi cần phải viết lại các diễn viên hoặc các biểu hiện

{"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"} 

này lạ là vì tôi hoàn toàn không có vấn đề gì khi tôi cố gắng nhập một uuid duy nhất vào cột khác trên cùng một bảng chính xác (nghĩa là tôi không có vấn đề gì với đại diện uuid, btw i tạo chúng dưới dạng biến văn bản từ một lib khác, nhưng chúng là các biến văn bản cũ)

Tôi cũng không gặp vấn đề khi tôi cố gắng nhập một mảng các đối tượng TEXT vào cùng một cột (trong trường hợp tôi thay đổi bảng để có cột TEXT [] thay vì cột UUID [])

đây là mã của tôi

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

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); 
     }); 
} 

Trả lời

3

Chèn một mảng UUID-s là trường hợp đặc biệt yêu cầu nhập loại rõ ràng, vì bạn đang chuyển UUID-s vào loại uuid[] dưới dạng một chuỗi các chuỗi văn bản.

Bạn cần thay đổi truy vấn INSERT: thay thế ${sobList} bằng ${sobList}::uuid[]. Điều này sẽ hướng dẫn PostgeSQL chuyển đổi mảng chuỗi thành mảng UUID-s.

Không liên quan đến câu hỏi của bạn, bạn không cần sử dụng Promise.all bên trong db.tx khi thực hiện chỉ một yêu cầu. Bạn chỉ có thể trở lại kết quả từ yêu cầu chèn:

return this.none(insertEntityQuery,newEntity); 

mặc dù sử dụng một giao dịch để thực hiện một yêu cầu duy nhất cũng không kém phần vô nghĩa :)

CẬP NHẬT

Phiên bản mới nhất của pg-promise hỗ trợ Custom Type Formatting , vì vậy bạn có thể viết các loại tùy chỉnh của riêng mình để định dạng truy vấn, tránh việc truyền kiểu rõ ràng.

Ví dụ bạn sử dụng UUID-s bên trong một mảng, bạn có thể thực hiện kiểu UUID của riêng bạn:

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

nhờ một Vitaly rất nhiều. đây chính là vấn đề. tôi có cảm giác đó là sự reasion, nhưng không biết cách thêm cú pháp. – Tal

+0

bây giờ tôi nghĩ về nó. bạn cũng là người đã viết pg-promise, đúng không? tốt, làm tốt lắm !!! :) lib tuyệt vời (mặc dù như bạn nhận thấy, tôi chỉ bắt đầu sử dụng nó, và chủ yếu là cách sai) nhưng toàn bộ lời hứa hỗ trợ trực tiếp từ lib là rất tốt. – Tal

+0

vâng, đó là tôi :) vui lòng đặt câu hỏi trên trang web của dự án: [pg-promise] (https://github.com/vitaly-t/pg-promise) –

Các vấn đề liên quan