されており、私はこのエラーに実行しています:
error: could not determine data type of parameter $1
at Connection.parseE (/home/***/niche-api/node/node_modules/pg/lib/connection.js:539:11)
at Connection.parseMessage (/home/***/niche-api/node/node_modules/pg/lib/connection.js:366:17)
at Socket.<anonymous> (/home/***/niche-api/node/node_modules/pg/lib/connection.js:105:22)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at readableAddChunk (_stream_readable.js:172:18)
at Socket.Readable.push (_stream_readable.js:130:10)
at TCP.onread (net.js:542:20)
私のクエリの目標は、渡されたクエリパラメータを受け入れることです
inノードエクスプレスアプリから、パラメータがAPIコールに存在しない場合は、データベースクエリをフィルタリングしないようにします。たとえば、私のパラメータがvariableType
と呼ばれ、tmax
(たとえば、variableType=tmax
)に設定されている場合、データベースはvariableTypeがtmaxのレコードでのみ応答します。エンドポイントが照会パラメーターなしでヒットした場合、データベースはすべてのレコードを戻します。
私のクエリは次のとおりです。
SELECT * FROM variableTypes WHERE 1 = 1 AND ($1 IS NULL or $1 = variableTypeAbbreviation);
そして、私はこのようにそれを呼び出しています:
app.get("/variables", function(req, res){
//get a list of the variables in the database
var variableType = req.query.variableType
if (variableType == undefined){
variableType = null;
}
var client = new pg.Client({
user: keys.user,
password: keys.password,
database: keys.dbName,
hostname: keys.hostname
})
client.connect(function(err){
if (err){
res.json(err);
}
var query = client.query({name: 'variableSelect', text: "SELECT * FROM variableTypes WHERE 1 = 1 AND ($1 IS NULL or $1 = variableTypeAbbreviation);", values:[variableType]});
console.log(query)
query.on('row', function(row, result){
console.log("Got row")
result.addRow(row)
})
query.on('end', function(result){
console.log("Done.")
res.json(result)
client.end()
})
私は、クエリ($1 IS NULL)
のセクションに配置されている問題にそれを絞り込むました。私はここからどこに行くのか本当に知りません。私はPythonで(psycopg2を使用して)同様のクエリを書いています。これは動作します。これは、ノードパッケージとの関連性が高いと思います。
query = select variableTypeID, variableType, variableTypeAbbreviation
from variableTypes
WHERE 1 = 1
AND
(%(abbreviation)s is NULL or %(abbreviation)s LIKE lower(variableTypes.variableTypeAbbreviation))
AND (%(fullName)s is NULL or %(fullName)s = variableTypes.variableType)
cursor.execute(query, {'fullName': fullName, 'abbreviation' : abbreviation})
ご迷惑をおかけして申し訳ありません。
ありがとうございます!それも私の結論でした。この構文を使わないでsqlで同じ結果を達成する方法はありますか? –
@SCOTTFARLEY、用意されたステートメントを使用せず、単純なクエリのパラメータ化を使用します。私は例で私の答えを編集しました。 –
pg-promiseはこれに最適です。どうもありがとう。 –