さて、Go API を起動しましたが、そろそろ長期記憶を与える時期が来ました。今週、私たちは API を PostgreSQL に接続します。これにより、アプリをシャットダウンした瞬間に貴重なデータをすべて失うことなく保存できるようになります。信じてください、ユーザーはあなたに感謝するでしょう。
PostgreSQL または略して「Postgres」は、データベースに関しては本物です。これが最も人気のある DB である理由は次のとおりです:
機能満載: プレーンなテキスト、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 );
これで、新しいデータベースの準備が整いました。 Go に話しかける時間です!
これには 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) }
認証されたユーザーのみがデータベースを利用した新しいエンドポイントにアクセスできるようにしたいと考えています。第 2 週の認証ミドルウェアを使用すれば、準備は完了です。
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
そしてドーン! PostgreSQL を使用した Go API が完成し、実際のデータを処理できるようになりました。
次回は、ロギングとエラー処理用のカスタム ミドルウェアを使用して API をさらに滑らかにします。続きをお楽しみに!
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3