2

我使用 MySQL DB 和 MySQL2 作为适配器。

我想在 Rails 中执行自定义 sql 语句。

我需要一种允许像 PHP 一样准备 sql 语句的方法,如下所示:

stmt = prepare("INSERT INTO tab (col1, col2) VALUES (?, ?)", ["foo", "bar"])

不过,我发现 ActiveRecord 和 MySQL2 都没有这样的方法。

但我发现ActiveRecord::ConnectionAdapters::AbstractAdapterexec_*中有几种方法,我认为它们完全适合我的任务但不知道如何使用它们,他们的 API 文档信息很少:

exec_insert(sql,名称,绑定)

使用绑定作为绑定替代,在此连接的上下文中执行插入 sql 语句。name 是与执行的 sql 语句一起记录的。

我已经厌倦了这个

sql = "INSERT INTO tab (col1, col2) VALUES (?, ?)"
r = ActiveRecord::Base.connection().exec_insert(sql, "someName", [10, "foo"])
puts r

但出现错误:

`query': Mysql2::Error: You have an error in your SQL syntax; check the manual 
that corresponds to your MySQL server version for the right syntax to use near '?, ?)'

那么如何使用这些方法呢?什么是name属性?什么是bind参数类型?如何编写 sql 语句,用什么代替?

升级版:

我已经编写prepare了在 Rails 中使用的方法。见 github

4

2 回答 2

0

回答太晚了,所有的导轨都升级了,但可能这就是你要找的 -

ActiveRecord::Base.connection().exec_query('INSERT INTO table(column1, column2) VALUES($1, $2)', 'someName', [[nil, 10], [nil, 'column2Value']])

请注意,我只为 Postgres使用并测试了 $1、$2,因为它是用于在 postgres 中准备查询的约定。

MySql 和其他数据库可能会有所不同。对于 Mysql,我认为它应该?代替 $1、$2 等

于 2018-07-05T18:09:34.237 回答
-1

我不建议您使用 exec_insert 因为它是一种“内部”方法,将来很容易发生变化。

Rails 方法如下:要么使用 AR 好东西(即绕过 SQL),要么使用纯 SQL,将两者混合不是一个实际的选择。

绑定(exec_inser 的第三个参数)是很好的工具,它们允许您根据 DB 列动态检查传递给 DB 的值,但它们的使用没有记录,因为您不应该使用它们。

1) 手动构建 SQL 查询

sql = "INSERT INTO tab (col1, col2) VALUES (10, 'foo')"

2)将其发射到数据库中

r = ActiveRecord::Base.connection.execute(sql)

3) 检查结果。这是特定于数据库适配器的。

干杯,

PS不要忘记created_atupdated_at columns,将它们设置为'DateTime.now'

于 2013-04-20T22:02:29.217 回答