0
0
Lập trình
Admin Team
Admin Teamtechmely

Hướng Dẫn Xây Dựng RESTful API Với Golang Sử Dụng Gin, Gorm, và PostgreSQL

Đăng vào 4 ngày trước

• 3 phút đọc

Hướng Dẫn Xây Dựng RESTful API Với Golang Sử Dụng Gin, Gorm, và PostgreSQL

Trong bài viết này, chúng ta sẽ đi từng bước để xây dựng một dịch vụ RESTful API cơ bản bằng ngôn ngữ lập trình Golang. Chúng ta sẽ sử dụng thư viện gin để tạo API, công cụ gorm làm ORM, và sử dụng PostgreSQL cho cơ sở dữ liệu. Bài viết này sẽ bao gồm các tính năng cơ bản như: tạo cơ sở dữ liệu, tạo bảng, chèn dữ liệu và truy vấn, lập chỉ mục, hàm và thủ tục lưu trữ, triggers, views, CTEs, transactions, constraints, và xử lý JSON.

1. Khởi Tạo Dự Án

Giả sử rằng bạn đã cài đặt PostgreSQL, Golang, và go mod:

bash Copy
mkdir library-api
cd library-api
go mod init library-api

Cấu trúc dự án:

Copy
/library-api
|-- db.sql
|-- main.go
|-- go.mod

2. Cài Đặt Dependencies

Cài đặt các gói cần thiết:

bash Copy
go get github.com/gin-gonic/gin
go get gorm.io/gorm
go get gorm.io/driver/postgres

3. Xây Dựng Schema Cho PostgreSQL

Dưới đây là script SQL để tạo schema cho cơ sở dữ liệu trong tệp db.sql:

sql Copy
-- Tạo cơ sở dữ liệu library.
CREATE DATABASE library;

-- Kết nối đến cơ sở dữ liệu library.
\c library;

-- Tạo bảng authors.
CREATE TABLE authors (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL UNIQUE,
    bio TEXT
);

-- Tạo bảng books.
CREATE TABLE books (
    id SERIAL PRIMARY KEY,
    title VARCHAR(200) NOT NULL,
    author_id INTEGER REFERENCES authors(id) ON DELETE CASCADE,
    published_date DATE NOT NULL,
    description TEXT,
    details JSONB
);

-- Tạo bảng users.
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Tạo một bảng partition cho borrow logs dựa trên năm.
CREATE TABLE borrow_logs (
    id SERIAL PRIMARY KEY,
    user_id INTEGER REFERENCES users(id),
    book_id INTEGER REFERENCES books(id),
    borrowed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    returned_at TIMESTAMP
) PARTITION BY RANGE (borrowed_at);

-- Tạo partitions cho từng năm.
CREATE TABLE borrow_logs_2023 PARTITION OF borrow_logs
    FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');

CREATE TABLE borrow_logs_2024 PARTITION OF borrow_logs
    FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');

-- Tạo chỉ mục cho việc tìm kiếm nhanh hơn.
CREATE INDEX idx_books_published_date ON books (published_date);
CREATE INDEX idx_books_details ON books USING GIN (details);

4. Mã Nguồn Golang

Dưới đây là phần mã hoàn chỉnh cho RESTful API sử dụng Gin và GORM trong main.go:

go Copy
package main

import (
    "net/http"
    "strconv"
    "time"

    "github.com/gin-gonic/gin"
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
)

// Định nghĩa các cấu trúc dữ liệu cho các bảng
...

func main() {
    initDB()
    r := gin.Default()

    r.POST("/authors", createAuthor)
    r.PUT("/authors/:id", updateAuthor)
    r.DELETE("/authors/:id", deleteAuthor)
    r.POST("/books", createBook)
    r.POST("/users", createUser)
    r.POST("/borrow", borrowBook)
    r.GET("/borrow/user/:id/count", getBorrowCount)
    r.GET("/borrow/user/:id/logs", getBorrowLogs)
    r.GET("/borrow_logs", listBorrowLogs)
    r.GET("/books_with_author", listBooks)

    r.Run(":8080")
}

// Các hàm xử lý cho API
...

5. Khởi Chạy APIs

Chạy script SQL để tạo bảng, lập chỉ mục, view, hàm, và trigger. Khởi động server Golang bằng lệnh:

bash Copy
go run main.go

Lúc này, bạn đã có một API RESTful được xây dựng bằng Golang, bao gồm các tính năng cơ bản của PostgreSQL.

6. Thêm Một Số Tính Năng Khác

Chúng ta có thể nâng cấp API RESTful này bằng cách thêm các tính năng như Views, CTEs (Common Table Expressions), indexing full-text, và xử lý JSON. Mã nguồn cho phần này đã được chuẩn bị từ phần trước, vì vậy chỉ cần thêm mã vào main.go.

go Copy
// Truy vấn lịch sử mượn của người dùng
func getUserBorrowHistory(c *gin.Context) {
    ...
}

// Sử dụng CTE trong truy vấn
...

7. Các Tính Năng Nâng Cao Khác

Trong phần này, chúng ta sẽ tích hợp thêm các tính năng như VACUUM, MVCC, và Window Functions. Chúng ta sẽ sử dụng chúng để tối ưu hóa cơ sở dữ liệu.

go Copy
// Sử dụng VACUUM trong Golang
func vacuumBooks(c *gin.Context) {
    ...
}

// Tìm hiểu MVCC
...

Khi kết hợp với nhau, các tính năng này sẽ giúp API của bạn trở nên mạnh mẽ và tối ưu hơn. Hãy thử nghiệm và áp dụng chúng vào dự án của bạn!


Nếu bạn thấy bài viết này hữu ích, hãy chia sẻ ý kiến của bạn và giúp chúng tôi cải thiện hơn nữa.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào