見出し画像

SQLite データベース作成①


データベースとは?

概要

データベースとは、データを効率的に保存・管理し、検索できるようにするためのシステムです。データベースにはテーブル(表)の形式でデータが格納され、各テーブルには行(レコード)と列(フィールド)が含まれます。

データベース管理システム(DBMS:Database Management System)は、データベースを作成、操作、管理するためのソフトウェアです。代表的なDBMSには、MySQL、PostgreSQL、Oracle、SQLiteなどがあり、DBMSを操作するにはSQL言語(SQL文)を用います。
SQLiteはSQLを使用しますが、特定のシステムやサーバーに依存しない自己完結型のデータベースエンジンで、組み込みシステムなど、軽量でシンプルなデータベースが必要な場面で広く使われます。

業務ではExcelを用いてデータを管理している方も多いと思います。しかし、データが多くなると重くなりますし、検索性が良いとは言えません。かと言って、Accessを使用するにしてもPCに入ってないことも多いですね…。せっかくデータベースを作成しても使う場面が限られてしまうと利便性が損なわれます。

Pythonの標準ライブラリには、SQLite3が含まれており、Pythonコードの中でデータベース操作を行うことができます。例えば、これまでの投稿で紹介したstreamlit(webアプリ)にデータベースを組み込むことで端末を選ばずデータベースを利用することができるようになります!

※データの取り扱いやセキュリティに関する責任は個人に帰属します。安全で適切な管理をお願いします。

主キー(Primary Key)

主キーは、データベースのテーブル内で各レコード(行)を一意に識別するための列または列の組み合わせです。例えば、スタッフIDのようなデータをイメージすると分かりやすいかもしれません。スタッフの名前で識別しようとすると同姓同名が存在する場合や外国人スタッフ(外国語表記の名前)が存在する場合は管理しにくくなります。スタッフ個人を識別できるID番号があると確実に識別することができます。

  • 一意性:同じ値を持つ2つのレコードは存在できません。

  • 非NULL:主キーにはNULL値を含めることはできません(必ず値を持っている必要がある)。

  • 不変性:主キーの値は、通常、変更されることがありません。主キーを変更すると、そのキーを参照している他のテーブルとの整合性が損なわれる可能性があります。

  • 1つのテーブルに1つだけ:テーブルには1つの主キーしか設定できません。ただし、主キーは複数の列から構成される「複合キー」であることもあります。

データ型

テーブル(表)を作成する際に、あらかじめ各列(フィールド)にどのようなデータが格納されるのか定義する必要があります。

  • INTEGER(INT):整数

  • REAL(FLOAT、NUMERIC):浮動小数点数

  • TEXT(CHAR、STRING):文字列

  • BLOB:画像やファイルなどのバイナリ形式のデータ

  • NULL:値が存在しないことを示すために使用されるデータ型

テーブルの作成

それでは早速SQLite3で新規テーブルを作成してみましょう。
SQLite3をimportしますが、標準ライブラリなのでinstallは不要です。

import sqlite3

次に、データベースに接続します。データベースファイルが存在しない場合は、新しく作成されます。今回はdrugs.dbというデータベースを作成します。

db = sqlite3.connect("drugs.db")

SQL文を実行するためのカーソルオブジェクトを作成します。

cur = db.cursor()

新規テーブルを作成します。

cur.execute(
    """
    CREATE TABLE Aug2024 (
        No INTEGER PRIMARY KEY AUTOINCREMENT, 
        name TEXT, 
        form INTEGER
        )   
    """
)

cur.execute()の引数にSQL文を文字列("""で囲んだ部分)で入力します。ここでのSQL文は次のような構成になっています。

CREATE TABLE テーブル名 (
 列名1 データ型1, 
 列名2 データ型2, 
  :
 )

なお、No列がPRIMARY KEY(主キー)に設定されています。また、AUTOINCREMENTを指定するとレコードが挿入される度に自動的に次のユニークな整数値を生成します。

ここまでのコードを実行すると、drugs.dbというデータベースファイルにAug2024というテーブルが作成され、そのテーブルは、整数のNo(主キー)、文字列のname、整数のformから構成されます。

レコードの挿入

テーブルができたので、データを入力します。ここには、2024年8月に薬価収載となった医薬品のデータを入れていきます。
form列には、飲み薬:1、注射剤:2、塗り薬:3、吸入剤:4、目薬:5…というように剤型に合わせて整数値を入力していきたいと思います。

cur.execute("INSERT INTO Aug2024 (name, form) VALUES ('ブリィビアクト錠', 1)")

データ挿入もCREATE TABLEの時と同様にSQL文をcur.execute()の引数に文字列として入力します。

INSERT INTO テーブル名 (列1, 列2) VALUES (データ1, データ2)

データを直接入力する場合は上記のような書き方で問題ないですが、例えば変数に格納したデータを入力したい場合は次のように書くことも出来ます。

drug = 'ブリィビアクト錠'
dosage_form = 1
cur.execute("INSERT INTO Aug2024 (name, form) VALUES (?, ?)", (drug, dosage_form))

第一引数(SQL文) ←文字列
INSERT INTO
テーブル名 (列1, 列2) VALUES (?, ?)
第二引数
(データ1, データ2)

こうすることで、何かしらの処理で得られたデータを順次データベースに追加していくというような連携ができるようになるので便利です。
残りのデータも追加しておきましょう。

cur.execute("INSERT INTO Aug2024 (name, form) VALUES (?, ?)", ('ジンタス錠', 1))
cur.execute("INSERT INTO Aug2024 (name, form) VALUES (?, ?)", ('ファビハルタカプセル', 1))
cur.execute("INSERT INTO Aug2024 (name, form) VALUES (?, ?)", ('オムジャラ錠', 1))
cur.execute("INSERT INTO Aug2024 (name, form) VALUES (?, ?)", ('ジャイパーカ錠', 1))
cur.execute("INSERT INTO Aug2024 (name, form) VALUES (?, ?)", ('ハイイータン錠', 1))
cur.execute("INSERT INTO Aug2024 (name, form) VALUES (?, ?)", ('アビガン錠', 1))
cur.execute("INSERT INTO Aug2024 (name, form) VALUES (?, ?)", ('リブテンシティ錠', 1))
cur.execute("INSERT INTO Aug2024 (name, form) VALUES (?, ?)", ('ザビセフタ配合点滴静注用', 2))
cur.execute("INSERT INTO Aug2024 (name, form) VALUES (?, ?)", ('セプーロチン静注用', 2))
cur.execute("INSERT INTO Aug2024 (name, form) VALUES (?, ?)", ('小児用レルベア50エリプタ', 4))
cur.execute("INSERT INTO Aug2024 (name, form) VALUES (?, ?)", ('ブイタマークリーム1%', 3))

(追記)
テーブルを作りっぱなしだったので追記します。
テーブル(データベース)の編集が終了したら、カーソルオブジェクトおよびデータベースを閉じる必要があります。

cur.close()
db.close()

今回はここまでです。次回に続きます。

この記事が気に入ったらサポートをしてみませんか?