▶ SQLite3の基本操作は以下の記事をご覧ください。
はじめに
今回は、Pythonからデータベースを操作する方法を基本から解説します。これまで、SQLite3の操作でデータベースを操作する方法をみてきましたが、Pythonから直接操作したいことも多いでしょう。Pythonにデフォルトで用意されているsqlite3モジュールを使います。
▶ MySQLを操作したい場合は以下の記事をご覧ください。
sqlite3モジュールの基本
データベースとの接続(connectオブジェクトの作成)
Pythonからデータベースを操作するときにはまず、データベースとの接続をする必要があります。この役目を果たすのがsqlite3モジュールに用意されているconnect()です。次の書式で使います。
データベース名は既存のものがなければ、あらたに指定した名称のデータベースを作成して、コネクションオブジェクトを返します。このコネクションオブジェクトを変数に格納して、このオブジェクトに用意されたメソッドを呼び出してデータベースの操作をしていきます。
データベースを操作する準備(cursorオブジェクトの作成)
コネクションオブジェクトに用意されているメソッドの1つにcursor()メソッドがあります。次の書式で使います。
上記のようにcursor()の中で直接SQL文を指定することができますが、一度、変数に格納するほうがわかりやすいのですね。実際、ほとんどの場合そのようにするかと思います。
Pythonからの操作をする
テーブルの作成
では前にSQLite3からの操作で作ったAnimalテーブルを作ってみましょう。
▶ SQLite3の操作によるテーブルの作成は以下の記事をご覧ください。
作成するテーブルの情報をまとめておきましょう。
- ID
文字通りIDとなるカラムに設定 - Name
どうぶつたちのなまえを保管するカラムとします - Zoo
どうぶつたちの出身の「どうぶつえん」の名前を保管するカラムとします - Age
どうぶつたちの年齢を保管するカラムとします
これをPythonからの操作でつくってみます。
import sqlite3
con = sqlite3.connect('animal.db')
cursor = con.cursor()
create_animal_table = '''
CREATE TABLE Animal (
ID INTEGER PRIMARY KEY NOT NULL,
Name TEXT NOT NULL,
Zoo TEXT DEFAULT 'UnKnown',
Age INTEGER CHECK(Age>0)
)
'''
cursor.execute(create_animal_table)
まず1行目でsqlite3モジュールのインポートをします。3行目でanimal.dbへの接続をしています。animal.dbがない場合は作られます。返り値がコネクションオブジェクトとなるのでこれをconという変数に格納しています。4行目ではコネクションオブジェクトconに対してcursor()メソッドを呼び出しています。返り値をcursorという変数に入れています。
6~12行目がSQL文となります。ここではanimalというテーブルを作成するSQL文を発行しています。Pythonから操作する場合でも、この部分はSQL文の知識が必要となります。12行目の最後の部分はSQLでは「;(セミコロン)」が必要でしたが、Pythonから実行する場合は不要となるので注意しましょう。※「;(セミコロン)」をつけてもこのコードの場合は動きますが、SQL文をこの後につなぐような場合を考慮して、セミコロンなしとしておいたほうが良いでしょう。
このコードを実行してエラーが起きなければ成功です。ターミナルから確認しておきましょう。
テーブルAnimalがちゃんとできてますね。
レコードの作成
次にレコードの作成です。こちらも同じような操作でおこなうことができます。レコードを作成するSQL文をinsert_animal_queryという変数に入れることにしましょう。
insert_animal_query = '''
INSERT INTO Animal(ID,Name,Zoo,Age)
VALUES(1, 'らくだ', '旭山動物園', 32)
'''
cursor.execute(insert_animal_query)
これを実行するとエラーが返ってきません。では、ちゃんとレコードができているかターミナルで確かめてみましょう。
これを実行しても何も返ってきません。どうしてでしょうか?
一般的にデータベースに対する操作では「コミット」という処理がされない限り結果が反映されないのが原則となります。(先ほど実施した「CREATE TABLE」に関してはSQLite側で自動でコミットされる(オートコミット)ように設定されています。)
この「コミット」はデータベースとの接続であるコネクションオブジェクトに対して実施します。次のような書式となります。
これを実施すると、このコネクションオブジェクトに関するこれまでのクエリをすべてコミットしてくれます。コミットされると、データベースがsaveされて永続化してくれます。
ではコミットしてからレコードを確認してみましょう。
cursor.execute(insert_animal_query)
con.commit()
今度はちゃんとレコードの確認がとれました。
まとめ
今回はPythonからデータベースを操作する方法をSQLite3を例に解説しました。Pythonではsqlite3というモジュールがあらかじめ用意されており、このモジュールを介してデータベースの操作をします。
まずはデータベースとの接続(connect)をし、次に位置を示すcursorオブジェクトを作り、このオブジェクトに対して操作をするのでした。
データベースの操作は基本的にコミットという作業が必要で、これをすることでデータベースが保存されて永続化します。
コメント