「日経ソフトウェア2022年11月号 特集3 Python デスクトップアプリを作ろう」をやってみた その1

日経ソフトウェア2022年11月号 特集3 Python デスクトップアプリを作ろう」を実行してみました。

 

サンプルプログラム

サンプルプログラムは日経ソフトウェアのWebからダウンロードできます。

以下URLから「本誌バックナンバーを見る」→「2022年11月号」→「「特集3 Pythonでデスクトップアプリを作ろう 後編」(t32211.zip)

 

 

Part1 SQLite3の基本をマスターしよう

sqlite3モジュールをインポートし、データベースを作成します。

# ライブラリのインポート
import sqlite3

# データベースの作成(既に存在する場合は接続)
conn = sqlite3.connect('sample.db')

# 接続の切断
conn.close()

 

実行すると実行フォルダにsample.dbというデータベースのファイルが作成されます。

 

テーブルの作成

SQLite3で使用できるデータ型は以下の通りです。

 

データ型 説明 対応するPythonの型
BLOB Binary Large Object bytes
INTEGER INTEGER int
REAL 浮動小数 float
TEXT テキスト str
NULL NULL None

 

SQLite3の制約は以下の通りです。

 

制約 説明
NOT NULL 列がnull値を持てないようにする
DEFAULT 列の値が指定されていないときに代わりに入力される値を指定する
UNIQUE 同じ列のすべての値が異なっていることを保証するため、同じ値を入力できないようにする
PRIMARY KEY 主キーとなる制約。NOT NULLとUNIQUEの制約をもつ
CHECK 入力データが指定した条件に対してFALSEの場合は入力できないようにする

 

personalデータ例

sample.dbに「personalテーブル」を作成します。

テーブルはid(識別番号) 、name(名前)、height(身長)、weight(体重) で構成します。

作成するデータは以下の通りです。

 

id name height weight
001 Yamada Taro 173 62.5
002 Tanaka Hanako 163 53.1
003 Suzuki Saburo 180 75.8

 

テーブルは CREATE TABLE で作成します。

CREATE TABLE テーブル名 (

 列名1 データ型 制約1 制約2・・,

 列名2 データ型 制約1 制約2・・,

 列名3 データ型 制約1 制約2・・,

・・・

)

プログラム例です。

データベースに接続したあと、cursorというオブジェクトを作成します。

cursorオブジェクトでデータベースの操作を行います。

execute関数を使用してCREATE TABLEを実行しています。

 

import sqlite3

conn = sqlite3.connect('sample.db')

# カーソルオブジェクトの作成
cur = conn.cursor()

# personalテーブルの作成
cur.execute("""CREATE TABLE personal(
               id TEXT PRIMARY KEY,
               name TEXT NOT NULL,
               height INTEGER NOT NULL,
               weight REAL NOT NULL)""")

print('personalテーブルを作成しました。')
conn.close()


 

INSERT INTOでデータを追加

作成したpersonalテーブルにデータを追加するには、INSERT INTOを使用します。

 

INSERT INTO 

テーブル名 (列名1、列名2、・・・)

  VALUE (値1、値2・・・)

 

プログラム例です。

execute関数を使用してデータを入力します。

最後にcommitを実行します。(実行しないとデータベースにデータが追加されません。)

import sqlite3

conn = sqlite3.connect('sample.db')

cur = conn.cursor()

# データの追加
cur.execute("INSERT INTO personal VALUES('001', 'Yamada Taro', 173, 62.5)")
cur.execute("INSERT INTO personal VALUES('002', 'Tanaka Hanako', 163, 53.1)")
cur.execute("INSERT INTO personal VALUES('003', 'Suzuki Saburo', 180, 75.8)")

conn.commit()   # コミット

conn.close()

 

SELCT文でデータを抽出

データベースに接続されたデータはSELECT文で抽出できます。

記述方法は、以下のようになります。

① SELECT 列名1,列名2,・・・FROM テーブル名

② SELECT * FROM テーブル名

③ SELECT * FROM テーブル名 WHERE 条件

 

プログラム例です。

for 変数 in cur.execute("SELECT ・・・")で抽出されたデータが変数に代入されます。

import sqlite3

conn = sqlite3.connect('sample.db')
cur = conn.cursor()

# idが'002'と等しいデータを抽出
for row in cur.execute("SELECT * FROM personal WHERE id = '002'"):
  print(row)
print() # 改行

# heightが173以上で、かつweightが75.8と等しいデータを抽出
for row in cur.execute("SELECT * FROM personal WHERE height >= 173 AND weight = 75.8"):
  print(row)
print()

# weightが75.8以外のデータを抽出
for row in cur.execute("SELECT * FROM personal WHERE weight != 75.8"):
  print(row)
print()

conn.close()

 

実行結果

('002', 'Tanaka Hanako', 163, 53.1)

('003', 'Suzuki Saburo', 180, 75.8)

('001', 'Yamada Taro', 173, 62.5)
('002', 'Tanaka Hanako', 163, 53.1)

 

WHEREの後に記述できる条件演算子は以下になります。

 

演算子 説明
BETWEEN 値1 AND 値2 値1と値2の範囲内の値かどうか
IN(値1、値2、値3・・) 一致する値があるか
NOT IN(値1、値2、値3・・) 一致する値がないか
LIKE 文字パターン  文字パターンに一致するかどうか
IS NULL NULLかどうか
IS NOT NULL NULLでないかどうか

 

BETWEENとINを使用したプログラム例です。

import sqlite3

conn = sqlite3.connect('sample.db')
cur = conn.cursor()

# heightが170から180の範囲に含まれているデータを抽出
for row in cur.execute("SELECT * FROM personal WHERE height BETWEEN 170 AND 180"):
  print(row)
print()

# heightが160、170、180のどれかと等しいデータを抽出
for row in cur.execute("SELECT * FROM personal WHERE height IN(160, 170, 180)"):
  print(row)
print()

conn.close()

 

実行結果

('001', 'Yamada Taro', 173, 62.5)
('003', 'Suzuki Saburo', 180, 75.8)

('003', 'Suzuki Saburo', 180, 75.8)

 

LIKEを使用したプログラム例です。

import sqlite3

conn = sqlite3.connect('sample.db')
cur = conn.cursor()

# nameが'Tanaka'で始まるデータを抽出
for row in cur.execute("SELECT * FROM personal WHERE name LIKE 'Tanaka%'"):
  print(row)
print()

# nameの中に'ro'を含むデータを抽出
for row in cur.execute("SELECT * FROM personal WHERE name LIKE '%ro%'"):
  print(row)
print()

# nameが6文字以上で5文字目と6文字目が'ki'であるデータを抽出
for row in cur.execute("SELECT * FROM personal WHERE name LIKE '____ki%'"):
  print(row)
print()

conn.close()

 

実行結果

('002', 'Tanaka Hanako', 163, 53.1)

('001', 'Yamada Taro', 173, 62.5)
('003', 'Suzuki Saburo', 180, 75.8)

('003', 'Suzuki Saburo', 180, 75.8)

 

ORDER BY句でデータをソート

ORDER BY句を使用するとSELECTで抽出したデータをソートすることができます。

ソートしたい列名をORDER BYのうしろに記述すればよいです。デフォルトは昇順です。降順する場合は最後にDESCをつけます。

以下、プログラム例です。

import sqlite3

conn = sqlite3.connect('sample.db')
cur = conn.cursor()

# 身長の低い順にデータをソートする
for row in cur.execute("SELECT * FROM personal ORDER BY height"):
  print(row)
print()

# 身長の高い順にデータをソートする
for row in cur.execute("SELECT * FROM personal ORDER BY height DESC"):
  print(row)
print()

conn.close()


 

実行結果

('002', 'Tanaka Hanako', 163, 53.1)
('001', 'Yamada Taro', 173, 62.5)
('003', 'Suzuki Saburo', 180, 75.8)

('003', 'Suzuki Saburo', 180, 75.8)
('001', 'Yamada Taro', 173, 62.5)
('002', 'Tanaka Hanako', 163, 53.1)

 

テーブルの削除

テーブルの削除は DROP TABLE テーブル名で削除できます。

import sqlite3

conn = sqlite3.connect('sample.db')
cur = conn.cursor()

# personalテーブルの削除
cur.execute("DROP TABLE personal")

conn.close()

 

 

/* -----codeの行番号----- */