In this section, we will cover the fundamental CRUD (Create, Read, Update, Delete) operations in Go, focusing on how to interact with a database to perform these operations. CRUD operations are essential for any application that deals with persistent data storage.
Objectives
- Understand the basic CRUD operations.
- Learn how to implement CRUD operations in Go.
- Practice with practical examples and exercises.
Prerequisites
- Basic understanding of Go programming.
- Familiarity with SQL and relational databases.
- Completion of the previous module on connecting to a database.
Table of Contents
Introduction to CRUD Operations
CRUD operations are the four basic functions of persistent storage. They are:
- Create: Insert new data into the database.
- Read: Retrieve data from the database.
- Update: Modify existing data in the database.
- Delete: Remove data from the database.
Setting Up the Database
Before we dive into CRUD operations, let's set up a simple database. We'll use SQLite for simplicity, but the concepts apply to other relational databases like MySQL or PostgreSQL.
Example Database Schema
We'll create a simple users
table with the following schema:
CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT NOT NULL UNIQUE, age INTEGER );
Create Operation
The Create operation involves inserting new records into the database.
Example: Inserting a New User
package main import ( "database/sql" "fmt" _ "github.com/mattn/go-sqlite3" ) func main() { db, err := sql.Open("sqlite3", "./example.db") if err != nil { panic(err) } defer db.Close() // Insert a new user stmt, err := db.Prepare("INSERT INTO users(name, email, age) VALUES(?, ?, ?)") if err != nil { panic(err) } defer stmt.Close() res, err := stmt.Exec("John Doe", "[email protected]", 30) if err != nil { panic(err) } id, err := res.LastInsertId() if err != nil { panic(err) } fmt.Printf("Inserted user with ID: %d\n", id) }
Explanation
- We open a connection to the SQLite database.
- We prepare an SQL statement for inserting a new user.
- We execute the statement with the user's details.
- We retrieve and print the ID of the newly inserted user.
Read Operation
The Read operation involves retrieving data from the database.
Example: Retrieving All Users
package main import ( "database/sql" "fmt" _ "github.com/mattn/go-sqlite3" ) func main() { db, err := sql.Open("sqlite3", "./example.db") if err != nil { panic(err) } defer db.Close() rows, err := db.Query("SELECT id, name, email, age FROM users") if err != nil { panic(err) } defer rows.Close() for rows.Next() { var id int var name, email string var age int err = rows.Scan(&id, &name, &email, &age) if err != nil { panic(err) } fmt.Printf("ID: %d, Name: %s, Email: %s, Age: %d\n", id, name, email, age) } err = rows.Err() if err != nil { panic(err) } }
Explanation
- We open a connection to the SQLite database.
- We execute a query to retrieve all users.
- We iterate over the result set and print each user's details.
Update Operation
The Update operation involves modifying existing records in the database.
Example: Updating a User's Age
package main import ( "database/sql" "fmt" _ "github.com/mattn/go-sqlite3" ) func main() { db, err := sql.Open("sqlite3", "./example.db") if err != nil { panic(err) } defer db.Close() // Update a user's age stmt, err := db.Prepare("UPDATE users SET age = ? WHERE email = ?") if err != nil { panic(err) } defer stmt.Close() res, err := stmt.Exec(35, "[email protected]") if err != nil { panic(err) } rowsAffected, err := res.RowsAffected() if err != nil { panic(err) } fmt.Printf("Updated %d rows\n", rowsAffected) }
Explanation
- We open a connection to the SQLite database.
- We prepare an SQL statement for updating a user's age.
- We execute the statement with the new age and the user's email.
- We retrieve and print the number of rows affected by the update.
Delete Operation
The Delete operation involves removing records from the database.
Example: Deleting a User
package main import ( "database/sql" "fmt" _ "github.com/mattn/go-sqlite3" ) func main() { db, err := sql.Open("sqlite3", "./example.db") if err != nil { panic(err) } defer db.Close() // Delete a user stmt, err := db.Prepare("DELETE FROM users WHERE email = ?") if err != nil { panic(err) } defer stmt.Close() res, err := stmt.Exec("[email protected]") if err != nil { panic(err) } rowsAffected, err := res.RowsAffected() if err != nil { panic(err) } fmt.Printf("Deleted %d rows\n", rowsAffected) }
Explanation
- We open a connection to the SQLite database.
- We prepare an SQL statement for deleting a user.
- We execute the statement with the user's email.
- We retrieve and print the number of rows affected by the deletion.
Practical Exercises
Exercise 1: Insert Multiple Users
Write a program to insert multiple users into the users
table. Use a loop to insert at least three users.
Exercise 2: Retrieve Users by Age
Write a program to retrieve and print all users who are older than a specified age.
Exercise 3: Update User's Email
Write a program to update a user's email based on their name.
Exercise 4: Delete Users by Age
Write a program to delete all users who are younger than a specified age.
Summary
In this section, we covered the basic CRUD operations in Go:
- Create: Inserting new records into the database.
- Read: Retrieving data from the database.
- Update: Modifying existing records in the database.
- Delete: Removing records from the database.
These operations are fundamental for any application that interacts with a database. By practicing these operations, you will gain a solid understanding of how to manage data in a Go application.
Go Programming Course
Module 1: Introduction to Go
Module 2: Basic Concepts
Module 3: Advanced Data Structures
Module 4: Error Handling
Module 5: Concurrency
Module 6: Advanced Topics
Module 7: Web Development with Go
Module 8: Working with Databases
Module 9: Deployment and Maintenance
- Building and Deploying Go Applications
- Logging
- Monitoring and Performance Tuning
- Security Best Practices