Javascript 如何仅在传递的值未定义时更新表?[PostgreSQL]
我正试图使用javascript在PostgreSQL中发出一些更新请求,但在更新方法方面遇到了一些问题: 我以前是这样的:Javascript 如何仅在传递的值未定义时更新表?[PostgreSQL],javascript,node.js,postgresql,Javascript,Node.js,Postgresql,我正试图使用javascript在PostgreSQL中发出一些更新请求,但在更新方法方面遇到了一些问题: 我以前是这样的: var query = client.query("UPDATE COMPANY SET company_name=$1, phone=$2 WHERE company_id = $3", [data.company_name, data.phone, company_id_requested]); 无论data.company\u name或data.phone的值是
var query = client.query("UPDATE COMPANY SET company_name=$1, phone=$2 WHERE company_id = $3", [data.company_name, data.phone, company_id_requested]);
无论data.company\u name
或data.phone的值是多少,这都会更新表company。问题是这些值可以是未定义的,但是如果这些值未定义,我不想将tables值更新为NULL
我已经尝试了一个新的代码来解决这个问题,但我真的没有发现它干净,特别是因为我必须为每个更新方法都这样做
var queryText = "UPDATE COMPANY SET ";
var params = [];
if (data.company_name !== undefined) {
if (params.length != 0)
queryText += ", ";
params.push(data.company_name);
queryText += "company_name=$" + params.length;
}
if (data.phone !== undefined) {
if (params.length != 0)
queryText += ", ";
params.push(data.phone);
queryText += "phone=$" + params.length;
}
params.push(company_id_requested);
queryText += " WHERE company_id = $" + params.length;
console.log(queryText);
var query = client.query(queryText, params);
在这里,我基本上构造了查询。没有其他方法吗?尝试将条件添加到where子句中:
var query = client.query("UPDATE COMPANY SET company_name=$1, phone=$2 WHERE company_id = $3 AND $1 IS NOT NULL AND $2 IS NOT NULL", [data.company_name, data.phone, company_id_requested]);
尝试将条件添加到where子句中:
var query = client.query("UPDATE COMPANY SET company_name=$1, phone=$2 WHERE company_id = $3 AND $1 IS NOT NULL AND $2 IS NOT NULL", [data.company_name, data.phone, company_id_requested]);
以下函数将根据表名和要设置属性的对象为您生成此类更新:
function createUpdate(table, data) {
if (!table || typeof table !== 'string') {
throw new TypeError("Parameter 'table' must be a non-empty string.");
}
if (!data || typeof data !== 'object') {
throw new TypeError("Parameter 'data' must be an object.");
}
var keys = Object.keys(data)
.filter(function (k) {
return data[k] !== undefined;
});
var names = keys.map(function (k, index) {
return k + ' = $' + (index + 1);
}).join(', ');
var values = keys.map(function (k) {
return data[k];
});
return {
query: 'UPDATE ' + table + ' SET ' + names,
values: values
};
}
测试:
var obj = {
one: 1,
two: 'two',
last: undefined
};
var update = createUpdate("Company", obj);
这将创建以下对象:
{ query: 'UPDATE Company SET one = $1, two = $2', values: [ 1, 'two' ] }
所以你可以打电话:
client.query(update.query, update.values);
以下函数将根据表名和要设置属性的对象为您生成此类更新:
function createUpdate(table, data) {
if (!table || typeof table !== 'string') {
throw new TypeError("Parameter 'table' must be a non-empty string.");
}
if (!data || typeof data !== 'object') {
throw new TypeError("Parameter 'data' must be an object.");
}
var keys = Object.keys(data)
.filter(function (k) {
return data[k] !== undefined;
});
var names = keys.map(function (k, index) {
return k + ' = $' + (index + 1);
}).join(', ');
var values = keys.map(function (k) {
return data[k];
});
return {
query: 'UPDATE ' + table + ' SET ' + names,
values: values
};
}
测试:
var obj = {
one: 1,
two: 'two',
last: undefined
};
var update = createUpdate("Company", obj);
这将创建以下对象:
{ query: 'UPDATE Company SET one = $1, two = $2', values: [ 1, 'two' ] }
所以你可以打电话:
client.query(update.query, update.values);
这将生成与查询的更新逻辑完全不同的更新逻辑。这将生成与查询的更新逻辑完全不同的更新逻辑。您不能使用节点postgres
,因为它不允许在查询中动态使用列名,更不用说自定义类型了。但是,如果您要使用,这将是相当容易实现的。再想想,我已经为您发布了一个可能的解决方案;)不能使用节点postgres
,因为它不允许在查询中动态使用列名,更不用说自定义类型了。但是,如果您要使用,这将是相当容易实现的。再想想,我已经为您发布了一个可能的解决方案;)