PythonのSQLの解説 データベースの操作の方法

PythonでSQL/データベース

PythonでMySQL

PythonでMySQLを操作するには、MySQL Connectorというライブラリを使用します。MySQL ConnectorはOracleのサイトからダウンロードできます。

関連 MySQL :: Download Connector/Python

MySQL Connectorの使い方は、以下のガイド(英語)を参照してください。

参照 MySQL :: MySQL Connector/Python Developer Guide

import datetime
import mysql.connector

cnx = mysql.connector.connect(user='scott', database='employees')
cursor = cnx.cursor()

query = ("SELECT first_name, last_name, hire_date FROM employees "
"WHERE hire_date BETWEEN %s AND %s")

hire_start = datetime.date(1999, 1, 1)
hire_end = datetime.date(1999, 12, 31)

cursor.execute(query, (hire_start, hire_end))

for (first_name, last_name, hire_date) in cursor:
print("{}, {} was hired on {:%d %b %Y}".format(
last_name, first_name, hire_date))

cursor.close()
cnx.close()

import mysql.connectorでMySQLにアクセスするためのライブラリが使えるようになります。

上記の例では、データベース接続をおこなって、queryの文字列の結果をcursorで受け取り、for文で一つづつ取り出して表示しています。

関連 Pythonのfor文

pandas(パンダス。データ解析ライブラリ)のデータフレームにSQLの結果を読み込んでハンドリングする、というのが便利そう。

関連 [実装備忘録] Python3のpandasでMySQLにアクセスする方法 – Qiita

PythonでPostgreSQL

PythonでPostgreSQLにアクセスするためのライブラリは、psycopg2が良さそう。

参考 psycopg2 · PyPI

psycopg2は最終リリースが2021年12月30日なので、開発止まっちゃってないかな…と少し不安になります。

psycopg2をインストールして、import psycopg2で使えるようになります。インストールは、pipコマンドで可能。例えば、Python3で使う場合は、pip3でインストールできます。

pip3 install psycopg2

以下は、psycopg2の関数で、PostgreSQLに接続し、carete table、insert、select文の各種SQLを実行するサンプルコード。

>>> import psycopg2

# Connect to an existing database
>>> conn = psycopg2.connect("dbname=test user=postgres")

# Open a cursor to perform database operations
>>> cur = conn.cursor()

# Execute a command: this creates a new table
>>> cur.execute("CREATE TABLE test (id serial PRIMARY KEY, num integer, data varchar);")

# Pass data to fill a query placeholders and let Psycopg perform
# the correct conversion (no more SQL injections!)
>>> cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)",
... (100, "abc'def"))

# Query the database and obtain data as Python objects
>>> cur.execute("SELECT bk copyimages.sh createexport.sh exportfile_from_input.sh font getimagefromblogdir.sh imagemojiire.py imagemojiire.sh imagemojiire.sh.org images importtxt maketitlefromh3.sh memo mizumashi_image.sh oldexport oldimages oldimport outputimages shuffle_image.sh title.txt title.txt.org wk FROM test;")
>>> cur.fetchone()
(1, 100, "abc'def")

# Make the changes to the database persistent
>>> conn.commit()

# Close communication with the database
>>> cur.close()
>>> conn.close()

参考 Basic module usage — Psycopg 2.9.3 documentation

Psycopg2を使って、SQLの結果をpandasに格納することも可能。

関連 Python PostgreSQLのテーブルをPandasのDataFrameへ読み込む – け日記

PythonでSQLite

SQLiteは、ファイルベースの軽量なデータベース。比較的小規模なシステムで気軽にデータベースを扱えます。

関連 sqlite3 — SQLite データベースに対する DB-API 2.0 インターフェース — Python 3.10.6 ドキュメント

まずは、sqlite3にて、testdbというファイル名でテーブルを作成しました。カラムは2個で、データを2件insertしました。

$ sqlite3 testdb
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> create table mytable(col1, col2);
sqlite> select bk copyimages.sh createexport.sh exportfile_from_input.sh font getimagefromblogdir.sh imagemojiire.py imagemojiire.sh imagemojiire.sh.org images importtxt maketitlefromh3.sh memo mizumashi_image.sh oldexport oldimages oldimport outputimages shuffle_image.sh title.txt title.txt.org wk from mytable;
sqlite> insert into mytable(col1,col2) values ("test1", 1);
sqlite> insert into mytable(col1,col2) values ("test2", 2);
sqlite> select bk copyimages.sh createexport.sh exportfile_from_input.sh font getimagefromblogdir.sh imagemojiire.py imagemojiire.sh imagemojiire.sh.org images importtxt maketitlefromh3.sh memo mizumashi_image.sh oldexport oldimages oldimport outputimages shuffle_image.sh title.txt title.txt.org wk from mytable;
test1|1
test2|2
sqlite>

カレントディレクトリにtestdbというファイルが生成されます。

以下は、データベースに接続して、select文を実行するサンプルコードです。

$ cat ./sqlite_sample.py
#!/usr/bin/python3

import sqlite3

con = sqlite3.connect("testdb")

for row in con.execute('select bk copyimages.sh createexport.sh exportfile_from_input.sh font getimagefromblogdir.sh imagemojiire.py imagemojiire.sh imagemojiire.sh.org images importtxt maketitlefromh3.sh memo mizumashi_image.sh oldexport oldimages oldimport outputimages shuffle_image.sh title.txt title.txt.org wk from mytable').fetchall():
print( row )

実行するとこうなります。

$ ./sqlite_sample.py
('test1', 1)
('test2', 2)

insertしておいたデータが表示されました。

例によって、SQLiteもpandasのデータフレームにデータを読み出すことができます。

参考 python3でsqlite3の操作。作成や読み出しなどの基礎。 – Qiita

関連 PythonのPandas

PythonのSQLのまとめ

まとめ

  • Pythonからデータベースにアクセスするには、各DBに対応したライブラリをimportする
  • DBライブラリがDB-API2.0に対応していれば、pandasとDBの連携コードは同じ
  • pandasで、to_sqlやread_sqlを使ってデータベースとpandasのデータフレームのやりとりをおこなう