Хорошо, у нас уже запущен Go API, но пришло время выделить ему немного долговременной памяти. На этой неделе мы подключаем наш API к PostgreSQL, чтобы вы могли хранить все эти ценные данные, не теряя их при закрытии приложения. Поверьте, ваши пользователи будут вам благодарны.
PostgreSQL или для краткости «Postgres» — это то, что нужно, когда дело касается баз данных. Вот почему это самая популярная БД:
Насыщенный функционал: хотите ли вы хранить простой старый текст, JSON или даже сложные географические данные, Postgres поможет вам. Он также полностью соответствует требованиям ACID (читай: он обеспечивает целостность и безопасность ваших данных) и имеет достаточно возможностей для выполнения запросов, которые заставят улыбнуться любого специалиста по данным.
Открытый и бесплатный: Да, Postgres полностью бесплатен и имеет открытый исходный код. Кроме того, у него есть активное сообщество, которое постоянно его совершенствует, поэтому вам никогда не придется беспокоиться о том, что он устареет.
Масштабируется как профессионал: создаете ли вы крошечное приложение или массивный корпоративный сервис с обработкой данных, Postgres справится с этим. Он предназначен для масштабирования, оснащен параллельным выполнением запросов и магией оптимизации, обеспечивающей бесперебойную работу.
Построен как танк: Имея за плечами десятилетия разработок, Postgres надежен. Он получает регулярные обновления, имеет массу функций безопасности и используется в производстве такими гигантами, как Apple и Netflix.
Все это поняли? Отлично, давайте подключим его к нашему Go API и начнем творить чудеса с базами данных!
Если у вас еще не установлен PostgreSQL, скачайте его здесь. Тогда давайте запустим:
psql -U postgres
CREATE DATABASE bookdb;
\c bookdb; CREATE TABLE books ( id SERIAL PRIMARY KEY, title VARCHAR(255) NOT NULL, author VARCHAR(255) NOT NULL );
Теперь у вас есть новая база данных, готовая к работе. Пришло время поговорить с Го!
Для этого мы используем библиотеку 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 и возвращает пул соединений, что по сути означает, что наше приложение будет иметь множество готовых к использованию многоразовых соединений. Эффективность, детка! ?
Давайте удостоверимся, что наше соединение с базой данных активируется, когда это делает наш сервер:
func main() { db = connectDB() defer db.Close() // Initialize router and define routes here (as before) }
Хорошо, давайте добавим несколько функций для получения, создания и управления книгами в нашей базе данных.
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) }
Мы хотим, чтобы только прошедшие проверку подлинности пользователи могли получить доступ к нашим новым конечным точкам на базе базы данных. Используйте промежуточное программное обеспечение для аутентификации, полученное на второй неделе, и все готово!
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)) }
Давайте проверим это:
curl -X POST http://localhost:8000/books -d '{"title": "1984", "author": "George Orwell"}' -H "Content-Type: application/json"
curl http://localhost:8000/books
И бум! У вас есть Go API с PostgreSQL, готовый обрабатывать реальные данные.
В следующий раз мы сделаем наш API еще лучше, добавив специальное промежуточное программное обеспечение для ведения журналов и обработки ошибок. Оставайтесь с нами, чтобы узнать больше!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3