我正在创建rssagg应用程序

这是我得到的错误

{
  "error": "Couldn't create User: ERROR: null value in column \"id\" of relation \"users\" violates not-null constraint (SQLSTATE 23502)"
}

这是我的处理程序用户go函数

    package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "time"

    "github.com/google/uuid"
    "github.com/jackc/pgx/v5/pgtype"
    internal "github.com/sakthi-lucia0567/rssagg/internal/database"
)

func (apiCfg *apiConfig) handleCreateUser(w http.ResponseWriter, r *http.Request) {
    type parameters struct {
        Name string `json:"name"`
    }
    decoder := json.NewDecoder(r.Body)

    params := parameters{}

    err := decoder.Decode(&params)
    if err != nil {
        respondWithError(w, 400, fmt.Sprintf("Error parsing JSON: %v", err))
        return
    }

    userUUID := uuid.New()
    // generatedType := pgtype.UUID{Bytes: userUUID[:]}
    generatedType := pgtype.UUID{Bytes: userUUID, Valid: true} // this is the code that chatgpt gave but it's seems it's also not working for me. 
    log.Println("user uuid", userUUID)
    log.Println("user generated type", generatedType)
    user, err := apiCfg.DB.CreateUser(r.Context(), internal.CreateUserParams{
        ID:        generatedType,
        CreatedAt: pgtype.Timestamp{Time: time.Now()},
        UpdatedAt: pgtype.Timestamp{Time: time.Now()},
        Name:      params.Name,
    })
    if err != nil {
        respondWithError(w, 400, fmt.Sprintf("Couldn't create User: %v", err))
        return
    }

    respondWithJSON(w, 200, user)
}

这是我的模型.go生成的sqlc

// Code generated by sqlc. DO NOT EDIT.
// versions:
//   sqlc v1.26.0

package internal

import (
    "github.com/jackc/pgx/v5/pgtype"
)

type User struct {
    ID        pgtype.UUID
    CreatedAt pgtype.Timestamp
    UpdatedAt pgtype.Timestamp
    Name      string
}

user.sql.go

// Code generated by sqlc. DO NOT EDIT.
// versions:
//   sqlc v1.26.0
// source: users.sql

package internal

import (
    "context"

    "github.com/jackc/pgx/v5/pgtype"
)

const createUser = `-- name: CreateUser :one
INSERT INTO users (id, created_at, updated_at, name)
VALUES ($1, $2, $3, $4)
RETURNING id, created_at, updated_at, name
`

type CreateUserParams struct {
    ID        pgtype.UUID
    CreatedAt pgtype.Timestamp
    UpdatedAt pgtype.Timestamp
    Name      string
}

func (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) (User, error) {
    row := q.db.QueryRow(ctx, createUser,
        arg.ID,
        arg.CreatedAt,
        arg.UpdatedAt,
        arg.Name,
    )
    var i User
    err := row.Scan(
        &i.ID,
        &i.CreatedAt,
        &i.UpdatedAt,
        &i.Name,
    )
    return i, err
}

这是我在运行服务器时得到的日志(log):

2024/04/11 00:56:22 user uuid 18bd07ce-a47d-484a-b2d3-1b1fb8d2bf9e
2024/04/11 00:56:22 user generated type {[24 189 7 206 164 125 72 74 178 211 27 31 184 210 191 158] false}

我希望创建一个用户,但uuid是来作为一个扩展,

uuid正在生成,但我无法将它们设置为postgr ID

推荐答案

pgtype.UUID定义为(假设您使用PGX v5):

type UUID struct {
    Bytes [16]byte
    Valid bool
}

因此,当你用pgtype.UUID{Bytes: userUUID}赋值时,Valid将是默认值(false;你可以在输出中看到这一点).PGX types的工作方式与sql个包类型(例如NullBool)相同;也就是说,如果Valid为false,那么当发送到数据库时,该值将被视为NULL.

要修复此用途:

generatedType := pgtype.UUID{Bytes: userUUID, Valid: true}

你将需要使用类似的方法与pgtype.Timestamp.

注意:这是基于您提供的信息(我已经对apiCfg.DB.CreateUser做了假设).

Postgresql相关问答推荐

如何在postquist中修剪第一/后文件名

在Docker Compose中获取CSV文件数据?

Postgresql我必须创建一个索引还是已经有一个索引了?

mosquito-go-auth with postgres authorization error

是否可以在psql查询输出中删除新行末尾的+号?

如何在不同的行中显示两列,避免重复并省略空条目

有对(type_id,element_id),如(1,1),(1,2),..(5,3).如果我需要获取没有 element_id 1 的类型 ID,如何从结果中排除 type_id?

使用包含重复元素的数组 Select 重复值

PostgreSQL 输入结束时的语法错误

try 访问本地主机中的数据库时如何解决Error: The server does not support SSL connections?

我应该使用哪个 postgresql 包?

带有初始数据的 docker postgres 不会在提交中持久化

在远程机器上Restore dump

Postgres 中的相似函数与 pg_trgm

Select 中的 PostgreSQL 正则表达式捕获组

如何使用 psql 执行 *.sql 文件

SQL 基本类型:integer vs int?

查询 JSON 列中的数组元素

postgres regexp_replace 只想允许 a-z 和 A-Z

PostgreSQL 中具有多个连接的 UPDATE 语句