2010-03-09 169 views
0

使用DBI :: DatabaseHandle#execute或DBI :: DatabaseHandle#准备好无法运行sql脚本(使用多个sql语句)。它失败,出现以下错误:从Ruby运行sql脚本

错误:无法插入多个命令插入事先准备好的声明

我试图用使用DBI :: DatabaseHandle#做到“措手不及”的方式(商务部说,“去直接到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 

我使用

红宝石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

谢谢!

回答

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 
2

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

+0

为了运行多个准备好的查询我需要使用一些SQL解析器我想分析SQL脚本?如何在ruby中做到这一点? 我不明白你使用函数的要点。 – nakhli 2010-03-10 09:02:18

+0

我在谈论一个PostgreSQL函数,而不是一个ruby函数。 – 2010-03-11 17:41:08