

# 環境

  * macOS High Sierra
  * sqliteではなく、mysql
  * gorpではなく、gorm

参考: [Go言語フレームワークRevelとPaizaCloudを使って10分でWebサービスを作る方法 -
paiza開発日誌](https://paiza.hatenablog.com/entry/2018/03/23/paizacloud_golang_revel)

booking tutorialの途中でエラーが出ました。  
<https://github.com/revel/examples/tree/master/booking>

[code]

    ERROR 18:33:28 watcher.go:270: Build detected an error                  error="Go Compilation Error (in app/controllers/gorm.go:31): undefined: sql" 
    
[/code]

# 経緯

controllers/app.goでgetUser を定義しようとしたら怒られました。  
まず手始めに、Txnが定義されていないと言われたので、（以下）

[code]

    ERROR 18:18:26 watcher.go:270: Build detected an error                  error="Go Compilation Error (in app/controllers/app.go:26): c.Txn undefined (type Application has no field or method Txn)" 
    
[/code]

`controllers/gorm.go` に

[code]

    type Transactional struct {
        *revel.Controller
        Txn *sql.Tx
    }
    
[/code]

を記述（あっているかわかりません。。。。）  
これで、Txnを定義したと思ったら  
一番上のエラーが出てきました。

sqlが見当たりませんと言われました。  
Txn *sql.Txこの部分ですね。  
どこかに、sqlの定義文が必要なのか、それともpackageをimportする必要があるのか？  
それとも、他に原因があるのか？

# controllers/gorm.go

[code]

    package controllers
    
    import (
        _ "github.com/go-sql-driver/mysql"
        "github.com/jinzhu/gorm"
        "github.com/revel/revel"
        "booking/app/models"
        "log"
        )
    
    
    type Transactional struct {
        *revel.Controller
        Txn *gorm.Tx
    }
    
    var DB *gorm.DB
    
    //dbの設定
    func InitDB() {
        dbInfo, _ := revel.Config.String("db.info")
        db, err := gorm.Open("mysql", dbInfo)
        if err != nil {
            log.Panicf("Failed gorm.Open: %v\n", err)
        }
    
        db.DB()
        db.AutoMigrate(&models.Booking{})
        db.AutoMigrate(&models.Hotel{})
        db.AutoMigrate(&models.User{})
    
        DB = db
    }
    
    
[/code]

# controllers/app.go

[code]

    package controllers
    
    import (
        "github.com/revel/revel"
        "booking/app/models"
        "booking/app/routes"
    )
    
    type Application struct {
        *revel.Controller
    }
    
    func (c Application) Index() revel.Result {
        if c.connected() != nil {
            return c.Redirect(routes.Hotels.Index())
        }
        c.Flash.Error("Please log in first")
        return c.Render()
    }
    
    func (c Application) connected() *models.User {
        if c.ViewArgs["user"] != nil {
            return c.ViewArgs["user"].(*models.User)
        }
        if username, ok := c.Session["user"]; ok {
            return c.getUser(username.(string))
        }
    
        return nil
    }
    
    func (c Application) getUser(username string) (user *models.User) {
        user = &models.User{}
        _,  err := c.Session.GetInto("fulluser", user, false)
        if user.Username == username {
            return user
        }
    
        err = c.Txn.SelectOne(user, c.Db.SqlStatementBuilder.Select("*").From("User").Where("Username=?", username))
        if err != nil {
            if err != sql.ErrNoRows {
                //c.Txn.Select(user, c.Db.SqlStatementBuilder.Select("*").From("User").Limit(1))
                count, _ := c.Txn.SelectInt(c.Db.SqlStatementBuilder.Select("count(*)").From("User"))
                c.Log.Error("Failed to find user", "user", username, "error",err, "count", count)
            }
            return nil
        }
        c.Session["fulluser"] = user
        return
    }
    
    func (c Application) Register() revel.Result {
        return c.Render()
    }
    
    
[/code]

全体のコードが必要なら挙げます。  
このTxnメソッドが邪魔なんだと思っています。  
これは、gorpのメソッドなので、gormでは使用できないのではないか？とも思っています。  
では、gormではどのようにすれば動くのでしょうか？


CC BY-SA 4.0
2019-04-28T07:29:22.653
54542
2019-05-04T05:13:26.153
2019-05-04T05:13:26.153
29826
34107
question
go
Go revel tutorial で undefined: sql


多分ですけど、 sql パッケージを import する必要があると思います。

<https://golang.org/pkg/database/sql/>

[code]

    import "database/sql"
    
[/code]

すると解決しませんか？


CC BY-SA 4.0
2019-04-28T09:26:55.663
54543
2019-04-28T09:26:55.663
754
54542
answer