![見出し画像](https://assets.st-note.com/production/uploads/images/9801849/rectangle_large_type_2_11f660463cf225f5b68e88d232beb7fd.jpeg?width=1200)
Photo by
tyuiop
[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 | 太宰治 | 人間失格