PythonからMariaDBに接続する
PythonからMySQLに接続し、それをテーブルに表示させるコードを書いてみた。接続は、PHPと比較するとシンプルである。これはPHPにおいてもいえることだが、SQLインジェクションに対する処理は非常に重要である。ローカルだからいいのではと思うかもしれないが、ローカルにおいて不特定多数の人が使用するならSQLインジェクション処理を行っておく必要がある。Pythonでもある程度行えるが、PHPでコードを書くほうが優秀である。今回は接続テストのために処理を行っていない。
PHPとMySQLとの連携は「ちゃんとしたプロになるPHP基礎入門」(柏岡秀男著 MdN 978-4-295-20110-6)が入門書として非常によくできており、わかりやすく書かれている。執筆段階でレビュー協力がいるのも評価としては高いといえる。ただし、オススメはしない。自分で見て判断して購入していただきたい。
接続ドライバーのインストール
PythonからMySQLへ接続するドライバーをインストールする。今回使用したのは、mysql-connector-python 8.0.29、PySimpleGUI 4.59.0、テスト環境はLinux mint 20.3 MATE、Python 3.8.10、MariaDB 10.7.3である。
pip3 install mysql-connector-python
テーブルに表示する
GUIとして2つのライブラリを使ってみた。ひとつはPySimpleGUI、もうひとつはTKinterである。PySimpleGUIはテーブルが実装されており、コードを記述する場合もシンプルである。TKinterの方はテーブルは実装されておらず、TreeViewを変更して使用する。どちらを使用しても変わらない。ただ、列ごとの幅の設定は両方共できるが、列ごとに右寄せ、左寄せといった配置はTKinterの方がよい。PySimpleGUIはテーブル全体の設定となっている。もしかしたら同じようにできるかもしれないが、見つけることはできなかった。
PySimpleGUI版
コードも短くシンプルな記述となる。
# Python-MySQL接続テスト
# PySimpleGUI版
import mysql.connector
import PySimpleGUI as sg
# 取得した書籍一覧を格納する配列
book_list = []
# 接続設定
con = mysql.connector.connect(
host='localhost',
port='3306',
user='root',
password='設定したパスワード',
database='booksdb'
)
# 書籍一覧の取得
cur = con.cursor()
cur.execute('SELECT * FROM tbooks')
rows = cur.fetchall()
for row in rows:
book_list.append([row[0], row[1], row[2], row[3], row[4], row[5], row[6]])
# 切断
cur.close()
con.close()
# テーブルの設定
sg.theme('SystemDefault1')
header = ['コード', '書籍名', '著者', '出版社', '出版日', 'ページ', 'ISBN']
tbl_books = [[
sg.Table(
book_list,
headings=header,
auto_size_columns=False,
col_widths=[5, 30, 14, 20, 8, 5, 12],
justification='left'
)
]]
# 一覧表示
window = sg.Window('Python-MySQL接続テスト', tbl_books, resizable=True)
# イベントループ(お約束ごと)
while True:
event, values = window.read()
if event is None:
break
実行結果
TKinter-TreeView版
記述する量が多い、またデフォルトではスクロールバーが表示されないので、追加する必要がある。
# Python-MySQL接続テスト
# TKinter TreeView版
import mysql.connector
import tkinter as tk
import tkinter.ttk as ttk
from tkinter import Frame
# 取得した書籍一覧を格納する配列
book_list = []
# 接続設定
con = mysql.connector.connect(
host='localhost',
port='3306',
user='root',
password='設定したパスワード',
database='booksdb'
)
# 書籍一覧の取得
cur = con.cursor()
cur.execute('SELECT * FROM tbooks')
rows = cur.fetchall()
for row in rows:
book_list.append([row[0], row[1], row[2], row[3], row[4], row[5], row[6]])
# 切断
cur.close()
con.close()
# テーブルの設定
root = tk.Tk()
root.title('Python-MySQL接続テスト TKinter-TreeView版')
root.geometry('870x200')
frame = Frame(root)
tree = ttk.Treeview(frame, columns=(1, 2, 3, 4, 5, 6, 7), show='headings', height=8)
tree.column(1, anchor='e', width=40)
tree.column(2, anchor='w', width=200)
tree.column(3, anchor='w', width=130)
tree.column(4, anchor='w', width=200)
tree.column(5, anchor='w', width=90)
tree.column(6, anchor='e', width=50)
tree.column(7, anchor='w', width=120)
tree.heading(1, text='コード', anchor='w')
tree.heading(2, text='書籍名', anchor='w')
tree.heading(3, text='著者', anchor='w')
tree.heading(4, text='出版社', anchor='w')
tree.heading(5, text='出版日', anchor='w')
tree.heading(6, text='ページ', anchor='w')
tree.heading(7, text='ISBN', anchor='w')
# 一覧表示
for i in range(len(book_list)):
tree.insert('', 'end', values=(book_list[i]))
tree.grid(row=1, column=1, sticky='nsew')
# スクロールバー
scrollbar = ttk.Scrollbar(frame, orient=tk.VERTICAL, command=tree.yview)
tree.configure(yscroll=scrollbar.set)
scrollbar.grid(row=1, column=2, sticky='nsew')
frame.pack(fill='both', expand=1, padx=10, pady=10)
root.mainloop()
実行結果だけを見るとTKinterのほうがいいと思うかもしれないが、PySimpleGUIのテーブルの設定について詳しく見ていないので、もしかしたら見やすく設定できるかもしれない。