Railsデータベースデータをエクスポートするための最良の方法

スヴェン・キルステン

RAILS 5.1

PostgreSQLをデータベースとして使用しているRAILSアプリケーションがあります。RAILSの観点からRAILSデータベースデータをエクスポート/ダンプしたいと思います。だから私はデータベースから独立しています。後で、このエクスポート/ダンプファイルを使用して、データをデータベースにロード/インポート/シードし直したいと思います。

私は次のGEMを試しました:

  • seed_dump
    動作しますが、HABTMモデルの関係を処理できません。

  • yaml_db、動作しますが、yaml形式はrails db:seedによって理解される形式ではありません

rbb

JSONにエクスポートする実際の例を次に示します。私はこの種のことをするためにレーキタスクを使用します。この例では、usersテーブルをダンプしています。

namespace :dataexport do
  desc 'export sers who have logged in since 2017-06-30'
  task :recent_users => :environment do
    puts "Export users who have logged in since 2017-06-30"

    # get a file ready, the 'data' directory has already been added in Rails.root
    filepath = File.join(Rails.root, 'data', 'recent_users.json')
    puts "- exporting users into #{filepath}"

    # the key here is to use 'as_json', otherwise you get an ActiveRecord_Relation object, which extends
    # array, and works like in an array, but not for exporting
    users = User.where('last_login > ?', '2017-06-30').as_json

    # The pretty is nice so I can diff exports easily, if that's not important, JSON(users) will do
    File.open(filepath, 'w') do |f|
      f.write(JSON.pretty_generate(users))
    end

    puts "- dumped #{users.size} users"
  end
end

そしてインポート

namespace :dataimport do
  desc 'import users from recent users dump'
  task :recent_users => :environment do
    puts "Importing current users"

    filepath = File.join(Rails.root, 'data', 'recent_users.json')
    abort "Input file not found: #{filepath}" unless File.exist?(filepath)

    current_users = JSON.parse(File.read(filepath))

    current_users.each do |cu|
      User.create(cu)
    end

    puts "- imported #{current_users.size} users"
  end
end

インポートプロセスの一部として、クリーンなテーブルをインポートしたい場合があります。その場合、タスクは次のように開始します。

ActiveRecord::Base.connection.execute("TRUNCATE users")

これは、50,000行を超える、またはテキストフィールドが多い、本当に大きなテーブルを処理するための最良の方法ではありません。その場合、dbネイティブダンプ/インポートツールがより適切です。

完全を期すために、HABTMの例を次に示します。リンクテーブルはまだありますが、モデルがないため、それを使用して何かを行う唯一の方法は生のSQLです。たとえば、ユーザーに多くの役割があり、その逆(ユーザーのM:M役割)があると想像してみましょう。

class User < ApplicationRecord
  has_and_belongs_to_many :roles
end

class Role < ApplicationRecord
  has_and_belongs_to_many :users
end

必ずしもそこと呼ばれる参加テーブルだろうusers_roles2つの列を持っていることになる、user_idrole_idHABTMのRailsガイドを参照してください

エクスポートするには、SQLを直接実行する必要があります。

users_roles = ActiveRecord::Base.connection.execute("SELECT * from users_roles").as_json
# and write the file as before

SQLを実行してインポートします

# read the file, same as before
user_roles.each do |ur|
  ActiveRecord::Base.connection.execute("insert into users_roles (user_id, role_id) values ('#{ur[0]}', '#{ur[1]}')")
end

生のSQLを使用した挿入の詳細については、この回答を参照してください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

OracleDBからOracleDBに巨大なデータをエクスポートするための最良の方法

分類Dev

C#でCassandraクラスターにデータをインポートするための最良の方法

分類Dev

Firebaseデータベースのリストにデータを追加するための最良の方法

分類Dev

Neo4jデータベースをCSVにエクスポートする最良の方法

分類Dev

NOSQL データベースで GPS ポイントを検索するための最良の方法

分類Dev

データベースに日付を保存するための最良の方法

分類Dev

mysqlデータベースを視覚化するための最良の方法

分類Dev

MSSQLサーバーからデータをエクスポートするためのより良い方法

分類Dev

関連するグループからデータをエクスポートするための最良のSQLクエリ方法は何ですか?

分類Dev

MySQLでデータベースインデックスを作成するための最良の方法

分類Dev

製品バリエーションのデータベースを設計するための最良の方法

分類Dev

データベースfirebasejavascriptからエラーをキャプチャするための最良の方法

分類Dev

PHPでDBデータをエクスポート、変更、インポートするための最良の方法

分類Dev

チェックリストを表示するためにデータベースにクエリを実行するMySQLの最良の方法

分類Dev

Firebaseデータベースの複数の場所にデータを配置するための最良の方法

分類Dev

データベースに多くのデータを保存するための最良の方法

分類Dev

Djangoでユーザーがトリガーしたタスク(データのインポートなど)を処理するための最良の方法

分類Dev

データベースからデータを取得するための最良の方法は何ですか?

分類Dev

データを渡してオブジェクトをエクスポートするための最良の方法は何ですか?

分類Dev

データベースに多言語データを保存するための最良の方法

分類Dev

APIを使用してすべてのNestuiteデータをエクスポートするための最良の方法は何ですか

分類Dev

Laravelのデータベースに接続するための最良の方法

分類Dev

データベースにエントリを挿入する最良の方法

分類Dev

SQL Serverデータベースをsqlite(またはSQL Server Compact)にエクスポートする最良の方法

分類Dev

データを下位データベースクエリに相互接続するための最良の方法[一般、言語固有なし]

分類Dev

TypeScriptでクラスとタイプの両方をエクスポートするための最良の方法

分類Dev

データベース設計のための最良の方法

分類Dev

IOSでサーバー側のデータベース遅延を解決するための最良の方法

分類Dev

リストからデータを抽出するための最良の方法

Related 関連記事

  1. 1

    OracleDBからOracleDBに巨大なデータをエクスポートするための最良の方法

  2. 2

    C#でCassandraクラスターにデータをインポートするための最良の方法

  3. 3

    Firebaseデータベースのリストにデータを追加するための最良の方法

  4. 4

    Neo4jデータベースをCSVにエクスポートする最良の方法

  5. 5

    NOSQL データベースで GPS ポイントを検索するための最良の方法

  6. 6

    データベースに日付を保存するための最良の方法

  7. 7

    mysqlデータベースを視覚化するための最良の方法

  8. 8

    MSSQLサーバーからデータをエクスポートするためのより良い方法

  9. 9

    関連するグループからデータをエクスポートするための最良のSQLクエリ方法は何ですか?

  10. 10

    MySQLでデータベースインデックスを作成するための最良の方法

  11. 11

    製品バリエーションのデータベースを設計するための最良の方法

  12. 12

    データベースfirebasejavascriptからエラーをキャプチャするための最良の方法

  13. 13

    PHPでDBデータをエクスポート、変更、インポートするための最良の方法

  14. 14

    チェックリストを表示するためにデータベースにクエリを実行するMySQLの最良の方法

  15. 15

    Firebaseデータベースの複数の場所にデータを配置するための最良の方法

  16. 16

    データベースに多くのデータを保存するための最良の方法

  17. 17

    Djangoでユーザーがトリガーしたタスク(データのインポートなど)を処理するための最良の方法

  18. 18

    データベースからデータを取得するための最良の方法は何ですか?

  19. 19

    データを渡してオブジェクトをエクスポートするための最良の方法は何ですか?

  20. 20

    データベースに多言語データを保存するための最良の方法

  21. 21

    APIを使用してすべてのNestuiteデータをエクスポートするための最良の方法は何ですか

  22. 22

    Laravelのデータベースに接続するための最良の方法

  23. 23

    データベースにエントリを挿入する最良の方法

  24. 24

    SQL Serverデータベースをsqlite(またはSQL Server Compact)にエクスポートする最良の方法

  25. 25

    データを下位データベースクエリに相互接続するための最良の方法[一般、言語固有なし]

  26. 26

    TypeScriptでクラスとタイプの両方をエクスポートするための最良の方法

  27. 27

    データベース設計のための最良の方法

  28. 28

    IOSでサーバー側のデータベース遅延を解決するための最良の方法

  29. 29

    リストからデータを抽出するための最良の方法

ホットタグ

アーカイブ