2016-03-26 12 views
0

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?

Antwort

1

Es macht keinen Sinn, das Verzeichnis der Datei model.go zur Laufzeit zu erhalten, da sich die kompilierte ausführbare Datei in einem komplett anderen Dateisystem befinden könnte.

Sie können das Verzeichnis, wo die ausführbaren aus gestartet wurde erhalten mögen:

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

dir wird der Ordner sein, in dem das Programm zur Laufzeit lebt.

Verwandte Themen