database - 带有外键的模型上的 restful api

标签 database postgresql rest go buffalo

TLDR;如何在 buffalo 框架中为具有外键(或一般的数据库关系)的模型创建 REST api?

我是 go 的绝对初学者,我正在尝试使用 buffalo 框架按照其官方网站上给出的以下示例编写 RESTFul 服务。我能够在没有数据库关系的模型上创建 RESTful api。但是当我遇到模型有外键的情况时,我被卡住了。我无法在网上找到任何文档或引用资料。我对围棋的概念也很薄弱,你也可以在这些方面教我。

型号:(引用:https://gobuffalo.io/en/docs/db/relations#example

type Composer struct {
    ID              uuid.UUID `json:"id" db:"id"`
    Name            string    `json:"name" db:"name"`
    Description     string    `json:"description" db:"description"`
    CreatedAt       time.Time `json:"created_at" db:"created_at"`
    UpdatedAt       time.Time `json:"updated_at" db:"updated_at"`

}


type Track struct {
    ID          uuid.UUID           `json:"id" db:"id"`
    Title       string              `json:"title" db:"title"`
    Description string              `json:"description" db:"description"`
    Composer    Composer            `has_one:"composer" fk_id:"id"`
    CreatedAt   time.Time           `json:"created_at" db:"created_at"`
    UpdatedAt   time.Time           `json:"updated_at" db:"updated_at"`
}

资源:(引用:https://gobuffalo.io/en/docs/resources)

type TrackResource struct {
    buffalo.Resource
}


func (v TrackResource) List(c buffalo.Context) error {
    tx, ok := c.Value("tx").(*pop.Connection)
    if !ok {
        return errors.WithStack(errors.New("no transaction found"))
    }

    pieces := &models.Tracks{}

    q := tx.PaginateFromParams(c.Params())

    if err := q.All(pieces); err != nil {
        return errors.WithStack(err)
    }

    c.Set("pagination", q.Paginator)

    return c.Render(200, r.JSON(pieces))
}


func (v TrackResource) Show(c buffalo.Context) error {
    tx, ok := c.Value("tx").(*pop.Connection)
    if !ok {
        return errors.WithStack(errors.New("no transaction found"))
    }

    piece := &models.Track{}

    if err := tx.Find(piece, c.Param("track_id")); err != nil {
        return c.Render(404, r.JSON(err))
    }

    return c.Render(200, r.JSON(piece))
}


func (v TrackResource) Create(c buffalo.Context) error {

    piece := &models.Track{}

    if err := c.Bind(piece); err != nil {
        return errors.WithStack(err)
    }

    tx, ok := c.Value("tx").(*pop.Connection)
    if !ok {
        return errors.WithStack(errors.New("no transaction found"))
    }

    verrs, err := piece.Create(tx)
    if err != nil {
        return errors.WithStack(err)
    }

    if verrs.HasAny() {
        return c.Render(422, r.JSON(verrs))
    }

    return c.Render(201, r.Auto(c, piece))
}


func (v TrackResource) Update(c buffalo.Context) error {

    tx, ok := c.Value("tx").(*pop.Connection)
    if !ok {
        return errors.WithStack(errors.New("no transaction found"))
    }

    piece := &models.Track{}

    if err := tx.Find(piece, c.Param("track_id")); err != nil {
        return c.Error(404, err)
    }

    if err := c.Bind(piece); err != nil {
        return errors.WithStack(err)
    }

    verrs, err := piece.Update(tx)
    if err != nil {
        return errors.WithStack(err)
    }

    if verrs.HasAny() {
        return c.Render(422, r.JSON(verrs))
    }

    return c.Render(200, r.JSON(piece))
}


func (v TrackResource) Destroy(c buffalo.Context) error {

    tx, ok := c.Value("tx").(*pop.Connection)
    if !ok {
        return errors.WithStack(errors.New("no transaction found"))
    }

    piece := &models.Track{}

    if err := tx.Find(piece, c.Param("track_id")); err != nil {
        return c.Error(404, err)
    }

    if err := tx.Destroy(piece); err != nil {
        return errors.WithStack(err)
    }

    return c.Render(200, r.JSON(piece))
}

当我尝试创建轨道时。我收到错误:

json: cannot unmarshal string into Go struct field Track.Composer of type models.Composer
gitlab.com/****/****/actions.TrackResource.Create

enter image description here

请帮忙。

最佳答案

您正在尝试将包含 ComposerTrack 与其 ID 绑定(bind),但 Composer 被定义为结构。

要使其正常工作,您需要实现 Unmarshaler接口(interface)并定义如何将此 ID 转换为所需的 Composer 结构。

关于database - 带有外键的模型上的 restful api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51376852/

相关文章:

PHP和MySQL选择框

sql - 如何在不删除子表的情况下删除 PostgreSQL 中的表

mysql - 许多表之一的外键?

postgresql - 如何在多个进程之间共享一组数据?

java - 415 RESTful Web 服务中不支持的媒体类型

rest - 多线程的可能算法列出大型 S3 存储桶中的所有键?

MySQL 为多行生成 UUID()

database - 从 FORMAT 输出到字符串?

android - 所有下载的数据库

java - 如何从 JAVA 将 JSON 文件发送到 Splunk Enterprise?