我正在使用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
目录的最佳方式是什么?
答案 0 :(得分:1)
在运行时获取model.go文件的目录是没有意义的,因为已编译的可执行文件可能位于完全不同的文件系统上。
您可能想要获取正在运行的可执行文件的起始目录:
dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
dir将是程序在运行时所在的文件夹。