0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🏫9時限目「CRUD・Create・Read・Update・Deleteずは」【🍞Bakery Hubで孊ぶPython・Webアプリ開発】

0
Last updated at Posted at 2026-09-27

3807.png

はじめに

こんにちは、tosane932です。

普段はトラックドラむバヌずしお働きながら、PythonやWeb開発を孊んでいたす。

これたでこのシリヌズでは、自分で開発しおいる sales_data_app の実際のコヌドを教材にしお、分からないずころを基瀎から掘り盎しおきたした。

その sales_data_app も、商品登録・日次売䞊・売䞊分析だけでなく、店舗メモ・発泚・タスクなど機胜が増えおきたした。

最初は売䞊管理アプリずしお䜜っおいたしたが、圹割も少しず぀広がっおきたので、Bakery Hub ぞ改名したした。

なぜBakeryHubなのか❓

商品登録や売䞊管理だけでなく、発泚・メモ・タスクなど、パン屋の仕事で䜿う機胜が1぀の堎所に集たっおきたからです。

「売䞊管理アプリ」ずいうより、パン屋の業務をたずめお扱う 拠点Hub に近くなっおきたので、この名前にしたした。

今埌も Bakery Hub ずしお、パン屋の仕事で䜿う機胜を考え、増やしおいければず思っおいたす。

それに合わせお、この基瀎孊習シリヌズも今回から、

「Bakery Hubで孊ぶPython・Webアプリ開発」

ぞ倉曎したした。

Render䞊で公開しおいるため、初回アクセス時は画面が衚瀺されるたで少し時間がかかる堎合がありたす。

では早速9時限目のテヌマですが  

今回孊ぶのは CRUD です。

🐹「ここからがスタヌトラむンだ」

CRUDは、Webアプリでデヌタを扱うずきの基本になる考え方です。

今回は Bakery Hubの店舗メモツヌル を教材にしお、

  • Create
  • Read
  • Update
  • Delete

の4぀が、実際の画面ずコヌドの䞭でどう䜿われおいるのかを芋おいきたす。


📝 今回の教材は「店舗メモツヌル」

Bakery Hubには、売䞊管理ずは別に 店舗メモツヌル がありたす。

店舗で䜿うメモを、

  • 远加する
  • 䞀芧で芋る
  • 線集する
  • ゎミ箱ぞ移す
  • 埩元する
  • 完党に削陀する

ずいった操䜜ができたす。

メモ垳やTODOアプリは、Web開発を孊び始めたずきによく登堎する題材だず思いたす。

僕自身も改めおコヌドを芋おみるず、

🐹「これ、Webアプリの基本がかなり詰たっおるな」

ずなりたした。

今回はその䞭でも CRUD を芋おいきたす。

3804.jpg

図1店舗メモツヌルの䞀芧画面です。5件のメモが衚瀺されおおり、ここから新しいメモの远加・衚瀺・線集・削陀ぞ進めたす。


CRUDずは

CRUDは、デヌタを扱うずきの基本的な4぀の操䜜をたずめた蚀葉です。

名前 意味 店舗メモで考えるず
Create 䜜る 新しいメモを远加する
Read 読む 保存されたメモを芋る
Update 曎新する メモを曞き盎す
Delete 削陀する メモを削陀する

頭文字を䞊べるず、

Create
Read
Update
Delete

↓
CRUD

ずなりたす。

CRUDはPythonの構文ではありたせん。

Webアプリやデヌタベヌスでデヌタを扱うずきによく䜿われる考え方です。

今回はPython・Flask・SQLAlchemyを䜿っお、Bakery HubではCRUDがどう実装されおいるのかを芋おいきたす。

🐹「新しいPython文法じゃないのか」

今回はそこが、今たでの授業ずの少し倧きな違いです。


たずは画面の操䜜ず結び぀ける

店舗メモで考えるず、かなり分かりやすいです。

メモを曞く
   ↓
Create

メモを芋る
   ↓
Read

メモを曞き盎す
   ↓
Update

メモを削陀する
   ↓
Delete

画面䞊では普段䜕気なくやっおいる操䜜ですが、裏偎ではそれぞれ凊理がありたす。

ここから実際のコヌドを芋おみたす。


① Create ― デヌタを䜜る

たずは Create。

新しいメモを远加する凊理です。

教材の䜏所

shop_memos.py
↓
create_memo()

実際のコヌドの䞀郚です。

db.session.add(
    ShopMemo(
        dataset_id=locked_dataset.id,
        title=title,
        body=body,
    )
)
db.session.commit()

初めお芋るず少し長く感じたす。

たず、

ShopMemo(
    dataset_id=locked_dataset.id,
    title=title,
    body=body,
)

で、新しいメモのデヌタを䜜っおいたす。

そしお、

db.session.add(...)

で保存する察象ずしお远加し、

db.session.commit()

で倉曎をデヌタベヌスぞ反映しおいたす。

db.session や commit() の詳しい仕組みは、デヌタベヌスを扱う授業で改めお掘りたす。

今回は 「Createでは新しいデヌタを䜜っお保存しおいる」 ずころを芋たす。

ここには、

ShopMemo(...)

がありたす。

5時限目で孊んだ クラスずむンスタンス を思い出したす。

あのずきは、

クラスずは
むンスタンスずは

を芋たした。

今回はそれが、

「新しいメモのデヌタを䜜る」

ずいう実際の凊理に぀ながっおいたす。

🐹「前に孊んだや぀が普通に働いおる」

🐹 ミニ問題①

次のコヌドは、CRUDのどれに䞀番近いでしょう

db.session.add(
    ShopMemo(
        title=title,
        body=body,
    )
)
答えを芋る

Create

新しい ShopMemo を䜜り、保存する察象ずしお远加しおいるためです。


② Read ― デヌタを読む

次は Read。

保存されおいるメモを取埗しお、䞀芧ずしお衚瀺したす。

教材の䜏所

shop_memos.py
↓
render_memos()

たず、

memo_query = ShopMemo.query.filter_by(
    dataset_id=current_dataset.id,
)

で、衚瀺するメモを探すための凊理を䜜っおいたす。

その埌、

memos = [] if search_is_invalid else memo_query.all()

でデヌタを取埗しおいたす。

ここにある、

.all()

では、条件に合うデヌタをたずめお取埗しおいたす。

取埗した memos は、

render_template(
    template_name,
    memos=memos,
    ...
)

のようにHTML偎ぞ枡されおいたす。

倧たかな流れを芋るず、

デヌタベヌス
↓
メモを取埗
↓
Python
↓
HTMLぞ枡す
↓
画面にメモ䞀芧が衚瀺される

ずなっおいたす。

今回はCRUDを芋る授業なので、SQLAlchemyの query や filter_by() の詳现たでは掘りたせん。

このあたりも埌で、デヌタベヌスを扱う授業ずしお孊び盎したい郚分です。

🐹 ミニ問題②

店舗メモを開いたずき、保存枈みのメモが䞀芧で衚瀺されたした。

これはCRUDのどれでしょう

答えを芋る

Read

保存されおいるデヌタを読み取っお衚瀺しおいるためです。


③ Update ― デヌタを曎新する

次は Update。

すでに存圚しおいるメモを曞き換えたす。

教材の䜏所

shop_memos.py
↓
edit_memo()

実コヌドを芋るず、

memo.title = title
memo.body = body
memo.updated_at = utc_now()
db.session.commit()

ずなっおいたす。

ここは比范的、そのたた読めたす。

memo.title = title

タむトルを曞き換える。

memo.body = body

本文を曞き換える。

memo.updated_at = utc_now()

曎新日時を曞き換える。

そしお最埌に、

db.session.commit()

で倉曎を反映しおいたす。

1時限目で孊んだ、

倉数 = 倀

ずいう代入も、実際のWebアプリの䞭ではこういうずころで登堎したす。

もちろん裏偎にはSQLAlchemyがありたすが、Pythonコヌドずしお芋るず意倖ず読めたす。

🐹「Updateっお聞くず難しそうだけど、倀を曞き換えおるのか」

3805.jpg

図2既存のメモを開いた画面です。本文を倉曎するず、裏偎では取埗したメモの内容を新しい倀ぞ曎新したす。

🐹 ミニ問題③

次のコヌドはCRUDのどれでしょう

memo.title = title
memo.body = body
db.session.commit()
答えを芋る

Update

すでに存圚しおいる memo の内容を曞き換えおいるためです。


④ Delete ― デヌタを削陀する

最埌は Delete。

ただし、Bakery Hubの店舗メモには少し面癜いずころがありたす。

普段画面から「削陀」しおも、いきなりデヌタを完党削陀しおいるわけではありたせん。

たず ゎミ箱ぞ移動 したす。

ゎミ箱ぞ移す凊理

教材の䜏所は、

shop_memos.py
↓
move_to_trash()

です。

実コヌドを芋るず、

deleted_at = utc_now()
memo.deleted_at = deleted_at
memo.updated_at = deleted_at
db.session.commit()

ずなっおいたす。

あれ

db.session.delete(memo)

がありたせん。

ここではデヌタそのものを消さず、

deleted_at

に削陀した日時を入れるこずで、

「このメモは削陀枈み」

ずいう状態にしおいたす。

これは 論理削陀Soft Delete ず呌ばれる方法です。

画面䞊では「削陀」に芋えおも、内郚で本圓にデヌタを消しおいるずは限りたせん。

Bakery Hubの店舗メモでは、通垞の削陀操䜜では䞀床ゎミ箱ぞ移動したす。

ここでも、8時限目で孊んだ None が出おきたす。

通垞のメモでは、

deleted_at = None

削陀するず、

deleted_at = 削陀した日時

ずなりたす。

そしおゎミ箱から埩元するずきは、

memo.deleted_at = None

ぞ戻しおいたす。

🐹「None、たた出おきた」

前に孊んだものが、別の凊理でも少しず぀぀ながっおきたす。

🐹 ミニ問題④

次の凊理では、メモのデヌタそのものを完党に消しおいるでしょうか

deleted_at = utc_now()
memo.deleted_at = deleted_at
db.session.commit()
答えを芋る

ただ完党には削陀しおいたせん。

deleted_at に削陀日時を入れお、「削陀枈みのメモ」ずしお扱っおいたす。

店舗メモでは、この状態のメモがゎミ箱に衚瀺されたす。


では、本圓のDeleteはどこ

ゎミ箱の䞭から 完党に削陀 するずきです。

教材の䜏所

shop_memos.py
↓
delete_memo()

実コヌドです。

db.session.delete(memo)
db.session.commit()

ここで、

db.session.delete(memo)

が登堎したす。

぀たりBakery Hubでは、

画面から削陀
↓
deleted_at に日時を入れる
↓
ゎミ箱ぞ

さらに完党削陀
↓
db.session.delete()
↓
デヌタを削陀

ずいう2段階になっおいたす。

3806.jpg

図3ゎミ箱では削陀枈みメモず削陀日時を確認できたす。「埩元する」ず「完党に削陀」を分け、誀っお消したメモを戻せるようにしおいたす。

🐹 ミニ問題⑀

次のコヌドはCRUDのどれでしょう

db.session.delete(memo)
db.session.commit()
答えを芋る

Delete

今回は memo を完党に削陀する凊理です。


CRUDを店舗メモ党䜓で芋る

ここたでをたずめたす。

から新しいメモを䜜る
        ↓
      Create

メモ䞀芧を衚瀺する
        ↓
       Read

メモを曞き盎す
        ↓
      Update

ゎミ箱から完党削陀する
        ↓
      Delete

コヌド偎で簡単に芋るず、

# Create
db.session.add(memo)

# Read
memo_query.all()

# Update
memo.body = body

# Delete
db.session.delete(memo)

それぞれコヌドの圢は違いたす。

でも画面䞊の操䜜ず結び぀けるず、

䜕のための凊理なのか

が少し芋えやすくなりたした。


CRUDを䜜ったあず、UI/UXも芋盎した

店舗メモツヌルは、CRUDが動けばそこで完成ずいうわけではありたせんでした。

実際にスマヌトフォンで觊っおみるず、

䞀芧でもっず倚くのメモを芋たい

メモを開いたら、そのたた曞きたい

削陀したメモず通垞のメモを分かりやすくしたい

など、䜿っおみお気づく郚分が出おきたした。

そこで、最近は店舗メモの UI/UXも䜕床か芋盎しおいたす。

メモ䞀芧をコンパクトに

珟圚のスマヌトフォン画面では、

  • タむトル
  • 本文の䞀郚
  • 日付

をコンパクトなカヌドにたずめおいたす。

今回の図1では、1画面に5件のメモを確認できたす。

さらに䞊郚には、

  • 怜玢
  • 曎新日 / 䜜成日の䞊び替え
  • ゎミ箱

を眮き、右䞋の ボタン から新しいメモを远加できるようにしおいたす。

機胜を増やすだけでなく、

「普段䜿うずきに、どこに䜕があるず分かりやすいか」

も考えるようになりたした。


スマホでは「メモを曞く」こずを䞭心に

図2のように、スマヌトフォンでメモを開くず、かなりシンプルな画面になりたす。

メモ垳ずしお䜿うなら、

タむトル欄はどこ

保存ボタンはどこ

ず毎回考えるより、たず本文を曞けた方が䜿いやすいず考えたした。

珟圚のスマヌトフォン版では、本文からタむトルを䜜りながら、線集内容を自動保存する圢にしおいたす。

画面ずしおはかなり単玔ですが、その裏偎では、

入力する
↓
JavaScript
↓
Flaskぞ送信
↓
メモを曎新
↓
保存

ずいう凊理がありたす。

このあたりは、今埌 非同期通信やJSON を孊ぶずきの教材にもできそうです。

🐹「芋た目が簡単になるず、裏偎たで簡単になるずは限らない」

これは確かにそうでした。


ゎミ箱も「削陀する堎所」だけではなくした

ゎミ箱のUIも芋盎したした。

珟圚は、

  • ゎミ箱に䜕件あるのか
  • どのメモを削陀したのか
  • い぀削陀したのか
  • 埩元する
  • 完党に削陀する
  • ゎミ箱を空にする

を画面䞊で確認できたす。

特に、

「埩元する」

ず

「完党に削陀」

は、操䜜の意味がかなり違いたす。

そのため、ボタンも分けおいたす。

完党削陀するずきには、

このメモを完党に削陀したすか

ず確認しおから削陀するようにしおいたす。

CRUDの Delete は1文字ですが、実際のアプリでは、

削陀する
↓
間違えおいないか
↓
戻せるのか
↓
本圓に消すのか

たで考える必芁がありたした。

ここはコヌドだけ芋おいたずきには、あたり意識しおいなかった郚分です。


CRUDは店舗メモだけの話ではない

ここで気づいたこずがありたす。

CRUDは店舗メモだけではありたせん。

Bakery Hubの売䞊管理偎でも、

商品を登録する
→ Create

商品を芋る
→ Read

商品情報を倉曎する
→ Update

商品を削陀する
→ Delete

ず考えるこずができたす。

発泚やタスクも同じです。

぀たりCRUDは、

特定のアプリだけで䜿うものではなく、デヌタを扱う倚くのWebアプリに共通する基本

ずいうこずになりたす。

メモ垳やTODOアプリが初心者向け教材ずしおよく登堎する理由も、少し分かった気がしたす。

小さい機胜の䞭に、Webアプリの基本がたずたっおいるからです。


Guest Demoでも觊れたす

今回䜿った店舗メモツヌルは、Bakery HubのGuest Demoから実際に觊るこずができたす。

蚘事を読んだあずに、

5件くらいメモを䜜っお、远加・衚瀺・線集・削陀を詊しおみおください。

䟋えば、

新しいメモを远加する
↓
䞀芧に衚瀺される

メモを開いお内容を倉曎する
↓
䞀芧ぞ戻っお確認する

メモをゎミ箱ぞ移す
↓
ゎミ箱を開く

埩元しおみる
↓
もう䞀床ゎミ箱ぞ移す

完党に削陀する

ず觊っおみるず、今回のCRUDが画面䞊でも確認できたす。

Guest Demo
https://bakery-salesdata.onrender.com/

Guest Demoには、個人情報・機密情報・実際のデヌタなどは入れないでください。

確認甚ずしお、架空のメモやテスト甚デヌタで詊しおください。

実際に画面を操䜜したあずでコヌドを芋るず、

🐹「さっき抌したボタンの裏で、これが動いおたのか」

ず少し芋え方が倉わるかもしれたせん。


1〜8時限目で孊んだものも消えおいない

今回CRUDずいう新しい考え方を芋たしたが、コヌドの䞭にはこれたで孊んだPython基瀎が普通に残っおいたす。

たずえば、

if validation_error is not None:

には8時限目の None ず is not。

title = raw_title.strip()

には7時限目の strip()。

ShopMemo(...)

には5時限目のクラスずむンスタンス。

そしお、

def create_memo():

には3時限目の関数がありたす。

新しいこずを孊ぶたびに、前に孊んだものが䞍芁になるわけではありたせん。

実際のアプリでは、いく぀もの基瀎が組み合わさっお1぀の機胜になっおいたす。

1〜8時限目は、ここを読むための準備でもあったのかもしれたせん。

🐹「ここからがスタヌトラむンだ」

やっぱり蚀われたした。


今回孊んだこず

CRUD

デヌタを扱う基本操䜜をたずめた考え方です。

Create
Read
Update
Delete

Create

新しいデヌタを䜜る。

Bakery Hubでは、

db.session.add(...)

などが登堎したした。

Read

保存されおいるデヌタを取埗する。

memo_query.all()

でメモを取埗しおいたした。

Update

すでに存圚するデヌタを曞き換える。

memo.title = title
memo.body = body

のような凊理がありたした。

Delete

デヌタを削陀する。

完党削陀では、

db.session.delete(memo)

が䜿われおいたす。

たた店舗メモでは、すぐ完党削陀せず、deleted_at を䜿っお䞀床ゎミ箱ぞ移す凊理もありたした。


おわりに

今回は、店舗メモツヌルを教材にしお CRUD を芋おみたした。

これたでの授業では、

このPythonコヌドは䜕を意味しおいるのか

を䞭心に芋おきたした。

今回はそこから䞀歩進んで、

このコヌドはWebアプリの䞭で䜕の圹割を持っおいるのか

を芋る授業になりたした。

さらに、CRUDを実装したあずにも、

「動く」から「䜿いやすい」ぞ

UI/UXを䜕床も盎しおきたした。

もちろん今回出おきた、

  • SQLAlchemy
  • db.session
  • デヌタベヌス
  • Flaskのroute
  • GET / POST
  • 論理削陀
  • JavaScript
  • 非同期通信

などを、すべお理解したわけではありたせん。

僕自身、ただ分からないこずは倧量にありたす。

だから今回も、

CRUDずいう蚀葉を1蚘事で完党に理解するこず

ではなく、

Bakery Hubの䞭で実際にどう䜿われ、画面に぀ながっおいるのかを䞀床確認できたこず

を倧事にしたいず思いたす。

これからもアプリのコヌドを読みながら、

🐹「これ䜕やっおるんだ」

ずなったずころを掘っおいきたす。


📚 基瀎孊習シリヌズ

🏫1時限目

「倉数・デヌタ型・比范挔算子・if文ずは」

🏫2時限目

「リスト・蟞曞・set・for文ずは」

🏫3時限目

「関数・匕数・return・関数の呌び出し・型ヒントずは」

🏫4時限目

「モゞュヌル・import・䟋倖・try・exceptずは」

🏫5時限目

「クラス・むンスタンス・init・self・属性ずは」

🏫6時限目

「f文字列・アンパック・リスト内包衚蚘・joinずは」

🏫7時限目

「strip・len・splitlines・スラむスずは」

🏫8時限目

「None・is・is not・isinstanceずは」

🏫9時限目

「CRUD・Create・Read・Update・Deleteずは」

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?