🤷‍♀️ 🤷‍♂️ GolangでのJackC/PGXドライバを使用したPostgreSQLのエラー


導入


おい、devの人々!👋 今日、私は“単純なエラー”と呼ばれる短いシリーズの新しいシリーズを開始しています.
そのような記事を書くとき、私は常に4つの規則に従います.
  • エラーの原因説明
  • エラーが発生した入力データの説明
  • エラーの解決策
  • 動機づけの結論と言葉;
  • あまりにも厳しく判断しないでください、あなたがそのような記事について考えるものを書いてください、コメントで構文解析のためにあなた自身の話題を提案してください..ここで我々は行く!🚀

    📝 目次

  • Explanation of the error
  • Input data when an error occurs
  • Resolving the error
  • Conclusions
  • エラーの説明


    PostgreSQLデータベースを使用したGolangのREST API (または他の製品)の開発についてjackc/pgx , 時々、あなたは情報を捜すために混乱させることができる単純な誤りを得るかもしれません.特に新人.
    この単純なエラーは次のようになります.cannot convert [SOMETHING] to [SOMETHING] . 私の場合はcannot convert 1 to Text .
    このエラーメッセージはJackC/PGXパッケージから来ており、プリペアドステートメントとPostgreSQLがプレースホルダの型を決定できないため、内部的にこのパッケージの組み合わせによって引き起こされます.

    👍 Thanks for this explanation to author of this comment.


    ↑ Table of contents

    エラーが発生したときにデータを入力する


    まず、アプリケーション表のデータベースにプロジェクト表を作成する移行ファイルを見てみましょう.
    -- ./platform/migration/000001_create_init_tables.up.sql
    
    -- Create projects table
    CREATE TABLE "projects" (
      "id" UUID PRIMARY KEY DEFAULT (uuid_generate_v4()),
      "created_at" timestamp DEFAULT (now()),
      "updated_at" timestamp,
      "user_id" UUID NOT NULL,
      "alias" varchar(255) UNIQUE NOT NULL,
      "project_status" int NOT NULL,
      "project_attrs" JSONB NOT NULL
    );
    
    // ...
    
    フィールドが非常に特定の型を持っていることを確認します.このテーブルは、このテーブルのデータを作成/変更するときにPostgresによって検証されます.
    さて、Goモデルを見てみましょう.
    // ./app/controllers/project_model.go
    
    // Project struct to describe project object.
    type Project struct {
        ID            uuid.UUID    `db:"id" json:"id"`
        CreatedAt     time.Time    `db:"created_at" json:"created_at"`
        UpdatedAt     time.Time    `db:"updated_at" json:"updated_at"`
        UserID        uuid.UUID    `db:"user_id" json:"user_id"`
        Alias         string       `db:"alias" json:"alias"`
        ProjectStatus int          `db:"project_status" json:"project_status"`
        ProjectAttrs  ProjectAttrs `db:"project_attrs" json:"project_attrs"`
    }
    
    // ProjectAttrs struct to describe project attributes.
    type ProjectAttrs struct {
        Title       string `json:"title"`
        Description string `json:"description"`
        Picture     string `json:"picture"`
        URL         string `json:"url"`
    }
    
    // ...
    
    はい、あなたはかなり正しいJSOB Goモデルのフィールド型は正規構造になっており、project_attrs データベースフィールド.

    👌 Other fields are quite normal for any Go project.


    ↑ Table of contents

    エラーの解決


    スムーズにこの単純なエラーに解決しましょう.
    解決策を知る必要があるのは、PostgreSQLでは、クエリ内のプレースホルダの型を直接指定できます.単に移行ファイルで指定した型をクエリに追加します.
    フィールド型を指定する書式は次のとおりです.$N::<TYPE> (ドル記号+プレースホールダー番号+ 2つのコロン+フィールドタイプからDB).
    // ./app/controllers/project_query.go
    
    // CreateProject method for creating project by given Project object.
    func (q *ProjectQueries) CreateProject(p *models.Project) error {
        // Define query string.
        // We define type for each field to solve this simple error.
        query := `
        INSERT INTO projects 
        VALUES ($1::uuid, $2::timestamp, $3::timestamp, $4::uuid, $5::varchar, $6::int, $7::jsonb)
        `
    
        // Send query to database.
        _, err := q.Exec(query, p.ID, p.CreatedAt, p.UpdatedAt, p.UserID, p.Alias, p.ProjectStatus, p.ProjectAttrs)
        if err != nil {
            // Return only error.
            return err
        }
    
        // This query returns nothing.
        return nil
    }
    
    // ...
    

    ☝️ Once again, please note that we are specifying the PostgreSQL field type from the migration, not the Go structure from the model!


    プロジェクトを構築し、このエンドポイントを要求した後、エラーが表示されなくなり、要求が成功します!🎉
    ↑ Table of contents

    結論


    個人的には、このチェックは完全にジャック/pgxパッケージの設定でこのチェックを無効にするよりも好きですhere ).
    コントローラの実装の詳細にダイブしなくてもSQLクエリの一目でフィールドタイプをすぐに理解できるからです.
    あなたにとって便利なオプションを選び、それを使ってください.成功した仕事をして、単純なエラーをあなたのプロジェクトを実現する方法であなたを決して止めさせないようにしてください!😉
    ↑ Table of contents

    写真とビデオ

  • アーランプラカシュhttps://unsplash.com/photos/pE9mgLMwee0
  • ケンドルルースhttps://unsplash.com/photos/AijuW-HlE30
  • ピーエス


    あなたがこのブログの上でこれのようなより多くの記事を望むならば、下記のコメントを掲示して、私を購読してください.ありがとう😘
    そして、もちろん、あなたは私を支援することができますLiberaPay . 各寄付は、新しい記事を書いて、コミュニティのための非営利のオープンソースプロジェクトを開発するのに用いられます.