Python3 からいろいろなバージョンの SQLite3 を使ってみましょう!

# はじめに

Python3 で、いろいろなバージョンの SQLite3 や自分たちで改良した SQLite3 を使う必要がありまして、備忘録としてまとめました。

# 環境

OS は、CentOS 7.7 を使用しています。Proxyなどを設定して、外部にアクセスできる状況になっています。

```bash
$ cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
```

まず、Python3 をインストールします。Python3 のバージョンは 3.6.8 です。

```bash
$ sudo yum install python3
$ python3 --version
Python 3.6.8
```

SQLite3 のバージョンを SQLite3 コマンドと Python3 で確認します。

```bash
$ sqlite3 --version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668
$ python3
Python 3.6.8 (default, Aug  7 2019, 17:28:10) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.7.17'
```

SQLite 3.7.17 がインストールされていて、Python3 からも SQLite 3.7.17 が使用されています。

# Python3 で SQLite 3.31.1 を使用

SQLite3 の最新版(3.31.1)を入手しましょう。wgetで入手して展開した後、ディレクトリ名を sqlite-3.31.01 に変更しておきます。

```bash
$ wget https://www.sqlite.org/2020/sqlite-autoconf-3310100.tar.gz
$ tar zxvf sqlite-autoconf-3310100.tar.gz
$ mv sqlite-autoconf-3310100 sqlite-3.31.01
```

SQLite3 をビルドします。

```bash
$ cd sqlite-3.31.01
$ ./configure
$ make
$ ./sqlite3 --version
3.31.1 2020-01-27 19:55:54 3bfa9cc97da10598521b342961df8f5f68c7388fa117345eeb516eaa837bb4d6
```

ファイルを確認します。ディレクトリ .libs に SQLite3 ライブラリが置かれます。

```bash
$ ls -a
.            Makefile.fallback  config.guess   install-sh     sqlite3-shell.o    sqlite3.pc
..           Makefile.in        config.log     libsqlite3.la  sqlite3-sqlite3.o  sqlite3.pc.in
.deps        Makefile.msc       config.status  libtool        sqlite3.1          sqlite3.rc
.libs        README.txt         config.sub     ltmain.sh      sqlite3.c          sqlite3ext.h
INSTALL      Replace.cs         configure      missing        sqlite3.h          tea
Makefile     aclocal.m4         configure.ac   shell.c        sqlite3.lo
Makefile.am  compile            depcomp        sqlite3        sqlite3.o
$ ls -a .libs
.   libsqlite3.a   libsqlite3.lai  libsqlite3.so.0      sqlite3.o
..  libsqlite3.la  libsqlite3.so   libsqlite3.so.0.8.6
```

環境変数 LD_LIBRARY_PATH に、.libs の絶対パスを指定します。

```bash
$ export LD_LIBRARY_PATH=$HOME/sqlite-3.31.01/.libs
$ echo $LD_LIBRARY_PATH
/home/mototaka/sqlite-3.31.01/.libs
```

Python3 で SQLite3 のバージョンを確認してみます。

```bash
$ python3
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.31.1'
```

Python3 から、SQLite の最新バージョンである 3.31.1 が使用できることを確認できました。SQLite ネイティブの sqlite_version() 関数でも確認してみましょう。

```bash
$ python3
>>> import sqlite3
>>> con = sqlite3.connect(":memory:")
>>> cur = con.cursor()
>>> cur.execute("SELECT sqlite_version()")
>>> cur.fetchone()
('3.31.1',)
```
同様に、Python3 から、SQLite の最新バージョンである 3.31.1 が使用できることを確認できました。

# Python3 で SQLite 3.20.1 を使用

SQLite3 3.20.1 を入手して、ビルドします。

```bash
$ wget https://www.sqlite.org/2017/sqlite-autoconf-3200100.tar.gz 
$ tar zxvf sqlite-autoconf-3200100.tar.gz
$ mv sqlite-autoconf-3200100 sqlite-3.20.01
$ cd sqlite-3.20.01/
$ ./configure
$ make
$ ./sqlite3 --version
3.20.1 2017-08-24 16:21:36 8d3a7ea6c5690d6b7c3767558f4f01b511c55463e3f9e64506801fe9b74dce34
```

今度は、環境変数 LD_LIBRARY_PATH に、.libs の相対パスを指定します。

```bash
$ export LD_LIBRARY_PATH=./libs
```

Python3 で SQLite3 のバージョンを確認してみます。

```bash
$ python3
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.20.1'
```

Python3 から、ビルドした SQLite 3.20.1 が使用できることを確認できました。
LD_LIBRARY_PATH に、.libs の相対パスを指定することで、以下のような環境で、ディレクトリを変えることでいろいろな SQLite を Python3 から使うことが可能です。

```bash
$ ls
sqlite3.00.08  sqlite3.06.23.1  sqlite3.12.02  sqlite3.18.02  sqlite3.23.00  sqlite3.29.00
sqlite3.01.06  sqlite3.07.17    sqlite3.13.00  sqlite3.19.03  sqlite3.24.00  sqlite3.30.01
sqlite3.02.07  sqlite3.08.11.1  sqlite3.14.02  sqlite3.2.8    sqlite3.25.03  sqlite3.31.01
sqlite3.03.17  sqlite3.09.03    sqlite3.15.02  sqlite3.20.01  sqlite3.26.00
sqlite3.04.02  sqlite3.10.02    sqlite3.16.02  sqlite3.21.00  sqlite3.27.02
sqlite3.05.09  sqlite3.11.01    sqlite3.17.02  sqlite3.22.00  sqlite3.28.00
```

# まとめ

SQLiteの場合、他データベースと違って、ドライバーやコネクション情報で接続するデータベースを変えることが難しくて、最悪 Python3 のソースコードを改良したりしないといけないかもと思っていましたが、環境変数 LD_LIBRARY_PATH を使うことで意外と簡単に、いろいろなバージョンの SQLite3 を使うことができました。
また、今回、Pyhton3 のインストール以外、root権限を使用していませんので、簡単にいろいろなバージョンで 動作確認 を試してみるには良いのではないかと思います。

もし、記述について誤りがあったり、気になることがあれば、編集リクエストやコメントでフィードバックしていただけると助かります。