

`ruby`で`sql`文を書いたテキストファイル`sql.txt`を読み込み、`mysql2`で実行したいのですが、うまく行きません。

[code]

    # DB設定
    db = Mysql2::Client.new(...)
    
    
    # sql文の読み込み
    sql = ''
    File.open("./sql.txt","r") do |f|
        sql = f.read
    end
    
    # 実行
    db.query(sql)
    
[/code]

`sql.txt`の中に1つの`sql`を書いた場合はうまくいくのですが、複数かくとエラーがでます。  
なにかよい方法はないでしょうか。

成功する`sql.txt`

[code]

    SELECT *
    FROM `test`;
    
[/code]

失敗する`sql.txt`

[code]

    SELECT *
    FROM `test`;
    SELECT *
    FROM `test`;
    
[/code]


CC BY-SA 3.0
2015-02-25T02:16:53.593
7051
2015-02-26T04:06:58.390
2015-02-25T02:45:48.727
76
7339
question
ruby mysql
Mysql2::Client で複数のSQL文を実行したい


Mysql2::Client.new に `:flags => Mysql2::Client::MULTI_STATEMENTS`
を与えると複数のSQL文を実行できます。結果を取り出したい場合には、次のようにします。

[code]

    result = db.query(sql)
    pp result.first
    while db.next_result
      result = db.store_result
      pp result.first
    end
    
[/code]

参考: [brianmario/mysql2: Multiple result
sets](https://github.com/brianmario/mysql2#multiple-result-
sets%20Multiple%20result%20sets)


CC BY-SA 3.0
2015-02-25T02:44:46.160
7052
2015-02-25T02:44:46.160
76
7051
answer


どうしてもプログラム中で複文を実行しなければならない場合であれば[yasuさんの回答](https://ja.stackoverflow.com/a/7052/5793)の通りです。

ファイルに保存されたSQLを実行したいだけであれば、

[code]

    $ mysql dbname < sql.txt
    
[/code]

でもできます。

[yasuさんの回答](https://ja.stackoverflow.com/a/7052/5793)の通り、複文を扱う場合結果の取得が面倒になるので、ファイルから読み込みつつ1つのSQL単位で実行するという手もあります。

[code]

    sql = ''
    IO.foreach("./sql.txt") do |line|
      sql += line
      if sql =~ /;\s*\z/ #セミコロンで終わっている行が現れたらSQLの区切りと見なす
        db.query(sql)
        sql = ''
      end
    end
    
[/code]


CC BY-SA 3.0
2015-02-26T04:06:58.390
7110
2015-02-26T04:06:58.390
2017-04-13T12:52:39.113
-1
5793
7051
answer