【发布时间】:2017-02-24 23:54:30
【问题描述】:
我正在尝试从 MySQL 迁移到 Postgres,但遇到了一些问题。我有一个表单,用户填写大约 40 个字段,这些值被插入到数据库中。使用 MySQL 我习惯这样做:
INSERT INTO table_name SET name="John Smith", email="jsmith@gmail.com", website="jsmith.org";
我还在使用带有 nodejs 的 mysql 模块,这就是我的代码目前的样子:
var data = {
name: req.body.name,
email: req.body.email,
website: req.body.website,
...
...
}
var query = connection.query('INSERT INTO table_name SET ?', data)
由于SET 不是有效的SQL,如果我想使用Postgres,使用pg 模块的查询将如下所示:
client.query('INSERT INTO table_name (name, email, website) VALUES ($1, $2, $3)', req.body.name, req.body.email, req.body.website)
考虑到我有将近 40 个字段,这将变得非常乏味。
有没有更好的方法来做到这一点,还是我不得不手动编写查询?
谢谢。
【问题讨论】:
-
很抱歉,该语法是 MySQL 特有的。您可以编写自己的包装器,但我认为这比重写所有查询需要更多时间。
-
如果
req.body只有相关的自己的属性,你可以使用Object.keys来构建( column_name [ , ... ] )列表并根据键的长度生成VALUES ($1, ...)表达式。然后再次使用该键列表形成参数列表并应用。但另一方面,如果某个随机键突然出现在您的req.body中,则手动编写查询的好处是不会崩溃。 -
@IljaEverilä 但是应该在某处(很可能来自 ORM)有一个列列表,因此您可以从该列表开始,删除通常的嫌疑人(
id,时间戳,...),并留下一个列白名单来过滤req.body。一种临时解决方案,但也是支持迁移的合理桥梁。 -
@muistooshort 确实使用来自
req.body的列名白名单会更好。看起来原来的data对象已经被列入白名单,所以可以使用。
标签: javascript mysql sql node.js postgresql