Python プログラミング sqlite3を使ってみる

 今日も見に来てくださって、ありがとうございます。石川さんです。

 Pythonからデータを保持するための方法のひとつ、sqlite3を利用してみます。sqlite3はPythonの標準ライブラリに含まれていますので、特別なインストールなど、不要です。それでいて、SQLが使えて、テーブルを作成してデータを簡単に保存したいというニーズに充分応えてくれます。

 ぼくは普段のおしごとでは、Oracleを専門に扱っているのですけど、他のデータベースも知っておいた方がよいでしょう、ということで、ちょっぴりチャレンジしてみました。データベースをつくって、テーブルをつくって、データを入れて、検索する、という一連の流れを実行してみました。

 ちなみに、sqlite3は、別のサーバプロセスを用意する必要はありません。その名のとおり軽量で、ディスク上のデータベースを提供してくれます。

ソースコード

import sqlite3

conn = sqlite3.connect('test.db')

curs = conn.cursor()

curs.execute("SELECT tbl_name FROM sqlite_master WHERE type = 'table'")
tables = [table[0] for table in curs.fetchall()]

if "BOOKS" in tables:
    curs.execute("DROP TABLE BOOKS")
curs.execute("CREATE TABLE BOOKS ( ID NUMBER PRIMARY KEY, TITLE VARCHAR(30), PUBLISHED DATE)")
curs.execute("INSERT INTO BOOKS (ID, TITLE, PUBLISHED) VALUES"
             " (1, '入門Python3', '2015-12-01')"
             ",(2, '実践Python3', '2015-12-01')"
             ",(3, 'Fluent Python', '2017-10-11')"
             ",(4, 'Effective Python', '2016-01-22')"
            )
conn.commit()
curs.execute("SELECT * FROM BOOKS")
rows = curs.fetchall()
print(rows)

説明

 1行目、ライブラリ名はsqlite3です。利用できるようにするため、importします。

 3行目、sqlite3のデータベースを使えるようにするためには、まずConnectionオブジェクトを作る必要があります。データは「test.db」ファイルに格納されます。「:memory:」という特殊な名前を指定すると、RAM上にデータベースが作れるそうです。ちなみに、ファイルが存在しなくてもエラーにならず、勝手にファイルが作成されます。

 5行目、データベースへの操作には、必ずカーソルが必要です。ということで、cursor()メソッドでカーソルを作成します。

 このデータベースの中に、「BOOKS」テーブルを作成しようと思ったのですけど、既にこの「BOOKS」テーブルが存在した場合はいったん削除してから作成しましょう。7行目で指定した「sqlite_master」テーブルには、このデータベースの中に入っているシステムテーブルで、作られたオブジェクトの情報が入力されています。

 7行目でSELECT文を定義して、8行目でデータを取り出しています。データはタプルで取り出されるので、リスト内包表記で一つ目の項目だけを取り出しています。10行目で比較するためです。1回目はテーブルが存在しないはずですので、12行目のテーブル削除は実行されず、12行目のCREATE TABLE文でテーブルをつくることから始めます。

 13行目のINSERT文でデータを投入しています。今回は、1行で4件データを作成しています。sqlite3はINSERT一文で複数件投入できるのですね、便利です。

 19行目、commit()です。これで、データが確定されました。

 20行目以降、SELECT文でデータを取得しています。

まとめ

 sqlie3、簡単ですね。ほとんど悩むことなく使えるようになりました。さすが標準モジュールです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


The reCAPTCHA verification period has expired. Please reload the page.