見出し画像

[Python]データベースとターミナル本棚を連携させてみる

1.何をするのか

前回28行で作るターミナル本棚という記事を投稿しました。ここでは、追加したデータがプログラムを終了すると失われてしまいました。そこで、今回はローカルのデータベースとターミナル本棚を連携させることにより、実行を終了させてもデータが保存されるようにします。

2.本棚オブジェクトの改造

前回28行のクラスで表現した本棚オブジェクトをデータベースと連携できるように変更します。ここでスクリプト名はbook_shelf.pyとします。

import sqlite3
import os

PATH = os.path.join(os.getcwd(), "bk_shelf.db")
connect = sqlite3.connect(PATH)
cursor = connect.cursor()

class BookShelf:
    #インスタンスされた時点でテーブルを作成
    def __init__(self, name):
        self.name = name
        create_tb_sql = """CREATE TABLE if not exists {0}
                        (id integer Primary key AUTOINCREMENT,
                        author text,
                        book_name text)
                        """.format(self.name)
        cursor.execute(create_tb_sql)
        print("created")

    def __str__(self):
        message = "本棚[{0}]".format(self.name)
        return message

    #データを追加する処理
    def add_book(self, title, author):
        add_data_sql = "INSERT INTO {0} VALUES(null, '{1}', '{2}')".format(self.name, title, author)
        cursor.execute(add_data_sql)
        connect.commit()
        print("追加したよ( ̄・ω・ ̄)")

    #情報の一覧取得処理
    def list_book(self):
        search_all_sql = "SELECT * FROM {0}".format(self.name)
        cursor.execute(search_all_sql)
        result = cursor.fetchall()
        dt_exist_flag = 1 if len(result) != 0 else 0

        if dt_exist_flag:
            print(">--{0:^10}--<".format("一覧"))
            for row in result:
                id = row[0]
                author = row[1]
                book_name = row[2]
                print("{0:<10}| {1:<10}| {2:<10}".format(id, author, book_name))
        else:
            print("\n本棚には何も追加されていません。")

    #著者名で本を検索して抽出する処理
    def search_book_by_author(self, author):
        search_sql = "SELECT * FROM  {0} WHERE author='{1}'".format(self.name, author)
        cursor.execute(search_sql)
        result = cursor.fetchall()
        dt_exist_flag = 1 if len(result) != 0 else 0

        if dt_exist_flag:
            print(">--{0:^10}--<".format("検索結果"))
            for row in result:
                id = row[0]
                author = row[1]
                book_name = row[2]
                print("{0:<10}| {1:<10}| {2:<10}".format(id, author, book_name))
        else:
            print("\n該当するデータは見つかりませんでした。")

    #idを指定してデータを削除する処理
    def remove_book_by_id(self, id):
        del_flag = int(input("削除していいの(´・ω・`)?[0:NG/1:OK]"))
        del_sql = "DELETE FROM {0} WHERE id='{1}'".format(self.name, id)
        if del_flag:
            cursor.execute(del_sql)
            connect.commit()
            print("id:{0}のデータを削除しました".format(id))
        else:
            pass

3.本棚オブジェクトを操作する

2で作成したモジュールをインポートしえオブジェクトを操作するスクリプトを作成します。

#book_shelfモジュールをインポート
import book_shelf

#本棚オブジェクトを操作する処理
while True:

    select_mode = int(input("1:本棚を選択/2:本を追加する/3:一覧表示/4:検索/5:削除/[0:操作をやめる]"))

    if select_mode == 1:
        shelf_name = input("本棚の名前を決めてください:")
        shelf = book_shelf.BookShelf(shelf_name)
    elif select_mode == 2:
        author = input("著者を入力してください:")
        book = input("本のタイトルを入力してください:")
        shelf.add_book(author, book)
    elif select_mode == 3:
        shelf.list_book()
    elif select_mode == 4:
        author = input("検索したい著者名を入力してください:")
        shelf.search_book_by_author(author)
    elif select_mode == 5:
        id = input("idを指定して削除してください:")
        shelf.remove_book_by_id(id)
    elif select_mode == 0:
        break

4.実行してみる

3の操作スクリプトを実行します。

[追加処理]

1:本棚を選択/2:本を追加する/3:一覧表示/4:検索/5:削除/[0:操作をやめる]1
本棚の名前を決めてください:novel
created
1:本棚を選択/2:本を追加する/3:一覧表示/4:検索/5:削除/[0:操作をやめる]2
著者を入力してください:夏目漱石
本のタイトルを入力してください:吾輩は猫である
追加したよ( ̄・ω・ ̄)
1:本棚を選択/2:本を追加する/3:一覧表示/4:検索/5:削除/[0:操作をやめる]2
著者を入力してください:夏目漱石
本のタイトルを入力してください:草枕
追加したよ( ̄・ω・ ̄)
1:本棚を選択/2:本を追加する/3:一覧表示/4:検索/5:削除/[0:操作をやめる]2
著者を入力してください:太宰治
本のタイトルを入力してください:人間失格
追加したよ( ̄・ω・ ̄)
1:本棚を選択/2:本を追加する/3:一覧表示/4:検索/5:削除/[0:操作をやめる]2
著者を入力してください:与謝野晶子
本のタイトルを入力してください:みだれ髮
追加したよ( ̄・ω・ ̄)

[一覧表示]


1:本棚を選択/2:本を追加する/3:一覧表示/4:検索/5:削除/[0:操作をやめる]3
>--    一覧    --<
1         | 夏目漱石      | 吾輩は猫である
2         | 夏目漱石      | 草枕
3         | 太宰治       | 人間失格
4         | 与謝野晶子     | みだれ髮

[検索]

1:本棚を選択/2:本を追加する/3:一覧表示/4:検索/5:削除/[0:操作をやめる]4
検索したい著者名を入力してください:夏目漱石
>--   検索結果   --<
1         | 夏目漱石      | 吾輩は猫である
2         | 夏目漱石      | 草枕

[削除]

1:本棚を選択/2:本を追加する/3:一覧表示/4:検索/5:削除/[0:操作をやめる]5
idを指定して削除してください:4
削除していいの(´・ω・`)?[0:NG/1:OK]1
id:4のデータを削除しました
1:本棚を選択/2:本を追加する/3:一覧表示/4:検索/5:削除/[0:操作をやめる]3
>--    一覧    --<
1         | 夏目漱石      | 吾輩は猫である
2         | 夏目漱石      | 草枕
3         | 太宰治       | 人間失格



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