Pythonでデータベースを扱う方法|sqlite3のサンプルコード付

※本サイトにはプロモーション・広告が含まれています。

(最終更新日:2023年9月)

✔このような方へ向けて書かれた記事となります

「Pythonでデータベースを操作したいけど、どうすればいいだろう?」
「Pythonとデータベースの接続方法が知りたい」
「Pythonでデータベースを扱う実例が見たい」

✔当記事を通じてお伝えすること

  • Pythonとデータベースの基本概念
  • Pythonでデータベースに接続・操作する方法
  • Pythonとデータベースを扱う実例

当記事では、Pythonとデータベースを操作する基本から応用まで、実践例を交えて詳細に解説しています。

ぜひ最後までお読みいただき、Pythonでデータベース操作をマスターしましょう。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

Pythonでデータベースを扱うための前提知識

ここでは、Pythonとデータベースの関係など、基礎的なことをお伝えしていきます。

  • データベースとPythonの関係
  • Pythonで扱える主要なデータベースとは

データベースとPythonの関係

データベースは情報を整理し、管理するシステムです。

このシステムを使うことで、大量のデータを効率的に操作することが可能になります。

代表的なデータベースとして、PostgreSQLがあります。

以下の記事で詳しく解説しています。

Pythonはその強力なデータ処理機能とともに、さまざまなデータベースシステムと連携できるツールを提供しています。

データの追加や検索、更新、削除などの操作をPythonのコードだけでおこなえます。

Pythonで扱える主要なデータベースとは

Pythonは非常に多様なデータベースと連携が可能です。

以下は一般的に使用されるデータベースとそれぞれのアクセス方法の一部です。

  • Relational Databases(関係データベース)
  • NoSQL Databases(非関係データベース)
  • In-Memory Databases
  • Time Series Databases
  • Graph Databases
  • Object Databases
  • NewSQL Databases
  • Cloud Native Databases:

これらは、Pythonで扱うことが可能なデータベースの一部です。実際には多くの他のデータベースも存在し、それぞれのデータベースに応じたライブラリやドライバを使用することで接続が可能です。

Relational Databases(関係データベース)

  • MySQL: mysql-connector-python, PyMySQL などのライブラリ
  • PostgreSQL: psycopg2, asyncpg など
  • SQLite: Python標準ライブラリの sqlite3
  • Oracle: cx_Oracle など
  • SQL Server: pyodbc など
  • MariaDB: mysql-connector-python など

NoSQL Databases(非関係データベース)

  • MongoDB: pymongo, motor など
  • Cassandra: cassandra-driver など
  • Redis: redis-py など
  • Apache HBase: happybase など
  • DynamoDB: boto3(AWSのSDK)など
  • Couchbase: couchbase など

In-Memory Databases

  • Memcached: python-memcached など

Time Series Databases

  • InfluxDB: influxdb-python など

Graph Databases

  • Neo4j: neo4j など

Object Databases

  • ZODB: ZODB パッケージなど

NewSQL Databases

  • CockroachDB: psycopg2 など

Cloud Native Databases

  • Google Cloud Bigtable: google-cloud-bigtable など
  • Azure Cosmos DB: Azure SDKの一部
  • AWS RDS: boto3 など

Pythonでデータベースを操作するためのツール:SQLite3

こちらでは、Pythonでデータベースを操作するためのツール、SQLite3について詳しく説明します。

  • SQLite3の概要
  • SQLite3が適しているシーン
  • PythonでSQLite3を使うメリット

SQLite3の概要

SQLite3は、軽量で使いやすい組み込み型のリレーショナルデータベースです。

サーバーが不要で、ひとつのデータベースがひとつのディスクファイルとして保存されるため、設定や管理が容易なことが特徴。

Pythonの標準ライブラリに含まれているため、追加のインストールなしにすぐに使用できます。

SQLite3が適しているシーン

SQLite3は、大規模なWebサイトや高トラフィックのアプリケーションよりも、小規模なアプリケーションやプロトタイプ、研究や個人のプロジェクトに適しています

大量の同時アクセスを処理することは得意ではありませんが、個々のユーザーが自分自身のデータベースを持つようなアプリケーションには最適です。

PythonでSQLite3を使うメリット

PythonでSQLite3を使うと、Pythonのコードのみでデータベースの全ての操作をおこなえます。

SQLite3はPythonの標準ライブラリの一部であり、Pythonのデータ構造と相性が良いです。

またSQLite3は独自のサーバーが不要で、データベースが一つのディスクファイルとして格納されるため、データベースの作成、操作、そしてメンテナンスが容易になります。

PythonとSQLite3でデータベースを作成・接続する

こちらでは、PythonとSQLite3を使ってデータベースを作成し、接続する方法を解説します。

  • データベースの作成と接続
  • データベース接続の遮断

データベースの作成と接続

PythonとSQLite3を用いてデータベースを作成し、接続するためには、まずsqlite3モジュールをインポートが必要です。

次にsqlite3.connect()関数を使ってデータベースに接続しましょう。

この関数はデータベース名を引数にとります。

データベースが存在しない場合は新しく作成されます。

import sqlite3

# データベースに接続する(存在しない場合は新規作成)
conn = sqlite3.connect('my_database.db')

上記のコードでは、現在のディレクトリにmy_database.dbという名前のデータベースファイルを作成(または既存のものに接続)します。

データベース接続の遮断

データベースへの操作が完了したら、close()メソッドを使用して接続を遮断します。

未保存の変更がコミットされ、データベースへの接続が正しく終了するのです。

これはデータの整合性を保つために重要なステップです。

# データベースの接続を終了
conn.close()

ただし、withステートメントを用いると、コードブロックの終了時に自動的に接続が終了します。

明示的な記述が不要です。

import sqlite3

# データベースに接続
with sqlite3.connect('my_database.db') as conn:
    # データベース操作のコード
    pass
# この地点で自動的にconn.close()が呼び出される

PythonとSQLite3でテーブル操作

次に、PythonとSQLite3を使ってデータベース内のテーブルを操作する方法をお伝えしていきます。

  • テーブルの作成
  • テーブル名の取得
  • テーブル名の変更
  • テーブルの削除

テーブルの作成

PythonとSQLite3を使ってテーブルを作成するためには、CREATE TABLEコマンドを使います。

これはexecute()メソッドを使って実行しましょう。

execute()メソッドはSQLコマンドを引数に取り、そのコマンドをデータベースに対して実行します。

# データベースに接続
with sqlite3.connect('my_database.db') as conn:
    # カーソルを作成
    cursor = conn.cursor()

    # テーブルを作成
    cursor.execute("""
        CREATE TABLE employees (
            employee_id INTEGER PRIMARY KEY,
            name TEXT,
            position TEXT,
            hire_date TEXT
        )
    """)

employeesという名前の新しいテーブルを作成しました。

このテーブルは次の4つのフィールドを持ちます

  • employee_id(主キーとして設定)
  • name
  • position
  • hire_date

execute関数は、SQLコマンドを実行できるもの。

SQLコマンドとしてのCREATE TABLEを復習したい方は以下の記事をご覧ください。

テーブル名の取得

データベース内の全てのテーブル名を取得するには、特殊なテーブルsqlite_masterを問い合わせます。

これはSQLiteのメタデータを格納する、データベース内の全てのテーブル情報が含まれているテーブルです。

# データベースに接続
with sqlite3.connect('my_database.db') as conn:
    # カーソルを作成
    cursor = conn.cursor()

    # テーブル名を取得
    cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
    table_names = cursor.fetchall()

for name in table_names:
    print(name[0])

sqlite_masterテーブルから全テーブル名を取得し、各テーブル名を表示しています。

テーブル名の変更

テーブルの名前を変更するのは、ALTER TABLE SQLコマンドです。

このコマンドは既存のテーブル名と新しいテーブル名を引数に取ります。

# データベースに接続
with sqlite3.connect('my_database.db') as conn:
    # カーソルを作成
    cursor = conn.cursor()

    # テーブル名を変更
    cursor.execute("ALTER TABLE employees RENAME TO staff")

上記のコードでは、employeesテーブルの名前をstaffに変更しています。

テーブルの削除

DROP TABLE SQLコマンドは、テーブルを削除するもの。

このコマンドは削除したいテーブルの名前を引数に取ります。

# データベースに接続
with sqlite3.connect('my_database.db') as conn:
    # カーソルを作成
    cursor = conn.cursor()

    # テーブルを削除
    cursor.execute("DROP TABLE staff")

上記のコードでは、staffテーブルを削除しています。

PythonとSQLite3でデータ操作

こちらでは、PythonとSQLite3を用いてデータベース内のデータを操作する方法について詳しく説明します。

具体的には、以下のトピックについて取り扱います。

  • データの追加:単一レコード
  • データの追加:複数レコード
  • データの取得:全レコード
  • データの取得:1行ずつ
  • データの削除

データの追加:単一レコード

レコードをテーブルに追加するためには、INSERT INTO SQLコマンドを使用しましょう。

以下がその例です。

# データベースに接続
with sqlite3.connect('my_database.db') as conn:
    # カーソルを作成
    cursor = conn.cursor()

    # データを追加
    cursor.execute("INSERT INTO staff (name, role) VALUES (?, ?)", ('John Doe', 'Engineer'))

上記のコードでは、staffテーブルに新たなレコードを追加しています。

このレコードは、nameroleの二つのフィールドを持ち、それぞれJohn DoeEngineerという値が設定されています。

データの追加:複数レコード

複数のレコードを一度に追加できるのは、executemany()関数です。

以下に例を示します。

# データベースに接続
with sqlite3.connect('my_database.db') as conn:
    # カーソルを作成
    cursor = conn.cursor()

    # 複数のデータを追加
    data = [('Jane Doe', 'Manager'), ('Richard Roe', 'Engineer'), ('Doe John', 'Intern')]
    cursor.executemany("INSERT INTO staff (name, role) VALUES (?, ?)", data)

複数のレコードをstaffテーブルに追加しています。

data変数はタプルのリストで、各タプルは一つのレコードを表現します。

データの取得:全レコード

データベースから全てのレコードを取得するには、SELECT * FROM SQLコマンドを使いましょう。

以下に例を示します。

# データベースに接続
with sqlite3.connect('my_database.db') as conn:
    # カーソルを作成
    cursor = conn.cursor()

    # 全てのレコードを取得
    cursor.execute("SELECT * FROM staff")
    rows = cursor.fetchall()

for row in rows:
    print(row)

上記のコードでは、staffテーブルから全てのレコードを取得し、それらを出力しています。

fetchall()メソッドは、SQLクエリによって返された全てのレコードを取得します。

データの取得:1行ずつ

全てのレコードを一度に取得する代わりに、1行ずつ取得したい場合もあります。

fetchone()メソッドが、使える場面です。

以下にその使用例を示します。

# データベースに接続
with sqlite3.connect('my_database.db') as conn:
    # カーソルを作成
    cursor = conn.cursor()

    # 全てのレコードを取得
    cursor.execute("SELECT * FROM staff")

    while True:
        row = cursor.fetchone()
        if row is None:
            break
        print(row)

全てのレコードを取得した後には、fetchone()メソッドはNoneを返します。

データの削除

特定のレコードをデータベースから削除するには、DELETE FROM SQLコマンドが使えます。

以下が例です。

# データベースに接続
with sqlite3.connect('my_database.db') as conn:
    # カーソルを作成
    cursor = conn.cursor()

    # 特定のレコードを削除
    cursor.execute("DELETE FROM staff WHERE name = ?", ('John Doe',))

上記のコードでは、staffテーブルからnameJohn Doeであるレコードを削除しています。

Pythonとデータベースの応用

ここでは、Pythonとデータベースをより深く理解するための応用的な内容を取り上げます。

  • pandasを使ったデータ読み込み
  • 他のデータベースとの連携

pandasを使ったデータ読み込み

Pythonのpandasライブラリは、データの操作と分析をおこなうための強力なツールです。

pandasはSQLite3と連携することができ、SQLクエリの結果をDataFrameという形式で直接読み込ます。

以下がその例です。

import pandas as pd
import sqlite3

# データベースに接続
conn = sqlite3.connect('my_database.db')

# SQLクエリの結果をDataFrameで取得
df = pd.read_sql_query("SELECT * FROM staff", conn)

# データベース接続を閉じる
conn.close()

pandasのread_sql_query()関数を用いて、SQLクエリの結果を直接DataFrameに読み込んでいます。

ほかのデータベースとの連携

Pythonはほかのデータベースシステムとも連携できます。

MySQLやPostgreSQLといったリレーショナルデータベースシステムや、MongoDBのようなNoSQLデータベースとも連携可能です。

それぞれのデータベースに対応するPythonのライブラリをインストールすることで、SQLite3と同様の操作をおこなえます。

  • MySQL:PyMySQLmysql-connector-python
  • PostgreSQL:psycopg2pg8000
  • MongoDB:pymongo

まとめ

当記事でお伝えした内容は以下のとおり。

  • PythonとSQLite3を用いて、データベースを作成し、接続する方法
  • Pythonを使ってテーブルを操作(作成、名前の取得・変更、削除)する方法
  • データ(単一レコード・複数レコード)の追加と取得、削除の方法
  • pandasを用いたデータの読み込み
  • Pythonと他のデータベースとの連携

これらの基本的な操作を理解し、自分のプロジェクトに適用できれば、Pythonを使ったデータベース操作の基本的なスキルが身についたと言えるでしょう。

さらにPythonは多くのデータベースライブラリを持っており、それぞれが異なるデータベースシステムに対応しています。

いろいろと触りながら覚えることがおすすめです。

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