<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Joseph utuedeye </title>
    <description>The latest articles on DEV Community by Joseph utuedeye  (@joe_).</description>
    <link>https://dev.to/joe_</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1594973%2F2588c2ec-fed3-4e55-82d0-fdbbe3deedd2.png</url>
      <title>DEV Community: Joseph utuedeye </title>
      <link>https://dev.to/joe_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joe_"/>
    <language>en</language>
    <item>
      <title>Deconstructing Your FastAPI Endpoint: Smart Data, Smart Saving!</title>
      <dc:creator>Joseph utuedeye </dc:creator>
      <pubDate>Fri, 01 Aug 2025 21:27:25 +0000</pubDate>
      <link>https://dev.to/joe_/deconstructing-your-fastapi-endpoint-smart-data-smart-saving-5bkk</link>
      <guid>https://dev.to/joe_/deconstructing-your-fastapi-endpoint-smart-data-smart-saving-5bkk</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1sq5zg7jumicbg2jjsg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1sq5zg7jumicbg2jjsg.png" alt="Eva on Unsplash" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alright, backend explorers! We've made &lt;code&gt;GET&lt;/code&gt; endpoints to read data and basic &lt;code&gt;POST&lt;/code&gt; endpoints to create simple stuff. But what if we want to create something complex, like a full "Book" object with a title, author, and perhaps more? And how do we save it &lt;em&gt;permanently&lt;/em&gt; to a database like MongoDB?&lt;/p&gt;

&lt;p&gt;Today, we're going to explicitly dissect a powerful FastAPI endpoint that does exactly that. It introduces some vital concepts: &lt;strong&gt;Pydantic models&lt;/strong&gt; (for smart data handling) and &lt;strong&gt;interacting with a MongoDB database&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here's the endpoint we're going to break down, line by line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# main.py (continued)
# ... app = FastAPI() (from previous sessions) ...
&lt;/span&gt;
&lt;span class="c1"&gt;# These imports are crucial for our new endpoint!
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.model.book&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BookCreate&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.config.database&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_db&lt;/span&gt;

&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/books/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_book&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BookCreate&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Creates a new book.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;new_book_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# Convert the Pydantic model to a Python dictionary
&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_db&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# Get our MongoDB database connection
&lt;/span&gt;
    &lt;span class="c1"&gt;# Insert the new book data into the 'books' collection
&lt;/span&gt;    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;books&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insert_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_book_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# MongoDB creates a unique ID for each new document; we convert it to a string
&lt;/span&gt;    &lt;span class="n"&gt;book_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inserted_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Book created!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;book_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Diving into the Code: A Line-by-Line Breakdown
&lt;/h3&gt;

&lt;p&gt;Let's dissect this endpoint piece by piece to understand its full power.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;1. The Imports: Setting the Stage&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.model.book&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BookCreate&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.config.database&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_db&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;from app.model.book import BookCreate&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it is:&lt;/strong&gt; This line is bringing in something called &lt;code&gt;BookCreate&lt;/code&gt; from a specific file path (&lt;code&gt;app/model/book.py&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it's here:&lt;/strong&gt; &lt;code&gt;BookCreate&lt;/code&gt; is not just any Python class; it's a &lt;strong&gt;Pydantic model&lt;/strong&gt;! Pydantic is a fantastic Python library that FastAPI uses heavily. It helps us define the &lt;em&gt;structure&lt;/em&gt; and &lt;em&gt;types&lt;/em&gt; of data we expect to receive (or send). Keeping these models in separate files (&lt;code&gt;app/model/book.py&lt;/code&gt; in this case) keeps our &lt;code&gt;main.py&lt;/code&gt; clean and organized.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;(We'll define &lt;code&gt;BookCreate&lt;/code&gt; explicitly in a moment!)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;from app.config.database import get_db&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it is:&lt;/strong&gt; This line imports a function named &lt;code&gt;get_db&lt;/code&gt; from &lt;code&gt;app/config/database.py&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it's here:&lt;/strong&gt; This &lt;code&gt;get_db&lt;/code&gt; function is responsible for giving us an active connection to our MongoDB database. Putting database connection logic in a separate &lt;code&gt;config&lt;/code&gt; file is a best practice for organization and maintainability.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;2. The Endpoint Definition: &lt;code&gt;@app.post("/books/")&lt;/code&gt;&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/books/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_book&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BookCreate&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;@app.post("/books/")&lt;/code&gt;&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recap:&lt;/strong&gt; You've seen this decorator before! It tells FastAPI that the &lt;code&gt;create_book&lt;/code&gt; function below it should handle &lt;strong&gt;HTTP POST requests&lt;/strong&gt; sent to the &lt;code&gt;/books/&lt;/code&gt; URL path. Remember, &lt;code&gt;POST&lt;/code&gt; is for &lt;em&gt;creating new resources&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;&lt;code&gt;async def create_book(...)&lt;/code&gt;&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recap:&lt;/strong&gt; &lt;code&gt;async def&lt;/code&gt; means this is an asynchronous function, allowing FastAPI to handle many requests concurrently without waiting for one operation (like a database call) to finish before starting another.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;book: BookCreate&lt;/code&gt;&lt;/strong&gt;: &lt;strong&gt;🔥 This is a game-changer! 🔥&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it is:&lt;/strong&gt; This isn't just a simple type hint like &lt;code&gt;name: str&lt;/code&gt; anymore. &lt;code&gt;book&lt;/code&gt; is the name of our parameter, and its type hint is &lt;code&gt;BookCreate&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Why it's amazing (Pydantic in action):&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1.  **Automatic Request Body Parsing:** When a `POST` request comes to `/books/`, FastAPI *automatically* knows to look at the request's JSON body.
2.  **Automatic Data Validation:** FastAPI (using Pydantic) takes the JSON data from the request body and tries to convert it into a `BookCreate` object. If the incoming JSON is missing required fields, or if a field has the wrong type (e.g., `title` is a number instead of text), FastAPI will **automatically send a clear error message (a `422 Unprocessable Entity` status code)** back to the client\! You don't write any validation code\!
3.  **Automatic Documentation:** Pydantic models are used by FastAPI to generate incredible interactive API documentation (in Swagger UI) that shows exactly what fields are expected, their types, and if they're required.
4.  **Python Object:** After successful validation, the `book` variable inside your `create_book` function isn't just raw JSON; it's a neat Python object with attributes like `book.title` and `book.author`.
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;What &lt;code&gt;BookCreate&lt;/code&gt; might look like (in &lt;code&gt;app/model/book.py&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/model/book.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BookCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;publication_year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="c1"&gt;# Optional field with a default value of None
&lt;/span&gt;    &lt;span class="c1"&gt;# You can add more fields here like description: str, etc.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;This &lt;code&gt;BaseModel&lt;/code&gt; from Pydantic is what gives &lt;code&gt;BookCreate&lt;/code&gt; all those superpowers!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;3. Processing the Data: &lt;code&gt;new_book_data = book.dict()&lt;/code&gt;&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="n"&gt;new_book_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it is:&lt;/strong&gt; The &lt;code&gt;book&lt;/code&gt; variable is a Pydantic object. While it's great for Python, most databases (including MongoDB) prefer to receive data as a standard Python dictionary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it's here:&lt;/strong&gt; The &lt;code&gt;.dict()&lt;/code&gt; method on a Pydantic model conveniently converts the model instance into a plain Python dictionary, ready for insertion into our MongoDB database.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;4. Getting the Database Connection: &lt;code&gt;db = get_db()&lt;/code&gt;&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_db&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; This line calls the &lt;code&gt;get_db()&lt;/code&gt; function we imported earlier.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Why it's here:&lt;/strong&gt; &lt;code&gt;get_db()&lt;/code&gt; typically handles setting up and returning an active connection to your MongoDB database (e.g., a &lt;code&gt;pymongo.database.Database&lt;/code&gt; object). This separates the database connection logic from your endpoint logic.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;What &lt;code&gt;get_db()&lt;/code&gt; might look like (in &lt;code&gt;app/config/database.py&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/config/database.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pymongo&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MongoClient&lt;/span&gt;

&lt;span class="c1"&gt;# This should ideally come from environment variables for security!
&lt;/span&gt;&lt;span class="n"&gt;MONGO_DETAILS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mongodb://localhost:27017/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; 

&lt;span class="c1"&gt;# We'll set up a proper dependency for this in FastAPI later,
# but for now, imagine this function gets the database client.
&lt;/span&gt;
&lt;span class="c1"&gt;# Global client to reuse connection (simplified for intro)
&lt;/span&gt;&lt;span class="n"&gt;_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_db&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;_client&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;_client&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MongoClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MONGO_DETAILS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mydatabase&lt;/span&gt; &lt;span class="c1"&gt;# 'mydatabase' is the name of your database
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;5. Saving to MongoDB: &lt;code&gt;result = db.books.insert_one(new_book_data)&lt;/code&gt;&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;books&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insert_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_book_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it is:&lt;/strong&gt; This is where the data actually gets saved to MongoDB!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;db.books&lt;/code&gt;&lt;/strong&gt;: In MongoDB, data is organized into &lt;strong&gt;collections&lt;/strong&gt;. Here, &lt;code&gt;db.books&lt;/code&gt; refers to a collection named "books" within your &lt;code&gt;mydatabase&lt;/code&gt;. If this collection doesn't exist yet, MongoDB will create it automatically when you insert the first document.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;.insert_one(new_book_data)&lt;/code&gt;&lt;/strong&gt;: This is a method from the PyMongo driver (which &lt;code&gt;mongoengine&lt;/code&gt; also uses under the hood) that inserts a single document (our &lt;code&gt;new_book_data&lt;/code&gt; dictionary) into the &lt;code&gt;books&lt;/code&gt; collection. It returns a &lt;code&gt;result&lt;/code&gt; object containing information about the insertion.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;6. Getting the New ID: &lt;code&gt;book_id = str(result.inserted_id)&lt;/code&gt;&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="n"&gt;book_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inserted_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it is:&lt;/strong&gt; When MongoDB inserts a new document, it automatically generates a unique &lt;code&gt;_id&lt;/code&gt; for it. This ID is an &lt;code&gt;ObjectId&lt;/code&gt; type.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it's here:&lt;/strong&gt; The &lt;code&gt;result.inserted_id&lt;/code&gt; attribute holds this &lt;code&gt;ObjectId&lt;/code&gt;. We convert it to a &lt;code&gt;str&lt;/code&gt; (string) because &lt;code&gt;ObjectId&lt;/code&gt; isn't easily JSON-serializable, and returning it as a string is the common practice for web APIs. This &lt;code&gt;book_id&lt;/code&gt; is the unique identifier you'll use to retrieve, update, or delete this specific book later.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;7. Sending the Response: &lt;code&gt;return {"message": "Book created!", "id": book_id}&lt;/code&gt;&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Book created!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;book_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it is:&lt;/strong&gt; Finally, the FastAPI endpoint sends back a success message to the client.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it's here:&lt;/strong&gt; It confirms that the book was created and provides its newly generated unique ID. This is super useful for the client application to know, especially if it needs to immediately link to or refer to the new book.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Putting It All Together: The Flow!
&lt;/h3&gt;

&lt;p&gt;Here's the magic journey when a client creates a book using this endpoint:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Client Sends Request:&lt;/strong&gt; Your frontend (or Postman/Insomnia) sends an HTTP &lt;code&gt;POST&lt;/code&gt; request to &lt;code&gt;http://your-server.com/books/&lt;/code&gt; with a JSON body (e.g., &lt;code&gt;{"title": "New Book", "author": "Someone"}&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;FastAPI Intercepts:&lt;/strong&gt; FastAPI receives the request and, because of &lt;code&gt;@app.post("/books/")&lt;/code&gt;, it knows to run our &lt;code&gt;create_book&lt;/code&gt; function.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Pydantic Validates:&lt;/strong&gt; FastAPI sees &lt;code&gt;book: BookCreate&lt;/code&gt;. It takes the JSON body, validates it against the &lt;code&gt;BookCreate&lt;/code&gt; model's rules (are &lt;code&gt;title&lt;/code&gt; and &lt;code&gt;author&lt;/code&gt; present and strings?), and if valid, converts it into a &lt;code&gt;BookCreate&lt;/code&gt; Python object.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Data Preparation:&lt;/strong&gt; &lt;code&gt;book.dict()&lt;/code&gt; turns that Pydantic object into a plain Python dictionary suitable for MongoDB.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Database Connection:&lt;/strong&gt; &lt;code&gt;get_db()&lt;/code&gt; provides the active connection to MongoDB.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;MongoDB Insertion:&lt;/strong&gt; &lt;code&gt;db.books.insert_one()&lt;/code&gt; sends the data to MongoDB, which stores it permanently and gives back a unique ID.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;ID Conversion:&lt;/strong&gt; The &lt;code&gt;ObjectId&lt;/code&gt; is converted to a &lt;code&gt;str&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;FastAPI Responds:&lt;/strong&gt; The endpoint returns the success message and the new book's ID as JSON to the client, along with a &lt;code&gt;200 OK&lt;/code&gt; (or &lt;code&gt;201 Created&lt;/code&gt; if explicitly set) status code.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How to Test This Endpoint!
&lt;/h3&gt;

&lt;p&gt;To test this endpoint, you'll need:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Your FastAPI server running (&lt;code&gt;uvicorn main:app --reload&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt; A running MongoDB instance (e.g., locally, or using MongoDB Atlas).&lt;/li&gt;
&lt;li&gt; Postman or Insomnia.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;In Postman/Insomnia:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Method:&lt;/strong&gt; &lt;code&gt;POST&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; &lt;code&gt;http://127.0.0.1:8000/books/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Headers:&lt;/strong&gt; &lt;code&gt;Content-Type: application/json&lt;/code&gt; (usually set automatically when you select &lt;code&gt;raw&lt;/code&gt; and &lt;code&gt;JSON&lt;/code&gt; for the body)&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Body (raw JSON):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The Name of the Wind"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Patrick Rothfuss"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"publication_year"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2007&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;em&gt;Try sending without &lt;code&gt;author&lt;/code&gt; or with &lt;code&gt;publication_year&lt;/code&gt; as text to see FastAPI's automatic validation errors!&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why This Approach is So Powerful!
&lt;/h3&gt;

&lt;p&gt;This single endpoint demonstrates several best practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clean Separation of Concerns:&lt;/strong&gt; Your API logic (&lt;code&gt;main.py&lt;/code&gt;), data models (&lt;code&gt;app/model/book.py&lt;/code&gt;), and database configuration (&lt;code&gt;app/config/database.py&lt;/code&gt;) are all in their own organized places.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Validation:&lt;/strong&gt; Pydantic and FastAPI handle all the tedious data validation for you, giving clear errors to clients.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Documentation:&lt;/strong&gt; Your &lt;code&gt;/docs&lt;/code&gt; page will instantly reflect the expected structure for creating a book, thanks to Pydantic's integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence:&lt;/strong&gt; The data is saved permanently in your MongoDB database, even if your server restarts!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You've just built a robust way to create new resources in your backend application! Great job!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What's an ORM? (Your Database Translator!) 🗣️</title>
      <dc:creator>Joseph utuedeye </dc:creator>
      <pubDate>Sat, 19 Jul 2025 17:14:28 +0000</pubDate>
      <link>https://dev.to/joe_/whats-an-orm-your-database-translator-49i7</link>
      <guid>https://dev.to/joe_/whats-an-orm-your-database-translator-49i7</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftc280xk9tqgp7swsloi9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftc280xk9tqgp7swsloi9.png" alt="ORM" width="800" height="412"&gt;&lt;/a&gt;You've learned that &lt;strong&gt;SQL&lt;/strong&gt; is the language to talk to relational databases like MySQL. You've also seen how &lt;strong&gt;NoSQL&lt;/strong&gt; databases like MongoDB store data differently.&lt;/p&gt;

&lt;p&gt;Writing raw SQL or specific NoSQL queries in your Python code can get repetitive and complex, especially as your application grows. This is where an &lt;strong&gt;ORM&lt;/strong&gt; (Object-Relational Mapper) comes in handy!&lt;/p&gt;

&lt;p&gt;An ORM acts as a &lt;strong&gt;translator and an abstraction layer&lt;/strong&gt; between your Python code (your "objects") and your database (your "relational tables" or "NoSQL documents"). Instead of writing SQL or low-level NoSQL commands, you interact with your database using familiar Python objects and methods.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits of using an ORM:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pythonic Code:&lt;/strong&gt; You write Python code instead of mixing Python and SQL/NoSQL queries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Boilerplate:&lt;/strong&gt; ORMs often handle common tasks (like converting Python data types to database types) automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database Agnostic (for some ORMs):&lt;/strong&gt; Some ORMs (like SQLAlchemy) allow you to switch between different SQL databases (MySQL, PostgreSQL, SQLite) with minimal code changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved Readability:&lt;/strong&gt; Your code often becomes cleaner and easier to understand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Prevention:&lt;/strong&gt; ORMs can help catch common database-related errors during development.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ORMs for MySQL: SQLAlchemy 🐘
&lt;/h2&gt;

&lt;p&gt;For relational databases like MySQL, &lt;strong&gt;SQLAlchemy&lt;/strong&gt; is arguably the most widely used and powerful ORM in Python. It's known for its flexibility, allowing you to use it at a high level (ORM style) or a lower level (SQL Expression Language).&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting Up SQLAlchemy for MySQL
&lt;/h3&gt;

&lt;p&gt;First, you'll need to install SQLAlchemy and a MySQL driver (like &lt;code&gt;mysql-connector-python&lt;/code&gt; or &lt;code&gt;PyMySQL&lt;/code&gt;). We'll use &lt;code&gt;PyMySQL&lt;/code&gt; here.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;SQLAlchemy pymysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  SQLAlchemy Example: A Simple &lt;code&gt;User&lt;/code&gt; Table
&lt;/h3&gt;

&lt;p&gt;Let's imagine we want to store &lt;code&gt;User&lt;/code&gt; information (id, name, email).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sqlalchemy&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;create_engine&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sqlalchemy.orm&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sessionmaker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;declarative_base&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Connect to the Database
# Replace 'root:password@localhost:3306/mydatabase' with your MySQL connection string
# 'mysql+pymysql' specifies the dialect and driver
&lt;/span&gt;&lt;span class="n"&gt;DATABASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mysql+pymysql://root:password@localhost:3306/mydatabase&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Base class for our declarative models
&lt;/span&gt;&lt;span class="n"&gt;Base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;declarative_base&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Define Your Model (Table Structure)
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;__tablename__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;users&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;# This is the name of your table in MySQL
&lt;/span&gt;
    &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;primary_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;nullable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# String with max length 50, cannot be empty
&lt;/span&gt;    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nullable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Unique email
&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__repr__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;User(id=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, name=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, email=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;)&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Create the Table (if it doesn't exist)
# This command goes to MySQL and creates the 'users' table based on our User class
&lt;/span&gt;&lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 4. Create a Session (Your conversation with the DB)
# A Session is how you perform database operations (add, query, update, delete)
&lt;/span&gt;&lt;span class="n"&gt;SessionLocal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sessionmaker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;autocommit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;autoflush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# --- How to Use It (CRUD Operations) ---
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SessionLocal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# Get a new session
&lt;/span&gt;    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;new_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Add the new user object to the session
&lt;/span&gt;        &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# Commit the transaction (save changes to DB)
&lt;/span&gt;        &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;refresh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Refresh the object to get its generated ID
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Created user: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;new_user&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;new_user&lt;/span&gt;
    &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# Always close the session
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_users&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SessionLocal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# Query all users
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;All users:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;- &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
    &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_user_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SessionLocal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# Find user by ID
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new_email&lt;/span&gt; &lt;span class="c1"&gt;# Update the attribute
&lt;/span&gt;            &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;refresh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Updated user &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s email to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User with ID &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; not found.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;delete_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SessionLocal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Delete the user object
&lt;/span&gt;            &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Deleted user: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User with ID &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; not found.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# --- Run the examples ---
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--- Creating Users ---&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;user1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice Smith&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alice@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;user2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bob Johnson&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bob@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;--- Getting All Users ---&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;get_users&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;--- Updating a User ---&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# Check if user1 was successfully created
&lt;/span&gt;        &lt;span class="nf"&gt;update_user_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alice.new@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;--- Getting All Users After Update ---&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;get_users&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;--- Deleting a User ---&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;delete_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;--- Getting All Users After Delete ---&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;get_users&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;create_engine&lt;/code&gt;&lt;/strong&gt;: Establishes the connection to your MySQL database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Base = declarative_base()&lt;/code&gt;&lt;/strong&gt;: Creates a base class for your models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;class User(Base)&lt;/code&gt;&lt;/strong&gt;: Defines your Python class that maps to a MySQL table. Each attribute (&lt;code&gt;id&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;) maps to a column.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Base.metadata.create_all(engine)&lt;/code&gt;&lt;/strong&gt;: This is the magic that tells SQLAlchemy to create the &lt;code&gt;users&lt;/code&gt; table in your MySQL database if it doesn't already exist, based on your &lt;code&gt;User&lt;/code&gt; model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;SessionLocal()&lt;/code&gt;&lt;/strong&gt;: Creates a "session." This is your temporary workspace where you stage changes (add, update, delete) before committing them to the actual database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;db.add()&lt;/code&gt;, &lt;code&gt;db.commit()&lt;/code&gt;, &lt;code&gt;db.delete()&lt;/code&gt;, &lt;code&gt;db.query().all()&lt;/code&gt;, &lt;code&gt;db.query().filter().first()&lt;/code&gt;&lt;/strong&gt;: These are the ORM methods that translate into SQL &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;SELECT&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt;, and &lt;code&gt;DELETE&lt;/code&gt; commands.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ORMs for MongoDB: MongoEngine 🌿
&lt;/h2&gt;

&lt;p&gt;MongoDB is a &lt;strong&gt;NoSQL&lt;/strong&gt; database that stores data in flexible, JSON-like &lt;strong&gt;documents&lt;/strong&gt; within &lt;strong&gt;collections&lt;/strong&gt;, not rigid tables. While &lt;code&gt;Pymongo&lt;/code&gt; is the official low-level driver, &lt;strong&gt;MongoEngine&lt;/strong&gt; provides an ORM-like experience, letting you define your document structure using Python classes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting Up MongoEngine for MongoDB
&lt;/h3&gt;

&lt;p&gt;First, install MongoEngine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mongoengine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll also need a running MongoDB server (e.g., local installation or a cloud service like MongoDB Atlas).&lt;/p&gt;

&lt;h3&gt;
  
  
  MongoEngine Example: A Simple &lt;code&gt;Post&lt;/code&gt; Document
&lt;/h3&gt;

&lt;p&gt;Let's define a &lt;code&gt;Post&lt;/code&gt; document (like a blog post) that has a &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;content&lt;/code&gt;, and a list of &lt;code&gt;tags&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mongoengine&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Document&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;StringField&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ListField&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Connect to the Database
# Connect to a MongoDB database named 'mydatabase' running on localhost:27017
# Replace with your MongoDB connection string if it's different
&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mydatabase&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mongodb://localhost:27017/mydatabase&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Define Your Document (Collection Structure)
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Document&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# This class maps to a collection named 'post' in MongoDB by default
&lt;/span&gt;    &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StringField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;required&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Required string, max length 200
&lt;/span&gt;    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StringField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ListField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;StringField&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# A list where each item is a string
&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__repr__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;Post(title=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;)&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# --- How to Use It (CRUD Operations) ---
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;new_post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
    &lt;span class="n"&gt;new_post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# Saves the document to the MongoDB collection
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Created post: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;new_post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;new_post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;new_post&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_all_posts&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# 'objects()' is like a query manager for the Post collection
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;All posts:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;- &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (Tags: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;find_posts_by_tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Filter documents where 'tags' list contains 'tag'
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Posts with tag &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;- &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_post_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Retrieve by ID (MongoEngine IDs are ObjectId objects)
&lt;/span&gt;    &lt;span class="c1"&gt;# You'd typically get the ObjectId from a previous operation or from the client
&lt;/span&gt;    &lt;span class="c1"&gt;# For simplicity, we'll assume post_id is a string representation of ObjectId here
&lt;/span&gt;    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new_content&lt;/span&gt;
        &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# Saves the changes to the document
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Updated post &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; content.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DoesNotExist&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Post with ID &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; not found.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;delete_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# Deletes the document
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Deleted post: &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DoesNotExist&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Post with ID &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; not found.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# --- Run the examples ---
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--- Creating Posts ---&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;post1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;My First Blog&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;This is the content of my first post.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;python&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;beginners&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;post2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Database Basics&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;All about SQL and NoSQL.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;databases&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;education&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;post3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FastAPI Magic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Using decorators effectively.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fastapi&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;python&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;--- Getting All Posts ---&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;get_all_posts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;--- Finding Posts by Tag ---&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;find_posts_by_tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;python&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;--- Updating a Post ---&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;post1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Note: MongoEngine's ID is an ObjectId. You'd usually pass it as a string
&lt;/span&gt;        &lt;span class="c1"&gt;# from a retrieved object, or from the client's request.
&lt;/span&gt;        &lt;span class="nf"&gt;update_post_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;This is the *updated* content of my first post!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;--- Deleting a Post ---&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;post3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;delete_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;--- Getting All Posts After Updates and Deletes ---&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;get_all_posts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;connect()&lt;/code&gt;&lt;/strong&gt;: Establishes the connection to your MongoDB server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;class Post(Document)&lt;/code&gt;&lt;/strong&gt;: Defines your Python class that maps to a MongoDB collection. Each attribute (&lt;code&gt;title&lt;/code&gt;, &lt;code&gt;content&lt;/code&gt;, &lt;code&gt;tags&lt;/code&gt;) maps to a field in a document.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;new_post.save()&lt;/code&gt;&lt;/strong&gt;: Saves a new document or updates an existing one if the &lt;code&gt;id&lt;/code&gt; is present.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Post.objects()&lt;/code&gt;&lt;/strong&gt;: This is the entry point for querying the &lt;code&gt;Post&lt;/code&gt; collection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Post.objects.get(id=...)&lt;/code&gt;&lt;/strong&gt;: Retrieves a single document by its ID.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;post.delete()&lt;/code&gt;&lt;/strong&gt;: Deletes the specific document object.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion: Making Database Interactions Pythonic 🐍
&lt;/h2&gt;

&lt;p&gt;ORMs like SQLAlchemy for relational databases and MongoEngine for MongoDB (or &lt;code&gt;Pymongo&lt;/code&gt; for direct interaction) are incredibly valuable tools in backend development. They allow you to work with your database using the familiar concepts of Python classes and objects, rather than raw query languages. This makes your code cleaner, more robust, and faster to develop.&lt;/p&gt;

&lt;p&gt;While there's a small learning curve, the benefits of using an ORM quickly outweigh the initial effort, especially as your application grows!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>database</category>
      <category>python</category>
      <category>mongodb</category>
    </item>
    <item>
      <title>Cracking the Code: Your First Steps with SQL! 💻</title>
      <dc:creator>Joseph utuedeye </dc:creator>
      <pubDate>Sat, 19 Jul 2025 16:29:27 +0000</pubDate>
      <link>https://dev.to/joe_/cracking-the-code-your-first-steps-with-sql-4knn</link>
      <guid>https://dev.to/joe_/cracking-the-code-your-first-steps-with-sql-4knn</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwzbzdjz6xncduzrrasf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwzbzdjz6xncduzrrasf.png" alt="SQL" width="502" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alright, future database whiz! We've learned &lt;em&gt;why&lt;/em&gt; databases are essential and that they store data in an organized way. Now, let's talk about &lt;strong&gt;how we actually &lt;em&gt;talk&lt;/em&gt; to these organized databases&lt;/strong&gt;. That's where &lt;strong&gt;SQL&lt;/strong&gt; comes in!&lt;/p&gt;

&lt;h3&gt;
  
  
  What is SQL? (The Language of Databases)
&lt;/h3&gt;

&lt;p&gt;Imagine you're at a very organized, digital library that stores information in those neat tables we discussed. How do you ask for a book? How do you add a new one? You can't just shout or type in regular English. You need a specific language the librarian (our &lt;strong&gt;DBMS&lt;/strong&gt;) understands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQL&lt;/strong&gt; stands for &lt;strong&gt;Structured Query Language&lt;/strong&gt;. It's the standard language used to communicate with and manage &lt;strong&gt;relational databases&lt;/strong&gt;. It's not a programming language like Python that builds entire applications, but rather a &lt;em&gt;special-purpose language&lt;/em&gt; designed specifically for interacting with databases.&lt;/p&gt;

&lt;p&gt;Think of it as the universal "command language" for database operations. If you know SQL, you can talk to almost any relational database (like PostgreSQL, MySQL, SQLite, SQL Server, Oracle, etc.), even though they might have tiny dialect differences.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Can You Do with SQL? (The Four Main Actions)
&lt;/h3&gt;

&lt;p&gt;Just like HTTP methods have their main actions (GET, POST, PUT, DELETE), SQL also has four primary categories of commands, often aligning with &lt;strong&gt;CRUD&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Retrieving Data (READ): &lt;code&gt;SELECT&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Adding New Data (CREATE): &lt;code&gt;INSERT&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Changing Existing Data (UPDATE): &lt;code&gt;UPDATE&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Removing Data (DELETE): &lt;code&gt;DELETE&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's look at each one with simple examples. Imagine we have a table called &lt;code&gt;Books&lt;/code&gt; that looks like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;title&lt;/th&gt;
&lt;th&gt;author&lt;/th&gt;
&lt;th&gt;publication_year&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;The Hitchhiker's Guide to the Galaxy&lt;/td&gt;
&lt;td&gt;Douglas Adams&lt;/td&gt;
&lt;td&gt;1979&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Pride and Prejudice&lt;/td&gt;
&lt;td&gt;Jane Austen&lt;/td&gt;
&lt;td&gt;1813&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;SELECT&lt;/code&gt;: Asking the Database Questions (READ)
&lt;/h3&gt;

&lt;p&gt;This is the most common SQL command. It's how you ask the database to &lt;em&gt;give you&lt;/em&gt; data. You specify what columns you want to see and from which table.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Analogy:&lt;/strong&gt; "Show me all the books." or "Show me just the titles of books published after 2000."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Syntax Basics:&lt;/strong&gt; &lt;code&gt;SELECT column1, column2 FROM table_name WHERE condition;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Get all columns from all rows:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Books&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;em&gt;(The `&lt;/em&gt;` means "all columns")*&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Get only the &lt;code&gt;title&lt;/code&gt; and &lt;code&gt;author&lt;/code&gt; of all books:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Books&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Get the &lt;code&gt;title&lt;/code&gt; and &lt;code&gt;author&lt;/code&gt; of the book with &lt;code&gt;id&lt;/code&gt; 2:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Books&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;em&gt;(The &lt;code&gt;WHERE&lt;/code&gt; clause filters the rows based on a condition)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Get books by a specific author:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Books&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Douglas Adams'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;code&gt;INSERT INTO&lt;/code&gt;: Adding New Rows (CREATE)
&lt;/h3&gt;

&lt;p&gt;This command allows you to add new records (rows) into a table.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Analogy:&lt;/strong&gt; "Add a new book to the library's collection."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Syntax Basics:&lt;/strong&gt; &lt;code&gt;INSERT INTO table_name (column1, column2) VALUES (value1, value2);&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add a new book to the &lt;code&gt;Books&lt;/code&gt; table:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;Books&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;publication_year&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1984'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'George Orwell'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1949&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Now our &lt;code&gt;Books&lt;/code&gt; table would look like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;title&lt;/th&gt;
&lt;th&gt;author&lt;/th&gt;
&lt;th&gt;publication_year&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;The Hitchhiker's Guide to the Galaxy&lt;/td&gt;
&lt;td&gt;Douglas Adams&lt;/td&gt;
&lt;td&gt;1979&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Pride and Prejudice&lt;/td&gt;
&lt;td&gt;Jane Austen&lt;/td&gt;
&lt;td&gt;1813&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1984&lt;/td&gt;
&lt;td&gt;George Orwell&lt;/td&gt;
&lt;td&gt;1949&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;code&gt;UPDATE&lt;/code&gt;: Changing Existing Data (UPDATE)
&lt;/h3&gt;

&lt;p&gt;This command is used to modify existing records in a table. You typically specify which table, what to change, and which specific rows to change using a &lt;code&gt;WHERE&lt;/code&gt; clause.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Analogy:&lt;/strong&gt; "Change the publication year for 'Pride and Prejudice'."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Syntax Basics:&lt;/strong&gt; &lt;code&gt;UPDATE table_name SET column1 = new_value1 WHERE condition;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Update the &lt;code&gt;publication_year&lt;/code&gt; for "The Hitchhiker's Guide to the Galaxy":&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;Books&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;publication_year&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1980&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Now &lt;code&gt;Books&lt;/code&gt; table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;title&lt;/th&gt;
&lt;th&gt;author&lt;/th&gt;
&lt;th&gt;publication_year&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;The Hitchhiker's Guide to the Galaxy&lt;/td&gt;
&lt;td&gt;Douglas Adams&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1980&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Pride and Prejudice&lt;/td&gt;
&lt;td&gt;Jane Austen&lt;/td&gt;
&lt;td&gt;1813&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1984&lt;/td&gt;
&lt;td&gt;George Orwell&lt;/td&gt;
&lt;td&gt;1949&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;CRITICAL WARNING:&lt;/strong&gt; Always use a &lt;code&gt;WHERE&lt;/code&gt; clause with &lt;code&gt;UPDATE&lt;/code&gt;! If you forget it, the &lt;code&gt;UPDATE&lt;/code&gt; command will change &lt;em&gt;all&lt;/em&gt; rows in the table! 😱&lt;/p&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;code&gt;DELETE FROM&lt;/code&gt;: Removing Rows (DELETE)
&lt;/h3&gt;

&lt;p&gt;This command is used to remove existing records (rows) from a table. Just like &lt;code&gt;UPDATE&lt;/code&gt;, you use a &lt;code&gt;WHERE&lt;/code&gt; clause to specify which rows to delete.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Analogy:&lt;/strong&gt; "Remove the book '1984' from the collection."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Syntax Basics:&lt;/strong&gt; &lt;code&gt;DELETE FROM table_name WHERE condition;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Delete the book with &lt;code&gt;id&lt;/code&gt; 3:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Books&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Now &lt;code&gt;Books&lt;/code&gt; table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;title&lt;/th&gt;
&lt;th&gt;author&lt;/th&gt;
&lt;th&gt;publication_year&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;The Hitchhiker's Guide to the Galaxy&lt;/td&gt;
&lt;td&gt;Douglas Adams&lt;/td&gt;
&lt;td&gt;1980&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Pride and Prejudice&lt;/td&gt;
&lt;td&gt;Jane Austen&lt;/td&gt;
&lt;td&gt;1813&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;CRITICAL WARNING:&lt;/strong&gt; Always use a &lt;code&gt;WHERE&lt;/code&gt; clause with &lt;code&gt;DELETE&lt;/code&gt;! If you forget it, the &lt;code&gt;DELETE&lt;/code&gt; command will wipe out &lt;em&gt;all&lt;/em&gt; rows in the table! 😱&lt;/p&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Other Important SQL Commands (Beyond CRUD)
&lt;/h3&gt;

&lt;p&gt;Besides CRUD, SQL also has commands for managing the database structure itself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;CREATE TABLE&lt;/code&gt;:&lt;/strong&gt; To create a new table (e.g., &lt;code&gt;CREATE TABLE Users (id INT PRIMARY KEY, name VARCHAR(255));&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ALTER TABLE&lt;/code&gt;:&lt;/strong&gt; To modify an existing table (e.g., add a new column).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;DROP TABLE&lt;/code&gt;:&lt;/strong&gt; To completely delete a table. (Use with extreme caution!)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SQL and Your FastAPI Backend: The Connection!
&lt;/h3&gt;

&lt;p&gt;So, how does this all tie back to FastAPI?&lt;/p&gt;

&lt;p&gt;When you build a backend application, your FastAPI code won't typically be typing SQL commands directly into a terminal. Instead, your Python code will use special &lt;strong&gt;libraries&lt;/strong&gt; (like &lt;code&gt;SQLAlchemy&lt;/code&gt; which we'll explore soon!) that allow you to write Python code that &lt;em&gt;generates and executes&lt;/em&gt; these SQL commands behind the scenes.&lt;/p&gt;

&lt;p&gt;This means your FastAPI endpoints will receive HTTP requests (GET, POST, etc.), then translate those requests into the appropriate SQL commands to talk to your database, and finally send the database's response back to the client.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting Started with SQL Practice
&lt;/h3&gt;

&lt;p&gt;You don't need a full FastAPI app to practice SQL. There are many online SQL editors or even local tools like &lt;strong&gt;DB Browser for SQLite&lt;/strong&gt; that let you create tables and run these commands directly. Try creating a simple table for &lt;code&gt;Products&lt;/code&gt; and practice &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;SELECT&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt;, and &lt;code&gt;DELETE&lt;/code&gt; queries on it!&lt;/p&gt;

&lt;p&gt;Understanding SQL is a fundamental skill for any backend developer. It's the bedrock of how data is managed in countless applications worldwide. You're now speaking the language of data!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>database</category>
      <category>sql</category>
    </item>
    <item>
      <title>Where Does All the Data Go? Unveiling the Magic of Databases! 💾</title>
      <dc:creator>Joseph utuedeye </dc:creator>
      <pubDate>Mon, 14 Jul 2025 08:53:16 +0000</pubDate>
      <link>https://dev.to/joe_/where-does-all-the-data-go-unveiling-the-magic-of-databases-9g8</link>
      <guid>https://dev.to/joe_/where-does-all-the-data-go-unveiling-the-magic-of-databases-9g8</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqibjsj6rxvocj1bb9wo3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqibjsj6rxvocj1bb9wo3.png" alt="Photo by Growtika on Unsplash" width="800" height="536"&gt;&lt;/a&gt;Hey there, future backend wizard!&lt;/p&gt;

&lt;p&gt;Last time, we talked about HTTP methods and built some awesome FastAPI endpoints. Remember our &lt;code&gt;books_db&lt;/code&gt;? That's just a simple Python dictionary living in our &lt;code&gt;main.py&lt;/code&gt; file. That works for our example, but what happens when you stop your FastAPI server? &lt;em&gt;Poof!&lt;/em&gt; All those books you "created" are gone!&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;databases&lt;/strong&gt; come into play. They are the memory and long-term storage of your applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's a Database, Anyway? (Your App's Super-Smart Filing Cabinet!)
&lt;/h3&gt;

&lt;p&gt;Imagine your app is a busy office. It has many workers (your FastAPI endpoints) doing tasks, but they need a place to store important documents (your data) so they don't lose them and can find them easily later.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;database&lt;/strong&gt; is essentially an organized collection of information (data) that's stored electronically in a computer system. It's designed to make it easy to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Store&lt;/strong&gt; large amounts of data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieve&lt;/strong&gt; specific pieces of data quickly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update&lt;/strong&gt; existing data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delete&lt;/strong&gt; old data.&lt;/li&gt;
&lt;li&gt;Handle &lt;strong&gt;many people accessing it at the same time&lt;/strong&gt; without chaos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why Can't We Just Use Python Dictionaries or Excel?
&lt;/h3&gt;

&lt;p&gt;Good question! Our &lt;code&gt;books_db&lt;/code&gt; dictionary worked okay for a tiny demo, but it falls short very quickly for real-world apps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Loss:&lt;/strong&gt; As soon as your FastAPI server stops (or crashes!), any data in those Python dictionaries is &lt;strong&gt;gone forever&lt;/strong&gt;. Databases persist data, meaning it's saved even if the power goes out.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scale:&lt;/strong&gt; Imagine millions of users or millions of products. A single Python dictionary wouldn't handle that. Databases are built to manage massive amounts of information efficiently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Concurrency (Many Users):&lt;/strong&gt; What if two people try to buy the last item at the same moment? Or do two administrators try to update the same user's profile? Databases have special rules to prevent data corruption and ensure everyone sees consistent, correct information.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Complex Queries:&lt;/strong&gt; Finding "all active users who live in Benin and ordered a laptop in the last month" would be incredibly hard with just a Python dictionary. Databases have powerful tools for searching and filtering data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security:&lt;/strong&gt; Databases offer robust security features to control who can access and modify your sensitive data.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Two Big Families: SQL vs. NoSQL
&lt;/h3&gt;

&lt;p&gt;Just like there are different types of cars for different jobs, there are different types of databases. The two main families are &lt;strong&gt;Relational (SQL)&lt;/strong&gt; and &lt;strong&gt;Non-Relational (NoSQL)&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Relational Databases (The "Organized Spreadsheet" Family)
&lt;/h4&gt;

&lt;p&gt;This is the most common type of database, and it's super organized!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; Data is stored in &lt;strong&gt;tables&lt;/strong&gt;, which look a lot like spreadsheets. Each table has &lt;strong&gt;columns&lt;/strong&gt; (like headers in a spreadsheet, defining what kind of data goes there, e.g., "name", "email", "price") and &lt;strong&gt;rows&lt;/strong&gt; (each row is a single record, like one user or one product).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Relationships:&lt;/strong&gt; The "relational" part means these tables can be linked together. For example, you might have a &lt;code&gt;Users&lt;/code&gt; table and an &lt;code&gt;Orders&lt;/code&gt; table, and they can be linked by a &lt;code&gt;user_id&lt;/code&gt;. This helps avoid repeating data and keeps things neat.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Language:&lt;/strong&gt; To talk to these databases, you use a special language called &lt;strong&gt;SQL&lt;/strong&gt; (Structured Query Language). It's a powerful way to ask questions ("SELECT all users where city is 'Benin'") or give commands ("INSERT a new product").&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt; When your data has a clear structure and relationships between different pieces of information are important (e.g., e-commerce, banking, user management systems).&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Popular Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL:&lt;/strong&gt; Very powerful, reliable, and widely used for many types of applications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MySQL:&lt;/strong&gt; Another extremely popular choice, especially for web applications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQLite:&lt;/strong&gt; Unique because it's a &lt;em&gt;file-based&lt;/em&gt; database, meaning the entire database lives in a single file on your computer. It's fantastic for smaller projects, testing, or apps that don't need a separate server. We might even start with this one!&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Non-Relational Databases (NoSQL - The "Flexible Storage" Family)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; These databases don't stick to the strict table-and-row structure of relational databases. Instead, they offer different ways to store data, like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Document Databases:&lt;/strong&gt; Store data in flexible, semi-structured "documents" (often JSON-like).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key-Value Stores:&lt;/strong&gt; Simple pairs of keys and values (like a Python dictionary, but persistent).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graph Databases:&lt;/strong&gt; Store data as nodes and edges to show relationships (great for social networks).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt; When your data doesn't have a rigid structure, changes frequently, or you need extreme scalability for specific use cases (e.g., real-time analytics, user profiles in large social apps, IoT data).&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Popular Examples (just to know their names):&lt;/strong&gt; MongoDB (document), Redis (key-value), Cassandra.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;For learning backend development, you'll almost certainly start with a &lt;strong&gt;Relational Database&lt;/strong&gt; and &lt;strong&gt;SQL&lt;/strong&gt;, as they are fundamental and widely applicable.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Database Management System (DBMS): Your Data's Guardian
&lt;/h3&gt;

&lt;p&gt;A database isn't just the raw data files. It's managed by specialized software called a &lt;strong&gt;Database Management System (DBMS)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Think of the DBMS as the highly organized super-librarian for your database. It's the software that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Receives your SQL commands (or other database commands).&lt;/li&gt;
&lt;li&gt;Finds, stores, updates, or deletes the data.&lt;/li&gt;
&lt;li&gt;Ensures data security (who can access what).&lt;/li&gt;
&lt;li&gt;Handles backups and recovery.&lt;/li&gt;
&lt;li&gt;Manages multiple users trying to access data at the same time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When we say "we're using PostgreSQL," we're really saying "we're using the PostgreSQL DBMS to manage our data."&lt;/p&gt;

&lt;h3&gt;
  
  
  Connecting Your Backend (FastAPI) to Your Database
&lt;/h3&gt;

&lt;p&gt;So, you've got your FastAPI app running, and you've got a database ready. How do they talk to each other?&lt;/p&gt;

&lt;p&gt;Your FastAPI app (which is Python code) needs special "connectors" or "drivers" to communicate with a database. These are like translators. For Python and SQL databases, we often use libraries called &lt;strong&gt;Object-Relational Mappers (ORMs)&lt;/strong&gt; like &lt;strong&gt;SQLAlchemy&lt;/strong&gt;. An ORM lets you interact with your database using Python code and objects, instead of writing raw SQL directly (though you can always do that too!).&lt;/p&gt;

&lt;p&gt;This is what we'll tackle in upcoming sessions: setting up a database and teaching our FastAPI app how to store and retrieve data from it, making our application's data truly persistent!&lt;/p&gt;

&lt;h3&gt;
  
  
  Wrapping Up: Databases are Your App's Memory!
&lt;/h3&gt;

&lt;p&gt;Databases are essential for almost any real-world application. They provide the persistent, organized, and secure storage your data needs. Understanding them is a cornerstone of backend development.&lt;/p&gt;

&lt;p&gt;Next, we'll get our hands dirty and connect our FastAPI app to a database to bring our "books" and "products" to life, permanently!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>backenddevelopment</category>
      <category>database</category>
      <category>python</category>
    </item>
    <item>
      <title>The Verbs of the Web: A Beginner's Guide to HTTP Methods (GET, POST, PUT, DELETE)</title>
      <dc:creator>Joseph utuedeye </dc:creator>
      <pubDate>Mon, 07 Jul 2025 09:51:40 +0000</pubDate>
      <link>https://dev.to/joe_/the-verbs-of-the-web-a-beginners-guide-to-http-methods-get-post-put-delete-2pgf</link>
      <guid>https://dev.to/joe_/the-verbs-of-the-web-a-beginners-guide-to-http-methods-get-post-put-delete-2pgf</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7g6n0yfpfhb7uphej2r3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7g6n0yfpfhb7uphej2r3.jpg" alt="Photo by Growtika on Unsplash" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ever wondered how your browser "tells" a website what it wants to do? Or how your favorite app manages to create new posts, update your profile, or delete old messages? It's all thanks to &lt;strong&gt;HTTP Methods&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Think of HTTP methods as the "verbs" or "actions" you can perform when communicating with a web server. Just like in a sentence, verbs define the action being taken. In the world of web APIs, these verbs tell the server what kind of operation you intend to perform on a specific resource (like a user, a photo, or a blog post).&lt;/p&gt;

&lt;p&gt;Let's break down the most common and crucial HTTP methods you'll encounter, often called the &lt;strong&gt;CRUD&lt;/strong&gt; operations: &lt;strong&gt;C&lt;/strong&gt;reate, &lt;strong&gt;R&lt;/strong&gt;ead, &lt;strong&gt;U&lt;/strong&gt;pdate, and &lt;strong&gt;D&lt;/strong&gt;elete.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;GET&lt;/code&gt;: Just Give Me the Information! (The "Read" Action)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does:&lt;/strong&gt; When you use &lt;code&gt;GET&lt;/code&gt;, you're essentially saying, "Hey server, please &lt;strong&gt;retrieve&lt;/strong&gt; or &lt;strong&gt;read&lt;/strong&gt; some data for me." You're not trying to change anything on the server; you just want to look at information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analogy:&lt;/strong&gt; Imagine you're at a library and you ask the librarian, "Can I &lt;em&gt;get&lt;/em&gt; that book on space travel?" You're not changing the book or the library's records; you're just receiving a copy to read.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When to use it:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Visiting any website (e.g., typing &lt;code&gt;google.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Viewing a list of products in an online store&lt;/li&gt;
&lt;li&gt;Seeing your profile page on a social media app&lt;/li&gt;
&lt;li&gt;Searching for something&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Key Traits:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Safe:&lt;/strong&gt; It doesn't modify the server's data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Idempotent:&lt;/strong&gt; Making the same &lt;code&gt;GET&lt;/code&gt; request multiple times will always yield the same result (the same data).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;FastAPI Example:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In FastAPI, you use &lt;code&gt;@app.get()&lt;/code&gt; to define an endpoint that handles &lt;code&gt;GET&lt;/code&gt; requests.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Imagine this is our database of books
&lt;/span&gt;&lt;span class="n"&gt;books_db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The Hobbit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;author&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;J.R.R. Tolkien&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dune&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;author&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Frank Herbert&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/books/{book_id}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_book&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;book_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Retrieves a single book by its ID.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;book_id&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;books_db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Book not found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status_code&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# We'll cover HTTP exceptions later!
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;books_db&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;book_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# How to test: Open your browser to http://127.0.0.1:8000/books/1
# You'll get: {"title":"The Hobbit","author":"J.R.R. Tolkien"}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. &lt;code&gt;POST&lt;/code&gt;: Here's Some New Stuff! (The "Create" Action)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does:&lt;/strong&gt; &lt;code&gt;POST&lt;/code&gt; is used when you want to &lt;strong&gt;send new data&lt;/strong&gt; to the server to &lt;strong&gt;create a new resource&lt;/strong&gt;. You're giving the server information it didn't have before.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analogy:&lt;/strong&gt; This is like &lt;strong&gt;filling out a form to get a &lt;em&gt;new&lt;/em&gt; library card&lt;/strong&gt;. You're providing your details, and the library creates a brand new record for you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When to use it:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Signing up for a new account&lt;/li&gt;
&lt;li&gt;Submitting a new comment or blog post&lt;/li&gt;
&lt;li&gt;Adding a new item to a shopping cart&lt;/li&gt;
&lt;li&gt;Uploading a photo to social media&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Key Traits:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not Safe:&lt;/strong&gt; It &lt;em&gt;does&lt;/em&gt; change data on the server (it creates new data).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not Idempotent:&lt;/strong&gt; Sending the exact same &lt;code&gt;POST&lt;/code&gt; request multiple times will typically create multiple new resources (e.g., submitting the same comment twice creates two comments).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;FastAPI Example:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You use &lt;code&gt;@app.post()&lt;/code&gt; for endpoints that create new data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# main.py (continued)
# ... app = FastAPI() and books_db ...
&lt;/span&gt;
&lt;span class="n"&gt;next_book_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="c1"&gt;# Simple way to generate new IDs
&lt;/span&gt;
&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/books/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_book&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Creates a new book.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;next_book_id&lt;/span&gt;
    &lt;span class="n"&gt;new_book&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;author&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;books_db&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;next_book_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new_book&lt;/span&gt;
    &lt;span class="n"&gt;created_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;next_book_id&lt;/span&gt;
    &lt;span class="n"&gt;next_book_id&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Book created!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;created_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;book&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;new_book&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# How to test (using Postman/Insomnia):
# Method: POST
# URL: http://127.0.0.1:8000/books/
# Body (raw JSON): {"title": "The Lord of the Rings", "author": "J.R.R. Tolkien"}
# You'll get: {"message":"Book created!","id":3,"book":{"title":"The Lord of the Rings","author":"J.R.R. Tolkien"}}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;code&gt;PUT&lt;/code&gt;: Replace the Old with the New! (The "Update" Action - Full Replacement)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does:&lt;/strong&gt; &lt;code&gt;PUT&lt;/code&gt; is used to &lt;strong&gt;completely update an existing resource&lt;/strong&gt;. When you send a &lt;code&gt;PUT&lt;/code&gt; request, you typically send the &lt;em&gt;entire, new version&lt;/em&gt; of the resource. If the resource doesn't exist, &lt;code&gt;PUT&lt;/code&gt; might create it (though &lt;code&gt;POST&lt;/code&gt; is usually preferred for creation).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analogy:&lt;/strong&gt; Imagine you tell the librarian, "Take this &lt;em&gt;new edition&lt;/em&gt; of 'Dune' and completely &lt;em&gt;replace&lt;/em&gt; the old one on shelf #2." The old book is gone, and the new one is exactly in its place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When to use it:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Updating all fields of a user's profile&lt;/li&gt;
&lt;li&gt;Replacing a complete document or configuration file&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Key Traits:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not Safe:&lt;/strong&gt; It &lt;em&gt;does&lt;/em&gt; change data on the server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Idempotent:&lt;/strong&gt; Sending the exact same &lt;code&gt;PUT&lt;/code&gt; request multiple times will result in the same final state of the resource. (You replaced it once, replacing it again with the same data changes nothing further).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;FastAPI Example:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;@app.put()&lt;/code&gt; for full updates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# main.py (continued)
# ... app = FastAPI() and books_db ...
&lt;/span&gt;
&lt;span class="nd"&gt;@app.put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/books/{book_id}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_book&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;book_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Updates an existing book by replacing its data.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;book_id&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;books_db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Book not found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status_code&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;books_db&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;book_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;author&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# Overwrites the old data
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Book &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;book_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; updated!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;book&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;books_db&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;book_id&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;

&lt;span class="c1"&gt;# How to test (using Postman/Insomnia):
# Method: PUT
# URL: http://127.0.0.1:8000/books/1
# Body (raw JSON): {"title": "The Hobbit: A New Adventure", "author": "J.R.R. Tolkien (Updated)"}
# Now, if you GET http://127.0.0.1:8000/books/1, you'll see the new title and author.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. &lt;code&gt;DELETE&lt;/code&gt;: Make It Disappear! (The "Delete" Action)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does:&lt;/strong&gt; As the name suggests, &lt;code&gt;DELETE&lt;/code&gt; is used to &lt;strong&gt;remove or delete&lt;/strong&gt; a specific resource from the server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analogy:&lt;/strong&gt; You tell the librarian, "Please &lt;em&gt;remove&lt;/em&gt; that damaged copy of '1984' from the collection." The book is then gone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When to use it:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Deleting a user account&lt;/li&gt;
&lt;li&gt;Removing a specific product from inventory&lt;/li&gt;
&lt;li&gt;Deleting a comment or photo&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Key Traits:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not Safe:&lt;/strong&gt; It &lt;em&gt;does&lt;/em&gt; change data on the server (it removes it).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Idempotent:&lt;/strong&gt; Sending the exact same &lt;code&gt;DELETE&lt;/code&gt; request multiple times will have the same final effect. (After the first successful deletion, the resource is gone. Subsequent attempts to delete it might return a "Not Found" error, but no new changes occur).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;FastAPI Example:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;@app.delete()&lt;/code&gt; for deletion.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# main.py (continued)
# ... app = FastAPI() and books_db ...
&lt;/span&gt;
&lt;span class="nd"&gt;@app.delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/books/{book_id}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;delete_book&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;book_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Deletes a book by its ID.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;book_id&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;books_db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Book not found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status_code&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;books_db&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;book_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# Removes the entry from our dictionary
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Book &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;book_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; deleted successfully!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# How to test (using Postman/Insomnia):
# Method: DELETE
# URL: http://127.0.0.1:8000/books/2
# (No body usually required)
# You'll get: {"message":"Book 2 deleted successfully!"}
# Now, if you try to GET http://127.0.0.1:8000/books/2, you'll get the "Book not found" error.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why Does Choosing the Right Method Matter?
&lt;/h3&gt;

&lt;p&gt;It might seem like you could just use &lt;code&gt;POST&lt;/code&gt; for everything, but that's not good practice!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clarity:&lt;/strong&gt; Using the correct method makes your API clear and predictable for other developers (or your future self!).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caching:&lt;/strong&gt; Browsers and other systems can safely cache (store for quick access) &lt;code&gt;GET&lt;/code&gt; requests, making web Browse faster. They won't cache &lt;code&gt;POST&lt;/code&gt; requests because they might change data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Idempotency:&lt;/strong&gt; Understanding idempotency helps prevent unintended side effects if a request is accidentally sent multiple times.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework Features:&lt;/strong&gt; FastAPI (and other web frameworks) leverage these methods to automatically handle things like routing, data validation, and documentation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And there you have it! These four HTTP methods form the backbone of almost all web interactions you'll encounter. By understanding their purpose and how to use them, you're well on your way to building robust and professional web APIs.&lt;/p&gt;

&lt;p&gt;Keep experimenting with your FastAPI server and Postman/Insomnia – the best way to learn is by doing! Happy coding!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Unlocking the Magic: Understanding Decorators in FastAPI (for Beginners!)</title>
      <dc:creator>Joseph utuedeye </dc:creator>
      <pubDate>Mon, 07 Jul 2025 08:38:29 +0000</pubDate>
      <link>https://dev.to/joe_/unlocking-the-magic-understanding-decorators-in-fastapi-for-beginners-5783</link>
      <guid>https://dev.to/joe_/unlocking-the-magic-understanding-decorators-in-fastapi-for-beginners-5783</guid>
      <description>&lt;p&gt;Hey there, aspiring backend developer!&lt;/p&gt;

&lt;p&gt;If you've started playing around with FastAPI (or even just seen some code examples), you've probably noticed some lines that look a little like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_root&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, World!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See that &lt;code&gt;@app.get("/")&lt;/code&gt; line? That little &lt;code&gt;@&lt;/code&gt; symbol introduces something called a &lt;strong&gt;decorator&lt;/strong&gt;. And trust me, understanding decorators is like unlocking a secret superpower in your Python coding journey, especially with FastAPI!&lt;/p&gt;

&lt;p&gt;Let's break it down in a beginner-friendly way.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's a Decorator Anyway? (The "Gift Wrapper" Analogy)
&lt;/h3&gt;

&lt;p&gt;Imagine you have a beautifully wrapped present. The &lt;strong&gt;gift&lt;/strong&gt; inside is the main thing, right? But the &lt;strong&gt;wrapping paper, ribbon, and bow&lt;/strong&gt; make it special, add extra flair, and might even tell you something about what's inside or how to open it.&lt;/p&gt;

&lt;p&gt;In Python, a &lt;strong&gt;decorator&lt;/strong&gt; is just like that gift wrapper! It's a special kind of function that literally "wraps" another function. When it wraps that function, it can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Add new behavior&lt;/strong&gt; to the original function &lt;em&gt;without changing the function's own code&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Modify&lt;/strong&gt; how the function works.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Give extra instructions&lt;/strong&gt; about how the function should be used.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Think of it this way:&lt;/strong&gt; You write a regular Python function. Then, you slap a decorator on top of it, and boom! That original function suddenly has extra powers or instructions that it didn't have before.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Simple Python Decorator Example (No FastAPI Yet!)
&lt;/h3&gt;

&lt;p&gt;Let's see a super basic decorator to get a feel for it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;say_hello_before_running&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    This is our simple decorator function.
    It takes another function (func) as input.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello! I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m about to run your function!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# New behavior added by decorator
&lt;/span&gt;        &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# Now, run the original function
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I just finished running your function!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# More new behavior
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;

&lt;span class="c1"&gt;# Now, let's use our decorator!
&lt;/span&gt;&lt;span class="nd"&gt;@say_hello_before_running&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;my_regular_function&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;This is my regular function doing its job.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# When we call my_regular_function, it's actually calling the 'wrapper'
&lt;/span&gt;&lt;span class="nf"&gt;my_regular_function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens here?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;say_hello_before_running&lt;/code&gt; is our decorator.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;@say_hello_before_running&lt;/code&gt; line above &lt;code&gt;my_regular_function&lt;/code&gt; is the magic. It's telling Python: "Hey, take &lt;code&gt;my_regular_function&lt;/code&gt; and pass it to &lt;code&gt;say_hello_before_running&lt;/code&gt;. Whatever &lt;code&gt;say_hello_before_running&lt;/code&gt; returns, that's what &lt;code&gt;my_regular_function&lt;/code&gt; should &lt;em&gt;really&lt;/em&gt; be from now on."&lt;/li&gt;
&lt;li&gt;In this case, &lt;code&gt;say_hello_before_running&lt;/code&gt; returns &lt;code&gt;wrapper&lt;/code&gt;. So, when you call &lt;code&gt;my_regular_function()&lt;/code&gt;, you're actually calling &lt;code&gt;wrapper()&lt;/code&gt;, which then prints some messages &lt;em&gt;before&lt;/em&gt; and &lt;em&gt;after&lt;/em&gt; running our original function.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cool, right? We added functionality without touching &lt;code&gt;my_regular_function&lt;/code&gt; itself!&lt;/p&gt;

&lt;h3&gt;
  
  
  Decorators and FastAPI: The Real Magic!
&lt;/h3&gt;

&lt;p&gt;Now, let's bring this back to FastAPI. FastAPI uses decorators extensively, especially for what it calls &lt;strong&gt;Path Operations&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Remember this code?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# Our FastAPI application object
&lt;/span&gt;
&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# &amp;lt;--- THIS IS THE DECORATOR!
&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_root&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, World!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's what &lt;code&gt;@app.get("/")&lt;/code&gt; is doing as a decorator:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;It's a "Path Operation Decorator":&lt;/strong&gt; The &lt;code&gt;app&lt;/code&gt; object (our FastAPI application) has methods like &lt;code&gt;.get()&lt;/code&gt;, &lt;code&gt;.post()&lt;/code&gt;, &lt;code&gt;.put()&lt;/code&gt;, &lt;code&gt;.delete()&lt;/code&gt;, etc. These methods, when used as decorators, are incredibly powerful.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;It links a URL Path to a Function:&lt;/strong&gt; The &lt;code&gt;"/"&lt;/code&gt; inside &lt;code&gt;@app.get("/")&lt;/code&gt; tells FastAPI: "If someone sends an &lt;strong&gt;HTTP GET request&lt;/strong&gt; to the root URL (&lt;code&gt;/&lt;/code&gt;), then run the function right below this decorator (&lt;code&gt;read_root&lt;/code&gt; in this case)."&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;It Adds Web Superpowers:&lt;/strong&gt; This decorator does &lt;em&gt;a lot&lt;/em&gt; of work for you behind the scenes:

&lt;ul&gt;
&lt;li&gt;It tells the FastAPI application to "listen" for requests on that specific URL.&lt;/li&gt;
&lt;li&gt;It automatically handles converting the Python dictionary &lt;code&gt;{"message": "Hello, World!"}&lt;/code&gt; into &lt;strong&gt;JSON&lt;/strong&gt; (the standard data format for web APIs) before sending it back as an HTTP response.&lt;/li&gt;
&lt;li&gt;It knows how to automatically generate that awesome interactive documentation (Swagger UI / ReDoc) for your API!&lt;/li&gt;
&lt;li&gt;It manages sending the correct &lt;strong&gt;HTTP Status Code&lt;/strong&gt; (like &lt;code&gt;200 OK&lt;/code&gt;) along with your response.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;In essence, &lt;code&gt;@app.get("/")&lt;/code&gt; takes your simple Python function (&lt;code&gt;read_root&lt;/code&gt;) and transforms it into a full-fledged, ready-to-use web API endpoint!&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Other FastAPI Decorators
&lt;/h3&gt;

&lt;p&gt;You'll see other decorators too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@app.post("/items/")&lt;/code&gt;: Used for &lt;code&gt;POST&lt;/code&gt; requests, often to &lt;em&gt;create&lt;/em&gt; new data.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@app.put("/items/{item_id}")&lt;/code&gt;: Used for &lt;code&gt;PUT&lt;/code&gt; requests, often to &lt;em&gt;update&lt;/em&gt; existing data.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@app.delete("/items/{item_id}")&lt;/code&gt;: Used for &lt;code&gt;DELETE&lt;/code&gt; requests, to &lt;em&gt;remove&lt;/em&gt; data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these adds specific web-related behaviors and instructions to the Python function they decorate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Are Decorators So Useful?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clean Code:&lt;/strong&gt; They keep your main function focused on &lt;em&gt;what it does&lt;/em&gt; (e.g., &lt;code&gt;read_root&lt;/code&gt; just returns a message), while the decorator handles &lt;em&gt;how it interacts with the web&lt;/em&gt; (e.g., listening for GET requests on &lt;code&gt;/&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reusability:&lt;/strong&gt; You could write one decorator and apply it to many functions to add the same behavior to all of them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework Power:&lt;/strong&gt; They allow frameworks like FastAPI to provide tons of functionality with very little code from you. It's like FastAPI handles all the complex web server setup, and you just tell it what your functions &lt;em&gt;do&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;So, the next time you see that little &lt;code&gt;@&lt;/code&gt; symbol in FastAPI, don't be intimidated! Remember, it's just a friendly decorator, a "gift wrapper" that's taking your regular Python function and giving it powerful web capabilities, making your life as a backend developer much, much easier.&lt;/p&gt;

&lt;p&gt;Keep exploring and happy coding!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>python</category>
      <category>fastapi</category>
    </item>
    <item>
      <title>✂️ Understanding Slices in Go: A Beginner’s Guide</title>
      <dc:creator>Joseph utuedeye </dc:creator>
      <pubDate>Fri, 16 May 2025 16:37:22 +0000</pubDate>
      <link>https://dev.to/joe_/understanding-slices-in-go-a-beginners-guide-d4g</link>
      <guid>https://dev.to/joe_/understanding-slices-in-go-a-beginners-guide-d4g</guid>
      <description>&lt;p&gt;When I started learning Go, arrays made sense, fixed-length, type-specific, easy.&lt;br&gt;
Then I met slices… and I was like&lt;/p&gt;

&lt;p&gt;“Wait… it looks like an array🤔, but it isn’t? It can grow. What’s the difference?”&lt;/p&gt;

&lt;p&gt;If you've asked the same questions, this guide is for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧠 What is a Slice?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;slice&lt;/strong&gt; in Go is a &lt;strong&gt;flexible, growable view&lt;/strong&gt; into the elements of an array.&lt;/p&gt;

&lt;p&gt;It’s built on top of an array, but unlike arrays, &lt;strong&gt;slices can change size&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;nums&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;nums&lt;/code&gt; is a slice of integers. You didn’t define how long it should be. Go figure that out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔍 The Anatomy of a Slice&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Under the hood, a slice has three parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pointer&lt;/strong&gt; – to the underlying array&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Length&lt;/strong&gt; – number of elements in the slice&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capacity&lt;/strong&gt; – total space from the starting index to the end of the array
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c"&gt;// 5&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c"&gt;// 5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can change how much of a slice you want to see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;part&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c"&gt;// Includes s[1], s[2], s[3] =&amp;gt; [2, 3, 4]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🛠 How to Create Slices&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. From an Array
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;slice&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c"&gt;// [20, 30, 40]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Using a Slice Literal&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"go"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"is"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"cool"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Using &lt;code&gt;make()&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;// len = 3, cap = 5 =&amp;gt; [0, 0, 0]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;➕ Appending to a Slice&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Slices grow using the &lt;code&gt;append()&lt;/code&gt; function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;letters&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"b"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;letters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;letters&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"c"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"d"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// ["a", "b", "c", "d"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Behind the scenes, Go may allocate a new underlying array if the slice exceeds its capacity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Common Gotchas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Slices Share the Same Underlying Array&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;
&lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;99&lt;/span&gt;

&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// [99 2 3]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both &lt;code&gt;s1&lt;/code&gt; and &lt;code&gt;s2&lt;/code&gt; point to the &lt;strong&gt;same&lt;/strong&gt; data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Slicing Can Limit Capacity&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;part&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;           &lt;span class="c"&gt;// [2, 3]&lt;/span&gt;
&lt;span class="n"&gt;part&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// might overwrite base[3] and base[4]!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To avoid this, use &lt;code&gt;copy()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;safe&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nb"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;safe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;✅ Recap&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slices are flexible views into arrays.&lt;/li&gt;
&lt;li&gt;They have length and capacity.&lt;/li&gt;
&lt;li&gt;You can create slices using literals, arrays, or &lt;code&gt;make()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;append()&lt;/code&gt; to grow slices.&lt;/li&gt;
&lt;li&gt;Be cautious: slices share memory!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🔚 Final Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Understanding slices is &lt;strong&gt;key&lt;/strong&gt; to writing clean and efficient Go code. They might look like arrays at first, but they’re way more powerful and a bit trickier under the hood.&lt;/p&gt;

&lt;p&gt;But now you know the difference, and you're ready to slice and dice like a pro 😄. 🍕&lt;/p&gt;

</description>
      <category>programming</category>
      <category>javascript</category>
      <category>ai</category>
      <category>go</category>
    </item>
    <item>
      <title>🚀 Developing with Golang: A Beginner's First Steps</title>
      <dc:creator>Joseph utuedeye </dc:creator>
      <pubDate>Tue, 06 May 2025 09:12:53 +0000</pubDate>
      <link>https://dev.to/joe_/developing-with-golang-a-beginners-first-steps-1b7g</link>
      <guid>https://dev.to/joe_/developing-with-golang-a-beginners-first-steps-1b7g</guid>
      <description>&lt;p&gt;&lt;strong&gt;By a beginner, for beginners.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7x54kptxx4ze2z8ilwm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7x54kptxx4ze2z8ilwm.png" alt="Go for beginners" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I first started learning Go (Golang), everything felt a little strange. Coming from the Python and JavaScript background😅😅., I expected to deal with new syntax, but I didn’t expect to get stuck on the very first line of every Go file:&lt;br&gt;
&lt;code&gt;package main&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I remember asking myself:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;"Why do we declare the package name before the start of any code?"&lt;/em&gt;&lt;br&gt;
Well, let’s break it down and walk through the basics of developing with Go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📦 What Is a Package in Go?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Go, as well as other languages like Python, a package is a way to organize and reuse code. Every .go file must start by declaring which package it belongs to.&lt;/p&gt;

&lt;p&gt;There are two kinds of packages you’ll encounter early on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;main: This package is special. It tells the Go compiler that this file is part of an executable program.&lt;/li&gt;
&lt;li&gt;Library packages: These are packages meant to be imported into other Go files. For example, a helper package might look like:
&lt;code&gt;package utils&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're writing a standalone program that you want to run, you’ll always use:&lt;br&gt;
&lt;code&gt;package main&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧪 Let’s Build a Simple Go Program&lt;/strong&gt;&lt;br&gt;
Here’s a small Go program to illustrate everything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package main

import "fmt"

func main() {
    fmt.Println("Hello, Golang!")
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🔍 What’s Happening Here?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;package main: Declares this file as part of the main executable.&lt;/li&gt;
&lt;li&gt;import "fmt": Pulls in Go’s formatting package, used to print things.&lt;/li&gt;
&lt;li&gt;func main(): The entry point of any Go executable program.&lt;/li&gt;
&lt;li&gt;fmt.Println(...): Prints a line of text to the terminal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try running this with:&lt;br&gt;
&lt;code&gt;go run hello.go&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🤔 Why Is Go So Strict?&lt;/strong&gt;&lt;br&gt;
Go may feel strict at first, but this is intentional.&lt;br&gt;
It enforces clear, consistent, and minimal syntax. That’s part of what makes it easy to read, even in large codebases. Once you adjust, you’ll appreciate how little guesswork there is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Tips for New Go Developers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always declare your package; it is required.&lt;/li&gt;
&lt;li&gt;Use go run file.go to run a single file quickly.&lt;/li&gt;
&lt;li&gt;Go has an amazing standard library: explore net/http, os, strings, etc.&lt;/li&gt;
&lt;li&gt;Use Go by Example to see real-world code snippets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don’t be afraid of the unfamiliar; it gets easier, fast!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🛠️ Final Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go is a language that values simplicity, and that starts right from line 1 with package main. While it might feel odd at first, it’s one of the reasons Go is so approachable for building everything from scripts to scalable backend systems.&lt;br&gt;
If you’re just starting your Go journey, remember this:&lt;br&gt;
You don’t need to know everything at once; just keep going.&lt;br&gt;
Write code, break things, and ask questions (like I did about package main).&lt;/p&gt;

&lt;p&gt;You're on the right path. Happy coding! 🧑‍💻&lt;/p&gt;

&lt;p&gt;Got questions or want to share your first Go project? Drop them in the comments, I’d love to connect!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>go</category>
    </item>
  </channel>
</rss>
