Я создаю 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"}
Любой совет о том, почему он не работает или что я делаю неправильно, будет действительно полезен.
gorm
предположительно не является исключением — имеют доступ только к экспортируемым полямstruct
типов, а ваши не экспортируются. Поэтому я бы предположил, что код ORM не считывает поля из значения вашего типа данных, иid
в конечном итоге сопоставляется сNULL
. Вы можете это проверить? - person kostix   schedule 17.07.2020`json:"albumid" gorm:"albumid"`
, опять же, я не уверен, что это поможет, но вы можете попробовать, если вы в затруднительном положении. - person mkopriva   schedule 17.07.2020json
во всех полях вашей структурыAlbum
, но только один из них также имеет тегgorm
. Пакет gorm вряд ли когда-либо будет учитывать тегиjson
. - person kostix   schedule 17.07.2020