(最終更新日:2023年9月)
✔このような方へ向けて書かれた記事となります
「Pythonでデータベースを操作したいけど、どうすればいいだろう?」
「Pythonとデータベースの接続方法が知りたい」
「Pythonでデータベースを扱う実例が見たい」
✔当記事を通じてお伝えすること
- Pythonとデータベースの基本概念
- Pythonでデータベースに接続・操作する方法
- Pythonとデータベースを扱う実例
当記事では、Pythonとデータベースを操作する基本から応用まで、実践例を交えて詳細に解説しています。
ぜひ最後までお読みいただき、Pythonでデータベース操作をマスターしましょう。
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
テーブルに新たなレコードを追加しています。
このレコードは、name
とrole
の二つのフィールドを持ち、それぞれJohn Doe
とEngineer
という値が設定されています。
データの追加:複数レコード
複数のレコードを一度に追加できるのは、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
テーブルからname
がJohn 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:
PyMySQL
やmysql-connector-python
- PostgreSQL:
psycopg2
やpg8000
- MongoDB:
pymongo
まとめ
当記事でお伝えした内容は以下のとおり。
- PythonとSQLite3を用いて、データベースを作成し、接続する方法
- Pythonを使ってテーブルを操作(作成、名前の取得・変更、削除)する方法
- データ(単一レコード・複数レコード)の追加と取得、削除の方法
- pandasを用いたデータの読み込み
- Pythonと他のデータベースとの連携
これらの基本的な操作を理解し、自分のプロジェクトに適用できれば、Pythonを使ったデータベース操作の基本的なスキルが身についたと言えるでしょう。
さらにPythonは多くのデータベースライブラリを持っており、それぞれが異なるデータベースシステムに対応しています。
いろいろと触りながら覚えることがおすすめです。