如何在狂欢

时间:2016-03-26 17:05:53

标签: go revel

我正在使用golang revel web框架和 我正在尝试在当前工作目录中创建一个sqlite db。

model.go

func New(dbName string,table string) *Db {
    _,filename,_,_ := runtime.Caller(1)
    db , err := sql.Open("sqlite3",path.Join(path.Dir(filename),dbName))
    if err != nil {
        log.Fatal(err)
    }

    err = db.Ping()

    if err != nil {
        log.Panic(err)
    }

    database := &Db{Database:db}
    _,err = db.Exec("create table %s" +
    "( id integer primary key, " +
    "name varchar(100),"+
    "email varchar(100),"+
    "branch varchar(100),"+
    "help varchar(100)",)

    if err != nil {
        log.Fatal(err)
    }

}

我有一个只调用此函数的测试。

每当我使用revel test运行测试或转到localhost:9000/@tests时,函数Panics和错误消息都是 cannot open the database file

发生这种情况的原因是filename返回的runtime.Caller(1)/usr/local/go/src/runtime/asm_amd64.s,但该程序未获得许可。

如果我直接写./foo.db,即使这样,错误也会显示。

我尝试了os.Getwd(),返回空字符串。

我也试过filepath.Abs(filepath.Dir(os.Args[0])) 但是返回了/home/girish/GoProjects/bin/revel.d revel二进制文件。

那么找到model.go目录的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

在运行时获取model.go文件的目录是没有意义的,因为已编译的可执行文件可能位于完全不同的文件系统上。

您可能想要获取正在运行的可执行文件的起始目录:

dir, err := filepath.Abs(filepath.Dir(os.Args[0]))

dir将是程序在运行时所在的文件夹。