▶ Pythonを使ったデータベース操作の基本はこちらの記事をご覧ください。
はじめに
今回は、Pythonからデータベースのデータを取得する方法を解説します。事前準備として複数行のSQLを発行する方法を解説して、まずはサンプルデータを作るところから始めます。その後、Pythonからsqlite3モジュールを用いてデータを取得する方法を解説していきます。
事前準備~サンプルデータの作成~
まずはサンプルデータを用意しましょう。前回の投稿記事で学んだようにPythonからSQL文を発行しましょう。
import sqlite3
con = sqlite3.connect('animal.db')
cursor = con.cursor()
create_animal_table = """
CREATE TABLE IF NOT EXISTS Animal (
ID INTEGER PRIMARY KEY NOT NULL,
Name TEXT NOT NULL,
Zoo TEXT DEFAULT 'UnKnown',
Age INTEGER CHECK(Age>0)
)
"""
insert_animal_query = '''
INSERT INTO Animal VALUES(1, 'らくだ', '旭山動物園', 32);
INSERT INTO Animal VALUES(2, 'ねこ', '旭山動物園', 28);
INSERT INTO Animal VALUES(3, 'しまうま', '上野動物園', 42);
INSERT INTO Animal VALUES(4, 'きりん', 'ズーラシア', 23);
INSERT INTO Animal VALUES(5, 'ぞう', '宇都宮動物園', 41);
INSERT INTO Animal VALUES(6, 'らいおん', '富士サファリパーク', 35);
INSERT INTO Animal VALUES(7, 'いるか','八景島シーパラダイス', 32);
'''
cursor.execute(create_animal_table)
cursor.execute(insert_animal_query)
con.commit()
これを実行すると、エラーとなりますね。(すいません)次のようなエラーが出るかと思います。
赤線の部分を見ると、1つのSQLしか実行できない、と書かれていますね。実はexecute()メソッドは複数のSQLを実行することができません。そこで、次のように複数のSQLを実行することのできるexecutescript()というメソッドを使って書き換えましょう。
import sqlite3
con = sqlite3.connect('animal.db')
cursor = con.cursor()
create_animal_table = """
CREATE TABLE IF NOT EXISTS Animal (
ID INTEGER PRIMARY KEY NOT NULL,
Name TEXT NOT NULL,
Zoo TEXT DEFAULT 'UnKnown',
Age INTEGER CHECK(Age>0)
)
"""
insert_animal_query = '''
INSERT INTO Animal VALUES(1, 'らくだ', '旭山動物園', 32);
INSERT INTO Animal VALUES(2, 'ねこ', '旭山動物園', 28);
INSERT INTO Animal VALUES(3, 'しまうま', '上野動物園', 42);
INSERT INTO Animal VALUES(4, 'きりん', 'ズーラシア', 23);
INSERT INTO Animal VALUES(5, 'ぞう', '宇都宮動物園', 41);
INSERT INTO Animal VALUES(6, 'らいおん', '富士サファリパーク', 35);
INSERT INTO Animal VALUES(7, 'いるか','八景島シーパラダイス', 32);
'''
cursor.execute(create_animal_table)
cursor.executescript(insert_animal_query)
con.commit()
今度はエラーが起きませんね。では、ターミナルからデータを確認してみましょう。
ちゃんとレコードの登録がされてますね。上記のコードではコミットしていますが、このexecutescript()メソッドはオートコミットされます。これで準備ができました。では、Pythonからデータの取得をしてみましょう。
Pythonからデータベースにアクセスする
PythonからSQL文を発行するやり方はこれまでと同じなので、簡単ですね。次のコードを実行してみましょう。
import sqlite3
con = sqlite3.connect('animal.db')
cursor = con.cursor()
for row in cursor.execute('SELECT * FROM Animal'):
print(row)
実はcursorオブジェクトに対して cursor.execute(‘SELECT * FROM Animal’)を実行した段階で、cursorオブジェクトがイテレータになります。これを確認しておきましょう。
import sqlite3
con = sqlite3.connect('animal.db')
cursor = con.cursor()
cursor.execute('SELECT * FROM Animal')
print(next(cursor))
print(next(cursor))
print(next(cursor))
今度はfor文ではなく、じつはcursorオブジェクトに対して cursor.execute(‘SELECT * FROM Animal’)を実行したあと、next文はPythonの組み込み関数の一つで、イテレータの次の要素を取り出します。そのため、最初のデータから順番に(next文を3回繰り返しているので)3つの要素が表示されます。
このcursorに対してfetchall()というメソッドを使うと、現在の位置(cursor)より後のデータをタプルで返します。やってみましょう。
import sqlite3
con = sqlite3.connect('animal.db')
cursor = con.cursor()
cursor.execute('SELECT * FROM Animal')
print(next(cursor))
print(next(cursor))
print(next(cursor))
print('*'*10)
print('このあとはfechall()の出力結果となります。')
print(cursor.fetchall())
出力結果は以下のようになります。
next関数で3つ値を取り出して、そのあとにfetchall()を使ったので、4番目から後のデータすべてがタプルで返ってきています。
これに対して現在のカーソル位置のデータを返すfetchone()というメソッドもあります。これも試しておきましょう。
import sqlite3
con = sqlite3.connect('animal.db')
cursor = con.cursor()
cursor.execute('SELECT * FROM Animal')
print(next(cursor))
print(next(cursor))
print(next(cursor))
print('*'*10)
print('このあとはfechone()の出力結果となります。')
print(cursor.fetchone())
これはnext()関数を3回繰り返した後なので4番目のデータだけが返ってきてますね。fetchone()はデータを取得した後、カーソルを1つ進めます。そのためnext()関数と同じように使えます。
import sqlite3
con = sqlite3.connect('animal.db')
cursor = con.cursor()
cursor.execute('SELECT * FROM Animal')
print(next(cursor))
print(next(cursor))
print(next(cursor))
print('*'*10)
print('このあとはfechone()の出力結果となります。')
print(cursor.fetchone())
print(cursor.fetchone())
fetchone()を2回繰り返すと、次のレコードが表示されます。
まとめ
今回はPythonからデータベースにアクセスしてデータを取り出す方法を扱いました。cursorオブジェクトに対してexecute()でSELECT文を発行すると、cursorオブジェクトはイテレータになります。
このイテレータを操作することでデータを順に取り出すことができます。今回はこのイテレータに対して、next()やfetchall(), fetchone()によるデータの抽出するところまでを確認しました。
コメント