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

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

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

3123閲覧

ruby on rails6でSQL文ファイルのデータを自動的にmysqlに投入したい

zendendo

総合スコア43

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/03/19 02:03

編集2020/03/19 02:10

前提・実現したいこと

ruby on rails6でmysqlを使っており、
テスト用のデータが入ったSQL文ファイルを自動的に投入したいのですが、
やり方がわからなくて困っています。

今までは、
DB Browser for SQLiteで作成したデータをSQL文としてエクスポートし、
手動で
rails dbでmysqlに接続して
source エクスポートしたSQLファイル
で投入していました。

全てのテーブルをcsvにしてから投入も考えましたが、
テーブルが多いので、
なんとか単一のSQLファイルからテストデータの投入を自動的に投入できないか
方法を探しています。

やり方を知っている方、教えていただければ幸いです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサーにしたURL先に記載されていたコードをそのまま使うとうまく行かなかった部分があったので、
修正します。
最終的に成功したコードはこちら。

ruby

1connection = ActiveRecord::Base.connection#rails上で生SQLを実行するために必要 2sql = File.read('db/backup.sql')#文字列としてファイル内容を読み込む 3statements = sql.split(/;$/)#改行ごとに分けて配列にする 4statements.shift#先頭の行を削除 5statements.pop#末尾の行を削除 6ActiveRecord::Base.transaction do 7 statements.each do |statement| 8 connection.execute(statement)#配列ごとに生SQL文として実行する 9 end 10end 11

SQL文の中身は以下の通りです。```ここに言語を入力
BEGIN TRANSACTION;
INSERT INTO states VALUES (12,'SQLテストのための投入33','説明文です1','2018-09-01 00:00:00.00004','2018-09-01 00:00:00.00005');
INSERT INTO states VALUES (13,'SQLテストのための投入33','説明文です2','2018-09-01 00:00:00.00004','2018-09-01 00:00:00.00005');
COMMIT;

先頭と末尾のBEGIN TRANSACTION;とCOMMIT;が余分なので statements.shift statements.pop で取り除きます。 あとは繰り返し作業で生SQLとして実行します。

投稿2020/03/19 08:05

zendendo

総合スコア43

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

seedを使ってはいかがでしょうか。

https://www.javadrive.jp/rails/model/index10.html


追記:
seedの中にActiveRecord::Base.connection.executeを用いることで、
任意のSQLを実行することができます。
以下のコードが役に立つかとおもいます。

https://gist.github.com/seyhunak/7843549

投稿2020/03/19 02:07

編集2020/03/19 03:34
kokemomo.sour

総合スコア330

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zendendo

2020/03/19 02:20

kokemomo.sourさん、ありがとうございます。 seedではCSVを読み込めるとのことですが、 複数のテーブルへのinsertを記述した単一SQL文ファイルを読み込ませるということは可能なのでしょうか?
kokemomo.sour

2020/03/19 03:35

zendendoさん はい、可能です。 回答に追記したのでご参照ください。 Orlofskyさん ご指摘ありがとうございます。編集いたしました。
zendendo

2020/03/19 07:44

解決することができました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問