postgres выдает ошибку: нулевое значение в идентификаторе столбца нарушает ограничение ненулевого значения, даже если значение на самом деле не равно нулю

Я создаю API для отдыха, используя grpc, но даже если у меня есть заполненное значение, я получаю указанную выше ошибку. Пост curl перенаправляется на метод createAlbum

я создал базу данных и таблицу вручную в postgres

мое имя базы данных - альбом. Я вхожу в систему, используя альбом psql (пароль не указан)

затем я создал

create Table PHOTO(id INTEGER PRIMARY KEY, albumId INTEGER NOT NULL, title VARCHAR(255) NOT NULL, url VARCHAR(255) UNIQUE NOT NULL, thubmNailUrl VARCHAR(255) UNIQUE NOT NULL);

Это мой основной код

func main(){
prosgretConname := fmt.Sprintf("dbname=%v user=%v sslmode=disable", "album", "s")
    log.Infof("conname is %s", prosgretConname)
    db, err := gorm.Open("postgres", prosgretConname)
    if err != nil {
        panic("Failed to connect to database!")
    }// connects correctly to db

    //db.Table("photo")
    defer db.Close()
    go startGRPC(db)
    go startHTTP()
    // Block forever
    var wg sync.WaitGroup
    wg.Add(1)
    wg.Wait()

}
func startGRPC(db *gorm.DB) {
    lis, err := net.Listen("tcp", "localhost:5566")
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    grpcServer := grpc.NewServer()
    srv := svc.NewAlbumServer(db)
    albumgpb.RegisterAlbumServiceServer(grpcServer, srv)
...
}

теперь мой newAlbumServer возвращает экземпляр базы данных

type Album struct {
    title        string `json:"title"`
    albumid      int    `json:"albumid"`
    id           int    `json:"id" gorm:"primary_key;not null"`
    url          string `json:"url"`
    thumbnailurl string `json:"thumbnailurl"`
}
func (a *AlbumServiceServer) CreateAlbum(ctx context.Context, in *albumgpb.Albumreq) (*albumgpb.Albumreq, error) {
    tx := a.db.Begin()

    photo := Album{}
    photo.title = in.Album.Title
    photo.albumid = int(in.Album.AlbumId)
    photo.id = int(in.Album.Id)
    photo.url = in.Album.Url
    photo.thumbnailurl = in.Album.ThumbNailUrl

    log.Infof("%v", photo.id) // this prints 1
    log.Infof("the id is %v", int(in.Album.Id))// this prints 1 on server logs
    log.Infof("%+v\n", in) //this prints the entire request in the POST command
    //tx.Table("photo").

err := tx.Table("public.photo").Create(&photo).Error // fails in this line stating pq: null value in column "id" violates not-null constraint 

if err != nil {
    log.Errorf("could not insert into db")
    tx.Rollback()
    return nil, err
}

tx.Commit()

....

это мой запрос на завивку и ответ

curl -X POST "http://localhost:8080/album" -d '{"id":1,"albumId":2,"title":"bleh","url":"sds","thumbNailUrl":"123"}'
2020-07-17 14:34:54.641 IST [16074] ERROR:  null value in column "id" violates not-null constraint
2020-07-17 14:34:54.641 IST [16074] DETAIL:  Failing row contains (null, null, null, null, null).
2020-07-17 14:34:54.641 IST [16074] STATEMENT:  INSERT INTO "public"."photo" DEFAULT VALUES RETURNING "public"."photo".*
{"error":"pq: null value in column \"id\" violates not-null constraint","code":2,"message":"pq: null value in column \"id\" violates not-null constraint"}

Любой совет о том, почему он не работает или что я делаю неправильно, будет действительно полезен.


person Saiprasanna Sastry    schedule 17.07.2020    source источник
comment
Я уверен, что причина та же, что описана здесь: все пакеты основаны на reflection — и gorm предположительно не является исключением — имеют доступ только к экспортируемым полям struct типов, а ваши не экспортируются. Поэтому я бы предположил, что код ORM не считывает поля из значения вашего типа данных, и id в конечном итоге сопоставляется с NULL. Вы можете это проверить?   -  person kostix    schedule 17.07.2020
comment
это смягчило эту ошибку, но по какой-то причине теперь его изменение экспортируемых значений на подчеркивание ОШИБКА: столбец Album_id фотографии отношения не существует в символе 39 2020-07-17 14:59:36.911 IST [17790] STATEMENT: INSERT INTO public. фото (название,album_id,id,url,thumb_nail_url) ЗНАЧЕНИЯ ($1,$2,$3,$4,$5) ВОЗВРАТ public.photo.id @kostix   -  person Saiprasanna Sastry    schedule 17.07.2020
comment
Я понял это, потому что я создавал таблицу, используя AlbumId, по какой-то причине она сопоставляла ее с альбомом_id, может ли любой парень из psql ответить, почему это так? я новичок в psql   -  person Saiprasanna Sastry    schedule 17.07.2020
comment
Это не postgres, а gorm, он автоматически преобразует случай верблюда в случай змеи, если вы не хотите, вы, вероятно, можете изменить значение по умолчанию с помощью некоторых настроек, но я не уверен, поскольку я не пользователь горма , вы должны посетить их веб-страницу и документацию, чтобы узнать это. В качестве альтернативы вы, вероятно, можете указать имя столбца с помощью тегов структуры, как вы делаете для json, например. `json:"albumid" gorm:"albumid"`, опять же, я не уверен, что это поможет, но вы можете попробовать, если вы в затруднительном положении.   -  person mkopriva    schedule 17.07.2020
comment
... почему? потому что формат змеиного регистра является наиболее часто используемым и предпочтительным.   -  person mkopriva    schedule 17.07.2020
comment
В дополнение к тому, что сказал mkopriva, обратите внимание, что у вас есть теги json во всех полях вашей структуры Album, но только один из них также имеет тег gorm. Пакет gorm вряд ли когда-либо будет учитывать теги json.   -  person kostix    schedule 17.07.2020
comment
На самом деле этот факт о подходе к отображению gorm указан в документации пакета: ‹gorm .io/docs/conventions.html#Snake-Case-Column-Name  -  person kostix    schedule 17.07.2020


Ответы (1)


Посмотрите это.

Поскольку поле id не экспортировано (начинается с нижнего регистра), оно не будет видно ни пакету json, ни пакету gorm.

person Vaibhav Mishra    schedule 23.07.2020