«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Подключение вашего Go API к базе данных PostgreSQL

Подключение вашего Go API к базе данных PostgreSQL

Опубликовано 3 ноября 2024 г.
Просматривать:567

Connecting Your Go API to a PostgreSQL Database

Хорошо, у нас уже запущен Go API, но пришло время выделить ему немного долговременной памяти. На этой неделе мы подключаем наш API к PostgreSQL, чтобы вы могли хранить все эти ценные данные, не теряя их при закрытии приложения. Поверьте, ваши пользователи будут вам благодарны.

Почему PostgreSQL?

PostgreSQL или для краткости «Postgres» — это то, что нужно, когда дело касается баз данных. Вот почему это самая популярная БД:

  1. Насыщенный функционал: хотите ли вы хранить простой старый текст, JSON или даже сложные географические данные, Postgres поможет вам. Он также полностью соответствует требованиям ACID (читай: он обеспечивает целостность и безопасность ваших данных) и имеет достаточно возможностей для выполнения запросов, которые заставят улыбнуться любого специалиста по данным.

  2. Открытый и бесплатный: Да, Postgres полностью бесплатен и имеет открытый исходный код. Кроме того, у него есть активное сообщество, которое постоянно его совершенствует, поэтому вам никогда не придется беспокоиться о том, что он устареет.

  3. Масштабируется как профессионал: создаете ли вы крошечное приложение или массивный корпоративный сервис с обработкой данных, Postgres справится с этим. Он предназначен для масштабирования, оснащен параллельным выполнением запросов и магией оптимизации, обеспечивающей бесперебойную работу.

  4. Построен как танк: Имея за плечами десятилетия разработок, Postgres надежен. Он получает регулярные обновления, имеет массу функций безопасности и используется в производстве такими гигантами, как Apple и Netflix.

Все это поняли? Отлично, давайте подключим его к нашему Go API и начнем творить чудеса с базами данных!

Шаг 0: Настройка PostgreSQL

Если у вас еще не установлен PostgreSQL, скачайте его здесь. Тогда давайте запустим:

  1. Подключиться к PostgreSQL:

   psql -U postgres


  1. Создать базу данных:

   CREATE DATABASE bookdb;


  1. Настройте стол для наших книг:

   \c bookdb;
   CREATE TABLE books (
       id SERIAL PRIMARY KEY,
       title VARCHAR(255) NOT NULL,
       author VARCHAR(255) NOT NULL
   );


Теперь у вас есть новая база данных, готовая к работе. Пришло время поговорить с Го!

Шаг 1. Подключитесь к PostgreSQL

Для этого мы используем библиотеку pgx. Он быстрый, легкий и выполняет свою работу.


go get github.com/jackc/pgx/v5


Откройте файл main.go и добавьте этот код, чтобы настроить соединение с базой данных:


var db *pgxpool.Pool

func connectDB() *pgxpool.Pool {
    url := "postgres://postgres:yourpassword@localhost:5432/bookdb"
    config, err := pgxpool.ParseConfig(url)
    if err != nil {
        log.Fatalf("Unable to parse DB config: %v\n", err)
    }

    dbpool, err := pgxpool.NewWithConfig(context.Background(), config)
    if err != nil {
        log.Fatalf("Unable to connect to database: %v\n", err)
    }

    return dbpool
}


Замените свой пароль на свой пароль PostgreSQL. Эта функция подключается к нашей базе данных bookdb и возвращает пул соединений, что по сути означает, что наше приложение будет иметь множество готовых к использованию многоразовых соединений. Эффективность, детка! ?

Шаг 2. Обновите основную функцию

Давайте удостоверимся, что наше соединение с базой данных активируется, когда это делает наш сервер:


func main() {
    db = connectDB()
    defer db.Close()

    // Initialize router and define routes here (as before)
}


Шаг 3. Операции CRUD – ввод данных

Хорошо, давайте добавим несколько функций для получения, создания и управления книгами в нашей базе данных.

Получить все книги


func getBooks(w http.ResponseWriter, r *http.Request) {
    rows, err := db.Query(context.Background(), "SELECT id, title, author FROM books")
    if err != nil {
        http.Error(w, "Database error", http.StatusInternalServerError)
        return
    }
    defer rows.Close()

    var books []Book
    for rows.Next() {
        var book Book
        err := rows.Scan(&book.ID, &book.Title, &book.Author)
        if err != nil {
            http.Error(w, "Error scanning row", http.StatusInternalServerError)
            return
        }
        books = append(books, book)
    }

    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(books)
}


Добавить новую книгу


func createBook(w http.ResponseWriter, r *http.Request) {
    var book Book
    err := json.NewDecoder(r.Body).Decode(&book)
    if err != nil {
        http.Error(w, "Bad request", http.StatusBadRequest)
        return
    }

    _, err = db.Exec(context.Background(), "INSERT INTO books (title, author) VALUES ($1, $2)", book.Title, book.Author)
    if err != nil {
        http.Error(w, "Error inserting book", http.StatusInternalServerError)
        return
    }

    w.WriteHeader(http.StatusCreated)
    json.NewEncoder(w).Encode(book)
}


Шаг 4. Защита маршрутов с помощью промежуточного программного обеспечения

Мы хотим, чтобы только прошедшие проверку подлинности пользователи могли получить доступ к нашим новым конечным точкам на базе базы данных. Используйте промежуточное программное обеспечение для аутентификации, полученное на второй неделе, и все готово!


func main() {
    db = connectDB()
    defer db.Close()

    r := mux.NewRouter()

    r.HandleFunc("/login", login).Methods("POST")
    r.Handle("/books", authenticate(http.HandlerFunc(getBooks))).Methods("GET")
    r.Handle("/books", authenticate(http.HandlerFunc(createBook))).Methods("POST")

    fmt.Println("Server started on port :8000")
    log.Fatal(http.ListenAndServe(":8000", r))
}


Тестирование

Давайте проверим это:

  1. Добавить новую книгу:

   curl -X POST http://localhost:8000/books -d '{"title": "1984", "author": "George Orwell"}' -H "Content-Type: application/json"


  1. Выбрать все книги:

   curl http://localhost:8000/books


И бум! У вас есть Go API с PostgreSQL, готовый обрабатывать реальные данные.

Что дальше?

В следующий раз мы сделаем наш API еще лучше, добавив специальное промежуточное программное обеспечение для ведения журналов и обработки ошибок. Оставайтесь с нами, чтобы узнать больше!

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/neelp03/connecting-your-go-api-to-a-postgresql-database-39?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить это
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3