Python

Python初学者向け:データベースからデータを取得する

スポンサーリンク

 

この記事はこんな方におススメです
  • Pythonを始めたばかりで基本から学びたい方
  • Pythonの基本的な部分を速習してまずは全体像を把握しておきたい方

▶ 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つの要素が表示されます。

next文によるデータの表示

この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())

出力結果は以下のようになります。

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())
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()によるデータの抽出するところまでを確認しました。

コメント

タイトルとURLをコピーしました