「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go API を PostgreSQL データベースに接続する

Go API を PostgreSQL データベースに接続する

2024 年 11 月 3 日に公開
ブラウズ:786

Connecting Your Go API to a PostgreSQL Database

さて、Go API を起動しましたが、そろそろ長期記憶を与える時期が来ました。今週、私たちは API を PostgreSQL に接続します。これにより、アプリをシャットダウンした瞬間に貴重なデータをすべて失うことなく保存できるようになります。信じてください、ユーザーはあなたに感謝するでしょう。

なぜPostgreSQLなのか?

PostgreSQL または略して「Postgres」は、データベースに関しては本物です。これが最も人気のある DB である理由は次のとおりです:

  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
   );


これで、新しいデータベースの準備が整いました。 Go に話しかける時間です!

ステップ 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: Main 関数を更新する

サーバーが起動したときにデータベース接続が起動することを確認しましょう:


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: ミドルウェアによるルートの保護

認証されたユーザーのみがデータベースを利用した新しいエンドポイントにアクセスできるようにしたいと考えています。第 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))
}


テストしてみる

これをテストしてみましょう:

  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


そしてドーン! PostgreSQL を使用した Go API が完成し、実際のデータを処理できるようになりました。

次は何ですか?

次回は、ロギングとエラー処理用のカスタム ミドルウェアを使用して API をさらに滑らかにします。続きをお楽しみに!

リリースステートメント この記事は次の場所に転載されています: https://dev.to/neelp03/connecting-your-go-api-to-a-postgresql-database-39?1 侵害がある場合は、[email protected] に連絡して削除してください。それ
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3