2017-03-02 81 views
0

我在运行包含多个在数据库中创建表的sql查询的sql文件时遇到问题。 db是DB2,我创建了一个迁移文件,它在其中读取一个sql文件并执行该文件中的sql查询,问题是它只执行一个查询,并且只在该sql文件中创建一个表,即哪个是第一个查询。使用rails迁移文件运行sql文件

不知道如何解决这个问题

代码sniplet低于:

enter code here 
class CreateTablesForPoject < ActiveRecord::Migration 
    def change 
    begin 
     user = RailsUser.first 
    rescue => e 
    fixed_patches = %w(CREATETABLES.sql) 

    sql = File.read("db/ddl/#{fixed_patches.first}") 

    statements = sql.split(/;$/) 

    statements.each do |statement| 
     execute(statement) 
    end 
    end 
    end 
end 

注:文件读取和查询的分裂都很好..它没有任何问题迁移运行并执行所有查询,但当alter table查询或基于先前表创建的任何查询失败时失败。我感觉到的问题是,在运行一个查询后,db连接关闭,所以表不会创建,因此基于透明表创建的查询将失败。

+0

你尝试过什么样的调试?例如对报表的分配结果是什么?这个分裂陈述是否会返回你期望的结果? File.read语句的同上。 – margo

+0

@margo:文件读取和查询拆分都没有问题。它没有任何问题 迁移运行并执行所有查询,但当alter table查询或基于前一个表的任何查询创作失败。 我觉得这个问题是,运行一个查询后数据库连接关闭,所以表不会创建,所以查询基于透明表创建失败 – SRDP

回答

0

尝试了这一点:

class CreateTablesForPoject < ActiveRecord::Migration 
    def change 
    begin 
     user = RailsUser.first 
    rescue => e 
    fixed_patches = %w(CREATETABLES.sql) 

    sql = File.read("db/ddl/#{fixed_patches.first}") 
    statements = sql.split(/;/) 
    statements.pop # remote empty line 
    ActiveRecord::Base.transaction do 
     statements.each do |statement| 
     connection.execute(statement) 
     end 
    end 
    end 
end 
+0

它没有工作,我一开始尝试这种方法 – SRDP