AmazonLinux2 + Ruby on Rails6でSQLite古いエラー


エンタメ系企業の社内もろもろを担当しているakibinです。

Twitterアカウント @AkibinMusic
Youtubeチャンネル

内容

AmazonLinux2を立てて、Railsをインストールしたけどアプリ起動したら以下がエラーが出た場合の対処方法を書き書きします。

【エラー】
Your version of SQLite (3.7.17) is too old. Active Record supports SQLite >= 3.8.

なぜエラーが出るのか

AmazonLinux2にはsqlite3のバージョン3.7がデフォルトでインストールされており、これがyumで利用しているらしく、削除することはできません。がしかし、Rails 6を動かすには、sqlite3のバージョン3.8以上が必要なので、古い!と↑で怒ってるんですね。

対処方法

既存のSQLiteはほっておいて、3.8以上のSQLiteを別途インストールします。

# アプリ用のユーザのホームディレクトリで作業(私は)
$ cd /home/appuser 
# 3.34.0をダウンロード
$ wget https://www.sqlite.org/2020/sqlite-autoconf-3340000.tar.gz
$ tar xzvf sqlite-autoconf-3340000.tar.gz
$ cd sqlite-autoconf-3340000
# もとから入っているsqliteと競合しないように /opt/sqlite/sqlite3にインストールする
$ ./configure --prefix=/opt/sqlite/sqlite3
$ make
$ sudo make install
# バージョン確認
$ /opt/sqlite/sqlite3/bin/sqlite3 --version
3.34.0 2020-12-01 16:14:00 a26b6597e3ae272231b96f9982c3bcc17ddec2f2b6eb4df06a224b91089fed5b

アプリで使用するSQLiteとして、今回インストールしたSQLiteをgemで指定する。

# アプリ用のディレクトリに移動
$ cd /var/www/rails/webapp 
# gemで新しいSQLiteを指定
$ gem install sqlite3 -- --with-sqlite3-include=/opt/sqlite/sqlite3/include \
   --with-sqlite3-lib=/opt/sqlite/sqlite3/lib
# 指定が正しくできているか確認
$ irb
irb(main):001:0> require 'sqlite3'
=> true
irb(main):002:0> SQLite3::SQLITE_VERSION
=> "3.34.0"  # できてる
irb(main):003:0> exit

あと新しいSQLiteにパスを通す必要があるので以下作業実施。

$ echo 'export LD_LIBRARY_PATH="/opt/sqlite/sqlite3/lib"' >> .bash_profile
$ source .bash_profile

これで再度アプリ起動するとエラー解消して以下が出ました!

こちらの記事参照してSQLite部分のみ抜粋させていただきました!わかりやすかったです!

今年も終わるは早いわ…

2020年12月31日:SQLiteが使えなかったので追記

SQLiteを使おうとしたところ、以下エラーが発生しました。

user$ sqlite3
sqlite header and source version mismatch linux
新しいバージョン
古いバージョン

SQLiteへのリンクが古いほうになっていることで発生しているようです。
リンク先を新しい方にします。

user$ sudo mv /usr/bin/sqlite3 /usr/bin/sqlite3_old #古いバージョンを一応バックアップ
user$ sudo ln -s /opt/sqlite/sqlite3/bin/sqlite3 /usr/bin/sqlite3 #新しいバージョンへシンボリックリンクをはる
user$ sqlite3 -version
3.34.0 2020-12-01 16:14:00 a26b6597e3ae272231b96f9982c3bcc17ddec2f2b6eb4df06a224b91089fed5b
user$ sqlite3
SQLite version 3.34.0 2020-12-01 16:14:00
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> 

使えるようになりました!

年末の早朝(am6:00)にこれやってると思わなかったぞ、初めにこの記事書いた俺よ…

良いお年を。