質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.34%

perlでMySQL上にDBを作成する際のエラーについて

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,764

oh__307

score 7

OrthoMCLというツールを用いてクラスタリングしたいと考えているのですが、これをする際にperl経由でMySQLに接続しDBを作成する手順があるのですが、DBDやDBIのperl moduleを入れて実行しています。

#!/usr/bin/perl

use DBI;
use FindBin;
use lib "$FindBin::Bin/../lib/perl";
use OrthoMCLEngine::Main::Base;
use strict;

usage() unless (@ARGV >= 2);
my $configFile = $ARGV[0];
my $blastFile = $ARGV[1];

my $base = OrthoMCLEngine::Main::Base->new($configFile);
my $dbh = $base->getDbh();

my $dbVendor = $base->getConfig("dbVendor");

if ($dbVendor eq 'mysql') {
  loadBlastMySQL($base, $blastFile);
}
elsif ($dbVendor eq 'oracle') {
  loadBlastOracle($base, $blastFile);
} else {
  die "Config file '$configFile' contains invalid value '$dbVendor' for dbVendor\n";
}

sub loadBlastMySQL {
  my ($base, $blastFile) = @_;
  require DBD::mysql;
  my $dbh = $base->getDbh();
  my $sst = $base->getConfig("similarSequencesTable");
  my $sql = "
 LOAD DATA
 LOCAL INFILE \"$blastFile\"
 REPLACE INTO TABLE $sst
 FIELDS TERMINATED BY '\\t'
";
  my $stmt = $dbh->prepare($sql) or die DBI::errstr;
  $stmt->execute() or die DBI::errstr;
}


sub loadBlastOracle {
  my ($base, $blastFile) = @_;

  my $dbLogin = $base->getConfig("dbLogin");
  my $dbPassword = $base->getConfig("dbPassword");
  my $dbString = $base->getConfig("dbConnectString");
  my @database = split(/:/, $dbString);
  my $dbInstance = $database[2];

  open (PARFILE, ">orthomclPar.tmp");
  print PARFILE "userid=$dbLogin/$dbPassword\@$dbInstance\n";
  close PARFILE;

  my $sst = $base->getConfig("similarSequencesTable");

  my $sqlHeader = "
LOAD DATA
INFILE '$blastFile' 
INTO TABLE $sst
FIELDS TERMINATED BY \"\\t\" OPTIONALLY ENCLOSED BY '\"'
TRAILING NULLCOLS
(  query_id,
    subject_id,
    query_taxon_id,
    subject_taxon_id,
    evalue_mant,
    evalue_exp,
    percent_identity,
    percent_match
)
";

  open (CTLFILE, ">orthomclCtl.tmp");
  print CTLFILE $sqlHeader;
  close CTLFILE;

  my $command=`sqlldr parfile=orthomclPar.tmp control=orthomclCtl.tmp`;
  unlink("orthomclCtl.tmp", "orthomclPar.tmp");
}

sub usage {
die "
Load Blast results into an Oracle or Mysql database.

usage: orthomclLoadBlast config_file similar_seqs_file

where:
  config_file :       see below
  similar_seqs_file : output from orthomclParseBlast 

EXAMPLE: orthomclSoftware/bin/orthomclLoadBlast my_orthomcl_dir/orthomcl.config my_orthomcl_dir/similarSequences.txt

NOTE: the database login in the config file must have update/insert/truncate privileges on the tables specified in the config file.

Sample Config File:

dbVendor=oracle  (or mysql)
dbConnectString=dbi:Oracle:orthomcl
dbLogin=my_db_login
dbPassword=my_db_password
similarSequencesTable=SimilarSequences
";
}


以上のコードでタブ区切りの.txtファイルをそのままMySQL上にDBを作れるはずなのですが、

DBD::mysql::st execute failed: Table 'mysql.similarsequences' doesn't exist at ../orthomclLoadBlast line 39, <F> line 14.


というエラーコードが出てきます。
また、

# this config assumes a mysql database named 'orthomcl'.  adjust according
# to your situation.
dbVendor=mysql 
dbConnectString=dbi:mysql:mysql
dbLogin=root
dbPassword=insideout
similarSequencesTable=SimilarSequences
orthologTable=Ortholog
inParalogTable=InParalog
coOrthologTable=CoOrtholog
interTaxonMatchView=InterTaxonMatch
percentMatchCutoff=50
evalueExponentCutoff=-5
oracleIndexTblSpc=NONE


以上のconfigファイルの中身と見比べてみてもsimilarSequencesTable=SimilarSequences となっておりそれで大丈夫だと思っているのですがなぜかエラーが出続けます。
どなたかこのエラーに対するアドバイスをいただけたらと思います。宜しくお願いします。

ちなみにperl -v でv5.18.2
Mac OS X 10.10.5
MySQL-5.7.10
です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

詳しくは調べていませんが、気になる点としては、データベース名がmysql(MySQL自体が使うデータベース)になっているというのがまずあります。
これ自体はconfigファイルに修正が必要かと思います。(dbConnectStringのところ)
ユーザーガイドを眺めてみましたが、orthomclInstallSchemaというのを実行しないとデータベースの中身(テーブルとか)は作成されないような気がしますが、手順通りに使用されているでしょうか?
ちなみに、上記以前に、MySQLのユーザーやデータベースの作成は先にする必要があるかと思います。
参考までに、質問に出ているエラーは、テーブルが存在しないと言うエラーかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/24 16:14

    回答ありがとうございます。orthomclInstallSchema実行をしたつもりになっていたみたいで、再度やり直したところエラーが出ずプログラムが動き始めました。
    すごい簡単な、コードとかほとんど関係ないところでのミスでしたすみません。
    自分の中でチェックしていたつもりでしたが抜けていたので次回からはしっかり自分の中で確認します。
    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る