使用Ruby pg gem,将可能为空的值添加到数据库的最佳方法是什么?

时间:2014-09-14 14:59:13

标签: ruby postgresql pg

我正在尝试将对象添加到数据库中,如下所示:

DB.exec("INSERT INTO patients (name, birthdate) VALUES ('#{name}', '#{birthdate}');")

问题是,如果其中任何一个值为nil,数据将被错误保存或语法错误。

我可以使用if语句发送不同的SQL语句,具体取决于每个值是否为nil,但这看起来很难看,我想知道如何做得更好。

1 个答案:

答案 0 :(得分:0)

使用prepare构建带占位符的预准备语句:

DB.prepare('new_patient', 'insert into patients (name, birthdate) values ($1, $2)')

请注意,这使用了编号参数,所以

  

...绑定参数在SQL查询中表示为$ 1,$ 1,$ 2等。

而不是您可能习惯的位置?参数。

然后使用exec_prepared执行预准备语句并提供参数值:

DB.exec_prepared('new_patient', [ name, birthdate ])

exec_prepared的接口有点奇怪,因为它需要显式数组中的参数。

现在,如果name.nil?,那么您会在name列中获得NULL,如果birthdate.nil?您在birthdate中获得NULL列。

如果您发现自己在SQL语句中编写#{...},请再想一想,几乎总会有更好更安全的方式。