我正在尝试将对象添加到数据库中,如下所示:
DB.exec("INSERT INTO patients (name, birthdate) VALUES ('#{name}', '#{birthdate}');")
问题是,如果其中任何一个值为nil,数据将被错误保存或语法错误。
我可以使用if语句发送不同的SQL语句,具体取决于每个值是否为nil,但这看起来很难看,我想知道如何做得更好。
答案 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语句中编写#{...}
,请再想一想,几乎总会有更好更安全的方式。