ラズパイにSQLiteをインストール pythonからアクセスしてみた

買ったは良いが、色々忙しくて、ほったらかしの「ラズパイ」である。
本日は、ラズパイにSQLiteを導入してみようという話題である。
普通に、raspbianをインストールしただけなら、SQLiteは入っていない。
まずは、パッケージとしてSQLiteが存在しているかどうかを検索してみる。
yumならyum searchとしてリポジトリにあるかを検索できるのだが、apt-getにはsearchコマンドがないので、apt-cacheで検索することになる。
apt-getにあまり慣れていないので、apt-get search sqlite3とかやってエラーになり、apt-getでのパッケージの検索ってどうやってやるんだっけ?と毎回調べているような気がする。
検索するときは、apt-cacheでやる。

root@raspberrypi:/home/pi# apt-cache search sqlite3
akonadi-backend-sqlite - SQLite storage backend for Akonadi
aolserver4-nssqlite3 - AOLserver 4 module: module for accessing SQLite 3 databases
bacula-common-sqlite3 - network backup service - SQLite v3 common files
以下略

sqlite3で検索しているので、なんか沢山出てきた。

sqlite3 - Command line interface for SQLite 3

これだけ入れとけばOKか。
apt-getでインストールしてみる(sudo suでroot権限取ってからやってます)。

root@raspberrypi:/home/pi# apt-get install sqlite3
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
libsqlite3-0
提案パッケージ:
sqlite3-doc
以下のパッケージが新たにインストールされます:
sqlite3
以下のパッケージはアップグレードされます:
libsqlite3-0
アップグレード: 1 個、新規インストール: 1 個、削除: 0 個、保留: 134 個。
1,203 kB のアーカイブを取得する必要があります。
この操作後に追加で 1,991 kB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian stretch/main armhf libsqlite3-0 armhf 3.16.2-5+deb9u1 [493 kB]
取得:2 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian stretch/main armhf sqlite3 armhf 3.16.2-5+deb9u1 [709 kB]
1,203 kB を 2秒 で取得しました (486 kB/s)
changelog を読んでいます... 完了
(データベースを読み込んでいます ... 現在 129121 個のファイルとディレクトリがインストールされています。)
.../libsqlite3-0_3.16.2-5+deb9u1_armhf.deb を展開する準備をしています ...
libsqlite3-0:armhf (3.16.2-5+deb9u1) で (3.16.2-5 に) 上書き展開しています ...
libsqlite3-0:armhf (3.16.2-5+deb9u1) を設定しています ...
以前に未選択のパッケージ sqlite3 を選択しています。
(データベースを読み込んでいます ... 現在 129121 個のファイルとディレクトリがインストールされています。)
.../sqlite3_3.16.2-5+deb9u1_armhf.deb を展開する準備をしています ...
sqlite3 (3.16.2-5+deb9u1) を展開しています...
sqlite3 (3.16.2-5+deb9u1) を設定しています ...
libc-bin (2.24-11+deb9u1) のトリガを処理しています ...
man-db (2.7.6.1-2) のトリガを処理しています ...

無事にインストールできた。
manのインデックスを作るのに時間がかかる感じ。数分でインストールが終了した。
sqlite3コマンドで動作確認してみる。

root@raspberrypi:/home/pi# sqlite3 test.db
SQLite version 3.16.2 2017-01-06 16:32:41
Enter ".help" for usage hints.
sqlite> create table foo (a integer,b text);
sqlite> insert into foo values(1,'test');
sqlite> select * from foo;
1|test
sqlite>

よし、動いている(rootでやることなかったかも)。
ラズパイといえば、Pythonだよな。ということで、pythonからsqlite3を使ってみる。

import sqlite3

でsqlite3モジュールをインポートして、

con = sqlite3.connect('/home/pi/test.db')

で接続を作って、

cur = con.cursor()

で、カーソルを作って、

cur.execute('SELECT * FROM foo')

で、カーソルのexecuteメソッドでSQL命令を実行できるらしい。
カーソルから実行結果を得るには、以下のように

for row in cur:
print(row[0], row[1])

for文を回せばOKらしい。
最後に、con.close()で接続を切っておしまい。
以下は、作成したpythonスクリプトである。

import sqlite3
con = sqlite3.connect('/home/pi/test.db')
cur = con.cursor()
cur.execute('SELECT * FROM foo')
for row in cur:
print(row[0], row[1])
con.close()

しかし、ここに大きな落とし穴が。
完成したので、実行すると、エラーが。

pi@raspberrypi:~ $ python sqlite3.py
Traceback (most recent call last):
File "sqlite3.py", line 1, in 
import sqlite3
File "/home/pi/sqlite3.py", line 3, in 
con = sqlite3.connect('/home/pi/test.db')
AttributeError: 'module' object has no attribute 'connect'

sqlite3やconnectの綴間違えてないよなぁ。
sqlite3は標準モジュールに入っているから別途インストールする必要なしって書いてあるし。
「AttributeError: 'module' object has no attribute 'connect'」
で検索してみたら、謎が解けた。
スクリプトのファイル名がまずかったようである。
sqlite3.py -> testsqlite3.py
sqlite3モジュールをインポートして使いたい場合は、ファイル名にsqlite3は使っちゃダメ、ということらしい。
実行したら、ちゃんとSELECT命令が実行できた。

pi@raspberrypi:~ $ python testsqlite3.py
(1, u'test')
[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)

関連記事
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
第4版には電子版もあります。
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版

投稿者プロフィール

asai
asai