Как я могу загрузить данные в базу данных с помощью activerecord - PullRequest
0 голосов
/ 14 сентября 2011

У меня есть скрипт ruby, который извлекает информацию из файла (genbank), и я хочу загрузить эти данные в базу данных Я создал модель, схему и скрипт подключения:

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 в базу данных. Должен ли я сделать что-то вроде свалки с маршалом?

Заранее спасибо

Mark

Ответы [ 2 ]

0 голосов
/ 14 сентября 2011

В простом сценарии ваши модели неизвестны.

Вы должны определить минимум, чтобы использовать их, как будто в приложении Rails.Просто объявите их:

 class Foo << ActiveRecord:Base

 end

В противном случае, в контексте Rails используйте задачи rake, которые осведомлены о деталях приложения Rails.

0 голосов
/ 14 сентября 2011

Вы можете написать грабли для этого. Сохраните его в lib/tasks и укажите расширение .rake.

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

Поскольку среда rails загружена, вы можете обращаться к своей модели напрямую, как в любой модели / контроллере Rails. Конечно, он будет подключаться к базе данных в зависимости от переменной среды, определенной при выполнении вашей задачи rake.

...