Ich benutze Golan Revel Web-Framework und Ich versuche, eine sqlite
db im aktuellen Arbeitsverzeichnis zu erstellen.Wie bekomme ich den Speicherort der aktuellen Datei in Revel
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)
}
}
Ich habe einen Test an Ort und Stelle, die gerade diese Funktion aufruft.
wenn ich den Test ausführen revel test
oder zum localhost:9000/@tests
gehen, die Funktion Panics
und die Fehlermeldung unter Verwendung ist cannot open the database file
.
Der Grund dafür ist, dass die filename
zurückgegeben von runtime.Caller(1)
/usr/local/go/src/runtime/asm_amd64.s
ist, für die das Programm keine Berechtigung hat.
wenn ich direkt schreiben ./foo.db
, selbst dann zeigt der Fehler.
Ich versuchte os.Getwd()
, die leere Zeichenfolge zurückgeben.
Ich versuchte auch filepath.Abs(filepath.Dir(os.Args[0]))
aber das /home/girish/GoProjects/bin/revel.d
zurückgab, das die revel
binär ist.
Also, was ist der beste Weg, um das Verzeichnis der model.go
zu finden?