2017-05-29 199 views
2

node.js pg npmパッケージを使用してPostgreSQL準備文を作成しようとしています。しかし、私はエラーを取得しておいてください。nameフィールドはtext not nullを入力するように設定されているDBに

could not determine data type of parameter $1

function promiseQuery(sql, values) { 
    return new Promise(function(resolve, reject) { 
     pool.query('select $1 from workers', ['name'], function(err, result) { 
      if (err) {console.log(err); reject(err)} 
      else resolve(result.rows); 
     }) 
    }); 
} 

また、pg-promiseも試していますが、いずれも成功しません。 SQL syntaxnameの観点からの問合せselect name from workers

+0

のような識別子を渡すことはできますか?.. –

+0

@VaoTsun pgのドキュメントには非常によく似た例があります:https://www.npmjs.com/package/pg – wizard

+0

正確には、その例では – VladNeacsu

答えて

2

は、identifierで、識別子は$Nパラメータとして渡すことは決してできない、彼らはコマンドにそのまま表示される必要があります。そうしないと、照会を準備できません。

$Nパラメータは、リテラル(定数)が配置される位置のクエリでのみ表示されます。

任意のクライアント側ライブラリの外に、PREPARE SQLコマンドを使用して、類似した何かをしようとする場合は、同じエラーを持っていると思います:

PREPARE p as SELECT $1 FROM pg_class; 
ERROR: could not determine data type of parameter $1 

のソリューションは、文字列の置換技術とJavaScriptでクエリを構築することです列名または表名をデータベースに送信します。

2

あなたは、動的な列名を持つプリペアドステートメントを組み合わせることはできません...ダニエル・ベリテによって答えに拡張するには、クライアント側のクエリを生成する必要があると思います。 SQL Namesためpg-promise構文を使用して

、あなたが適切にこのようなあなたのクエリをエスケープすることができます

db.any('SELECT $1~ FROM table', [colName]) 
// OR: 
db.any('SELECT $1:name FROM table', [colName]) 
// OR: 
db.any('SELECT ${colName~} FROM table', {colName}) 
// OR: 
db.any('SELECT ${colName:name} FROM table', {colName}) 
// Etc, other variable syntax, like $[], $//, $<>, $() 

そして、あなたは、列のリストのためにそれをしたい場合は、それを行う最も簡単な方法は、このようなものです:

const colNames = ['one', 'two', 'three']; 

db.any('SELECT $1~ FROM table', [colNames]) 
// etc, the same variations as above, all will generate: 
// SELECT "one","two","three" FROM table 

またはすべてのオブジェクトのプロパティから:

const data = { 
    one: 123, 
    two: true, 
    three: 'text' 
}; 
db.any('SELECT $1~ FROM table', [data]) 
// etc, the same variations as above, all will generate: 
// SELECT "one","two","three" FROM table 

これらのメソッドはすべて、SQLインジェクションが不可能であることを確認してクエリを正しくエスケープします。

関連する問題