pythonとsqlite3でインタラクティブな簡易データベースシステムの構築

今回作成するもの

pythonとsqlite3をつかって簡単にデータベース操作をできるようにする簡易システムみたいなものを作成する。

主な機能

  • テーブル作成機能: テーブル存在チェックあり。連続作成機能なし
  • テーブル削除機能: テーブル存在チェックあり。連続削除機能なし
  • ユーザーの追加機能: 重複ユーザーの存在チェックなし、連続追加機能なし。
  • ユーザーの削除機能: ユーザーの存在チェックあり。連続削除機能なし。
  • テーブルの一覧表示機能
  • ユーザーの一覧表示機能: テーブル選択機能なし。
  • テーブルの検索機能: ユーザー名で検索できる機能実装

database_python

テーブル作成 create_table.py

# sqlite3モジュールの読み込み
import sqlite3

# テーブル一覧を表示する関数
def printtable():
    print("☆☆☆テーブル一覧☆☆☆")
    c.execute("select * from sqlite_master where type='table'")
    for x in c.fetchall():
        print(x)
    print("☆☆☆☆☆☆☆☆☆☆☆☆")

# データベースに接続
conn = sqlite3.connect("database.sqlite")

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

# テーブル一覧の表示
printtable()

# 新しいテーブルの名前
print("\n")
tablename = input("新しいテーブルを作成します。テーブル名を入力してください: ")
print("\n")

c.execute("select count(*) from sqlite_master where type='table' and name='%s'" % tablename)
# sql = "create table if not exists users(id integer primary key, name text, address text)"
# テーブルが存在しないとき
if c.fetchone() == (0,):
    # テーブル作成のSQL文:
    sql = "create table %s (id integer primary key, name text, address text)" % tablename

    # sql文の実行
    c.execute(sql)

    # コミット
    conn.commit()

    # 確認
    print(str(tablename) + "テーブルを作成しました\n")

else:
	print(str(tablename) + "テーブルはすでに存在しています。\n")

# テーブル一覧を表示
printtable()

# 終了
print("\n")
input("エンターキーで終了します: ")

#python
conn.close()

テーブル削除 drop_table.py

# sqlite3とtkinterモジュールの読み込み
import sqlite3
from tkinter import messagebox

# テーブル一覧を表示する関数
def printtable():
    print("☆☆☆テーブル一覧☆☆☆")
    c.execute("select * from sqlite_master where type='table'")
    for x in c.fetchall():
        print(x)
    print("☆☆☆☆☆☆☆☆☆☆☆☆")

# データベースに接続
conn = sqlite3.connect("database.sqlite")

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

# テーブル一覧を表示
printtable()

# 削除したいテーブル名を入力
print("\n")
tablename = input("削除したいテーブル名を入力していください: ")
print("\n")

c.execute("select count(*) from sqlite_master where type='table' and name='%s'" % tablename)
# sql = "create table if not exists users(id integer primary key, name text, address text)"
# テーブルが存在しないとき
if c.fetchone() == (0,):
    print("\n")
    print("指定のテーブルは存在しません。")
    print("\n")
else:
	# テーブル削除のsql文
    sql = "drop table '%s'" % tablename

    # 削除時の確認
    ans = messagebox.askyesno("確認",  str(tablename) + "テーブルを削除します。本当に削除しますか?")
    if ans == True:
        # sql文の実行
        c.execute(sql)

        # コミット
        conn.commit()

        # 確認
        print("\n")
        print(str(tablename) + "テーブルを削除しました")
        print("\n")

        # テーブル一覧を表示
        printtable()

    else:
        print('削除をキャンセルしました')

# 終了
print("\n")
input("エンターキーで終了します: ")

# データベースの切断
conn.close()

ユーザーの追加 insert_user.py

# sqlite3モジュールの読み込み
import sqlite3
# データベースに接続
conn = sqlite3.connect("database.sqlite")

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

# データの挿入
username = input("名前を入力してください: ")
address = input("住所を入力してください: ")

sql = "insert into users(name, address) values (?, ?)"
user = (username, address)
c.execute(sql, user)

# コミット
conn.commit()

print('\n') # 空行
print(str(username) + " を登録しました")
print('\n') # 空行

select = "select * from users"
for row in c.execute(select):
    print(row)

print('\n') # 空行

# エンターキー
a = input("エンターキーで終了します: ")

# データベースの切断
conn.close()

ユーザーの削除 delete_user.py

# sqlite3モジュールの読み込み
import sqlite3

# データベースに接続
conn = sqlite3.connect("database.sqlite")

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

def printuser():
    print("\n") # 空行
    sql = "select * from users"
    for row in c.execute(sql):
        print(row)
    print("\n") # 空行

# 表示
printuser()

# データの削除
username = input("削除したい人の名前を入力してください(カタカナ): ")

c.execute("select count(*) from users where name='%s'" % username)
if c.fetchone() == (0,):
    print("\n")
    print(str(username) + "は存在しません")
else:
    sql = "delete from users where name = '%s'" % username
    c.execute(sql)

    # コミット
    conn.commit()

    # 確認
    print("\n")
    print(str(username) + " を削除しました")

# 表示
printuser()

# 終了
print("\n")
input("エンターキーで終了します: ")

# データベースの切断
conn.close()

テーブル一覧の表示 .tables.py

# sqlite3モジュールの読み込み
import sqlite3

# データベースに接続
conn = sqlite3.connect("database.sqlite")

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

# テーブル一覧を表示
print("☆☆☆テーブル一覧☆☆☆")
c.execute("select * from sqlite_master where type='table'")
for x in c.fetchall():
    print(x)
print("☆☆☆☆☆☆☆☆☆☆☆☆")

# 終了
print("\n")
input("エンターキーで終了します: ")

# データベース切断
conn.close()

ユーザー一覧の表示 .users.py

# sqlite3モジュールの読み込み
import sqlite3
# データベースに接続
conn = sqlite3.connect("database.sqlite")

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

# 表示
print('\n') # 空行

select = "select * from users"
for row in c.execute(select):
    print(row)

print('\n') # 空行

# 終了
a = input("エンターキーで終了します: ")

# データベースの切断
conn.close()

簡易検索機能 where_name.py

こちらはユーザー名で検索すると、そのユーザーの情報が表示されるようにしている。

# sqlite3モジュールの読み込み
import sqlite3
# データベースに接続
conn = sqlite3.connect("database.sqlite")

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

#名前検索
username = input("検索したい人の名前を入力してください(カタカナ): ")

# 表示
print('\n') # 空行

select = "select * from users where name = '%s'" % username
for row in c.execute(select):
    print(row)

print('\n') # 空行

# エンターキー
input("エンターキーで終了します: ")

# データベースの切断
conn.close()

雑感

つくっていると「あの機能もほしい」となってきて、きりがなくなってくる感じだったので、このあたりで完成とする。あとファイルが小分けになっているけど、こういうのはインターフェースまでつくるのが本当なのだろう・・・。ノンプログラマーのためコードもやたらながくなっている。