はじめに
Python3 で、いろいろなバージョンの SQLite3 や自分たちで改良した SQLite3 を使う必要がありまして、備忘録としてまとめました。
環境
OS は、CentOS 7.7 を使用しています。Proxyなどを設定して、外部にアクセスできる状況になっています。
$ cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
まず、Python3 をインストールします。Python3 のバージョンは 3.6.8 です。
$ sudo yum install python3
$ python3 --version
Python 3.6.8
SQLite3 のバージョンを SQLite3 コマンドと Python3 で確認します。
$ 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 に変更しておきます。
$ 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 をビルドします。
$ cd sqlite-3.31.01
$ ./configure
$ make
$ ./sqlite3 --version
3.31.1 2020-01-27 19:55:54 3bfa9cc97da10598521b342961df8f5f68c7388fa117345eeb516eaa837bb4d6
ファイルを確認します。ディレクトリ .libs に SQLite3 ライブラリが置かれます。
$ 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 の絶対パスを指定します。
$ export LD_LIBRARY_PATH=$HOME/sqlite-3.31.01/.libs
$ echo $LD_LIBRARY_PATH
/home/mototaka/sqlite-3.31.01/.libs
Python3 で SQLite3 のバージョンを確認してみます。
$ python3
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.31.1'
Python3 から、SQLite の最新バージョンである 3.31.1 が使用できることを確認できました。SQLite ネイティブの sqlite_version() 関数でも確認してみましょう。
$ 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 を入手して、ビルドします。
$ 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 の相対パスを指定します。
$ export LD_LIBRARY_PATH=./libs
Python3 で SQLite3 のバージョンを確認してみます。
$ python3
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.20.1'
Python3 から、ビルドした SQLite 3.20.1 が使用できることを確認できました。
LD_LIBRARY_PATH に、.libs の相対パスを指定することで、以下のような環境で、ディレクトリを変えることでいろいろな SQLite を Python3 から使うことが可能です。
$ 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権限を使用していませんので、簡単にいろいろなバージョンで 動作確認 を試してみるには良いのではないかと思います。
もし、記述について誤りがあったり、気になることがあれば、編集リクエストやコメントでフィードバックしていただけると助かります。