buffalo 任务中使用数据库和 db::seed

buffalo的官方文档中,介绍task的时候,只介绍了如何创建task,没有介绍在task中如何使用数据。

在action中使用数据库是这样的:

tx := c.Value("tx").(*pop.Connection)

其中cbuffalo.Context, 一开始我以为task也一样,因为task方法中输入也是c *Context。一试还不行。
后来看了一些资料才知道,数据库其实在models中已经定义。models.DB就是一个*pop.Connection。所以在task中可以这样使用数据库:

       userObj := models.User{
            Email:                email,
            Password:             password,
            PasswordConfirmation: password,
        }
        err := models.DB.Create(&userObj)
        if err != nil {
              ......
        }

在task中一般很有可能是连续多次操作数据库,为了提升效率,我们可以使用事务。

       if err := models.DB.TruncateAll(); err != nil {
            return errors.WithStack(err)
        }

一个完整的db::seed,可能是这个样子的:

if err := models.DB.TruncateAll(); err != nil {
            return errors.WithStack(err)
        }

        band := &models.Band{
            Name: "The Beatles",
            Bio:  "4 fun loving lads from Liverpool.",
        }
        if err := models.DB.Create(band); err != nil {
            return errors.WithStack(err)
        }
        members := models.Members{
            {Name: "John Lennon", Instrument: "Guitar"},
            {Name: "Paul McCartney", Instrument: "Bass"},
            {Name: "George Harrison", Instrument: "Guitar"},
            {Name: "Ringo Starr", Instrument: "Drums"},
        }
        for _, m := range members {
            m.BandID = band.ID
            if err := models.DB.Create(&m); err != nil {
                return errors.WithStack(err)
            }
        }

        band = &models.Band{
            Name: "The Monkees",
            Bio:  "4 fun loving lads assembled by a TV studio",
        }
        if err := models.DB.Create(band); err != nil {
            return errors.WithStack(err)
        }
        members = models.Members{
            {Name: "Mike Nesmith", Instrument: "Guitar"},
            {Name: "Davy Jones", Instrument: "Voice"},
            {Name: "Peter Tork", Instrument: "Guitar"},
            {Name: "Mikey Dolenz", Instrument: "Drums"},
        }
        for _, m := range members {
            m.BandID = band.ID
            if err := models.DB.Create(&m); err != nil {
                return errors.WithStack(err)
            }
        }

希望对大家有帮助。

superwen
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!