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

# まとめると

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


# 背景

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

[activerecord-import](https://github.com/zdennis/activerecord-import)

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

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

[ここがbulk upsertの説明部分です](https://github.com/zdennis/activerecord-import#duplicate-key-update)

> 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 のパッケージのページ](https://packages.ubuntu.com/cosmic/sqlite3)を訪れ、以下のダウンロードリンクを確認

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

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

```bash
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. パッケージの展開

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

### 3. パッケージのビルド

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

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

```bash
# 依存関係があるので、この順番で。
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初心者なので、もっと簡単にインストールするやり方があればご教示ください。。。