从Ruby运行sql脚本

时间:2010-03-09 15:54:11

标签: ruby postgresql dbi

使用DBI :: DatabaseHandle #execute或DBI :: DatabaseHandle#prepare它不可能运行sql脚本(带有多个sql语句)。它失败并出现以下错误:

错误:无法将多个命令插入预准备语句

我尝试使用DBI :: DatabaseHandle #do的“无准备”方式(文档称它“直接进入DBD的实现”)但它仍然会抛出相同的错误。

代码段:

require 'dbd/pg'
require 'dbi'

DBI.connect("dbi:pg:database=dbname", db_user, db_password, db_params) do |dbh|
  schema = IO::read(schema_file)
  dbh.do(schema)
end

我正在使用

ruby​​ 1.8.6(2007-09-24 patchlevel 111)[i386-mswin32]

DBI-0.4.3

DBD-PG-0.3.9

PG-0.9.0 86 mswin32

谢谢!

2 个答案:

答案 0 :(得分:2)

使用某个函数或只运行多个准备好的查询。

答案 1 :(得分:0)

使用DatabaseHandle#do运行多个查询是DBD-Pg中缺少的功能。请参阅Ruby / DBI功能28001

请注意,Pg是DBD-Pg所基于的本机postgresql Ruby驱动程序,它允许运行多个查询。

示例:

require 'pg'
require 'dbd/pg'
require 'dbi'

# Pg Succeeds
PGconn.new({:host=>host,:user=>user,:password=>password,:dbname=>dbname}) do |conn|
  conn.exec("select 1; select 1;")
end

# DBD-Pg Fails with: ERROR: cannot insert multiple commands ...
DBI::connect("dbi:pg:database=#{dbname};host=#{host};", user, password) do |dbh|
  dbh.do("select 1; select 1;")
end