🤷♀️ 🤷♂️ GolangでのJackC/PGXドライバを使用したPostgreSQLのエラー
導入
おい、devの人々!👋 今日、私は“単純なエラー”と呼ばれる短いシリーズの新しいシリーズを開始しています.
そのような記事を書くとき、私は常に4つの規則に従います.
📝 目次
エラーの説明
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
写真とビデオ
ピーエス
あなたがこのブログの上でこれのようなより多くの記事を望むならば、下記のコメントを掲示して、私を購読してください.ありがとう😘
そして、もちろん、あなたは私を支援することができますLiberaPay . 各寄付は、新しい記事を書いて、コミュニティのための非営利のオープンソースプロジェクトを開発するのに用いられます.
Reference
この問題について(🤷♀️ 🤷♂️ GolangでのJackC/PGXドライバを使用したPostgreSQLのエラー), 我々は、より多くの情報をここで見つけました https://dev.to/koddr/postgresql-error-with-using-over-jackc-pgx-driver-in-golang-cannot-convert-x-to-y-1e6eテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol