2011-09-14 82 views
0

我有一个从文件(genbank)中提取信息的ruby脚本,我想将这些数据加载到数据库中。我创建了模型和架构,并连接脚本:如何使用activerecord将数据加载到数据库中

require 'active_record' 
def establish_connection(db_location= "protein.db.sqlite3") 
    ActiveRecord::Base.establish_connection(
    :adapter => "sqlite3", 
    :database => db_location, 
    :pool => 5, 
    :timeout => 5000 
) 
end 

这是我的脚本,输出数据:

require 'rubygems' 
require 'bio' 
require 'snp_db_models' 
establish_connection 

snp_positions_file = File.open("snp_position.txt") 
outfile = File.open("output.txt", "w") 
genome_sequence = Bio::FlatFile.open(Bio::EMBL, "ref.embl").next_entry 

snp_positions = Array.new 
snp_positions_file.gets # header line 
while line = snp_positions_file.gets 
    snp_details = line.chomp.split("\t") 
    snp_seq = snp_details[1] 
    snp_positions << snp_details[1].to_i 
end 


mean_snp_per_base = snp_positions.size/genome_sequence.sequence_length.to_f 
puts "Mean snps per base: #{mean_snp_per_base}" 

#outfile = File.open("/Volumes/DataRAID/Projects/GAS/fastq_files/bowtie_results/snp_annotation/genes_with_higher_snps.tsv", "w") 
outfile.puts("CDS start\tCDS end\tStrand\tGene\tLocus_tag\tnote\tsnp_ID\ttranslation_seq\tProduct\tNo_of_snps_per_gene\tsnp_rate_vs_mean") 

genome_sequence.features do |feature| 
    if feature.feature !~ /gene/i && feature.feature !~ /source/i 
    start_pos = feature.locations.locations.first.from 
    end_pos = feature.locations.locations.first.to 

    number_of_snps_in_gene = (snp_positions & (start_pos..end_pos).to_a).size # intersect finds number of times snp occurs within cds location 
    mean_snp_per_base_in_gene = number_of_snps_in_gene.to_f/(end_pos - start_pos) 

    outfile.print "#{start_pos}\t" 
    outfile.print "#{end_pos}\t" 
    if feature.locations.locations.first.strand == 1 
     outfile.print "forward\t" 
    else 
     outfile.print "reverse\t" 
    end 

    qualifiers = feature.to_hash 

    ["gene", "locus_tag", "note", "snp_id", "translation", "product"].each do |qualifier| 
     if qualifiers.has_key?(qualifier) # if there is gene and product in the file 
     # puts "#{qualifier}: #{qualifiers[qualifier]}" 

     outfile.print "#{qualifiers[qualifier].join(",")}\t" 
     else 
     outfile.print " \t" 
     end 
    end 

    outfile.print "#{number_of_snps_in_gene}\t" 
    outfile.print "%.2f" % (mean_snp_per_base_in_gene/mean_snp_per_base) 
    outfile.puts 
end 
end 
outfile.close 

我怎样才能在outfile.txt加载数据到数据库中。我需要做像马歇尔转储一样的东西吗?

在此先感谢

马克

+0

按照您的评论重新标记为Ruby。 –

回答

0

你可以写一个耙子任务来完成。将它保存在lib/tasks并给它一个.rake扩展名。

desc "rake task to load data into db" 
task :load_data_db => :environment do 
    ... 
end 

由于rails环境已加载,您可以直接访问您的模型,就像在任何Rails模型/控制器中一样。当然,它将连接到数据库,具体取决于执行您的rake任务时定义的环境变量。

+0

我还没有创建一个Web应用程序,所以我没有lib /任务。我刚刚创建了一个使用activerecord的数据库,并且希望将这些数据转储到其中 – Mark

+0

这个问题不应该被标记为'Ruby on Rails',而是'Ruby'。 @查看apneadiving的方法。 –

0

在一个纯粹的脚本中,你的模型是未知的。

你必须定义一个最小值来使用它们,就像在Rails应用程序中一样。简单地声明它们:

class Foo << ActiveRecord:Base 

end 

否则,在Rails上下文中,使用Rake任务,这些任务知道Rails应用程序的详细信息。

+1

谢谢,但如何将数据转储到数据库? – Mark

+0

你应该为每种数据创建一个模型+必要的迁移来创建数据库中的列和表。一旦完成,只需使用ActiveRecord syntaxic sugar'Foo.create(:bar =>“value”,:baz => 123)' – apneadiving

+0

我创建了模型并创建了表格等。上面的脚本的输出是文件与线和9列的hundereds。我想自动转储它。我是否写了一个脚本来读取outfile的每一行并转储它,或者使用诸如marshal dump之类的东西? – Mark

相关问题