buffalo 任务中使用数据库和 db::seed
buffalo的官方文档中,介绍task的时候,只介绍了如何创建task,没有介绍在task中如何使用数据。
在action中使用数据库是这样的:
tx := c.Value("tx").(*pop.Connection)
其中c
是buffalo.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)
}
}
希望对大家有帮助。