LoginSignup
2
0

More than 5 years have passed since last update.

EC2上でactiverecord-importのbulk upsertをsqlite3で使いたい

Posted at

まとめると

  • ec2上で activerecord-importbulk upsert を使いたい
  • 使うデータベースは sqlite3
  • ただ、ec2上で簡単にインストールできる sqlite3 のバージョンは、 bulk upsert に対応していない
  • 頑張って新しいバージョンの sqlite3 をダウンロードし、なんとしても bulk upsert する。

背景

Rubyで大量のデータを扱いたい、railsじゃないけどactiverecordの恩恵を受けたい、というそこのアタナ、こんなgemがあります。

activerecord-import

activerecord-import is a library for bulk inserting data using ActiveRecord.

素晴らしい。
もちろんbulk insertもしたいのですが、すこし欲張って、bulk upsertもしたい。そんなときがありました。

ここがbulk upsertの説明部分です

MySQL, PostgreSQL (9.5+), and SQLite (3.24.0+) support on duplicate key update (also known as "upsert") which allows you to specify fields whose values should be updated if a primary or unique key constraint is violated.

One big difference between MySQL and PostgreSQL support is that MySQL will handle any conflict that happens, but PostgreSQL requires that you specify which columns the conflict would occur over. SQLite models its upsert support after PostgreSQL.

This will use MySQL's ON DUPLICATE KEY UPDATE or Postgres/SQLite ON CONFLICT DO UPDATE to do upsert.

ここで注目すべきは、バージョンの部分。

SQLite (3.24.0+)

このバージョンを満たしていないと、以下のようなエラーが出ます

/Users/matt/.chefdk/gem/ruby/2.4.0/gems/activerecord-import-0.22.0/lib/activerecord-import/adapters/abstract_adapter.rb:50:in `post_sql_statements': private method `warn' called for nil:NilClass (NoMethodError)
    from /Users/matt/.chefdk/gem/ruby/2.4.0/gems/activerecord-import-0.22.0/lib/activerecord-import/import.rb:709:in `import_without_validations_or_callbacks'
    from /Users/matt/.chefdk/gem/ruby/2.4.0/gems/activerecord-import-0.22.0/lib/activerecord-import/import.rb:662:in `import_with_validations'
    from /Users/matt/.chefdk/gem/ruby/2.4.0/gems/activerecord-import-0.22.0/lib/activerecord-import/import.rb:602:in `import_helper'
    from /Users/matt/.chefdk/gem/ruby/2.4.0/gems/activerecord-import-0.22.0/lib/activerecord-import/import.rb:458:in `import'
    from load_person_data.rb:194:in `block in <main>'

Macユーザーだと、brew経由でこのバージョンをインストールできるのですが、EC2上だとそうも行きませんでした。

ほしいバージョンのsqlite3をインストールする

ここからが本題です。
OSはubuntuを使っています。
手順は以下。

  1. パッケージのダウンロード
  2. パッケージの展開
  3. パッケージのビルド
  4. パッケージのインストール

1. パッケージのダウンロード

sqlite3 のパッケージのページを訪れ、以下のダウンロードリンクを確認

それぞれ wgetでダウンロードしてくる

wget http://archive.ubuntu.com/ubuntu/pool/main/s/sqlite3/sqlite3_3.24.0-1.dsc
wget http://archive.ubuntu.com/ubuntu/pool/main/s/sqlite3/sqlite3_3.24.0.orig-www.tar.xz
wget http://archive.ubuntu.com/ubuntu/pool/main/s/sqlite3/sqlite3_3.24.0.orig.tar.xz
wget http://archive.ubuntu.com/ubuntu/pool/main/s/sqlite3/sqlite3_3.24.0-1.debian.tar.xz

2. パッケージの展開

dpkg-source -x sqlite3_3.24.0-1.dsc

3. パッケージのビルド

# 前項で展開されたディレクトリに移動
cd sqlite3-3.24.0/
sudo dpkg-buildpackage -d -uc -us

4. パッケージのインストール

# 依存関係があるので、この順番で。
sudo dpkg -i libsqlite3-0_3.24.0-1_amd64.deb
sudo dpkg -i libsqlite3-dev_3.24.0-1_amd64.deb
sudo dpkg -i sqlite3_3.24.0-1_amd64.deb

これで sqlite3 でも、 bulk upsert 使えます、ヤッタネ。

さいごに

ubuntu初心者なので、もっと簡単にインストールするやり方があればご教示ください。。。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0