这主要是针对我计划编写的涉及创建数据库的测试套件具有setup()和teardown()方法。
我已经弄清楚了如何使用GORM创建数据库。但是,我不确定这是否是最好的方法。
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
"log"
)
func main() {
db, err := gorm.Open("postgres", "host=127.0.0.1 port=5432 user=superuser dbname=postgres password='' sslmode=disable")
capture(err)
db = db.Exec("CREATE DATABASE test_db;")
if db.Error != nil {
fmt.Println("Unable to create DB test_db, attempting to connect assuming it exists...")
db, err = gorm.Open("postgres", "host=127.0.0.1 port=5432 user=superuser dbname=test_db password='' sslmode=disable")
if err != nil {
fmt.Println("Unable to connect to test_db")
capture(err)
}
}
defer db.Close()
}
func capture(err error) {
if err != nil {
log.Fatalf("%s", err)
}
}
我先连接到默认的postgres
数据库,然后创建第二个计划使用的测试数据库。
这是最好的方法吗?还是有一种方法可以在没有预先存在的数据库的情况下连接到Postgres。
注意:在人们使用SQL驱动程序仅使用连接字符串user:password@/
连接到DB的地方,我已经找到了答案。就我而言,这没有用。(例如here)
我还尝试了一个没有数据库名称的连接字符串,这导致驱动程序尝试以与用户相同的名称连接到数据库。失败的原因是这样的数据库不存在。
答案 0 :(得分:1)
您的方法似乎足够有效。您还可以在连接数据库之前使用postgres的createdb
实用程序创建数据库。例如:
import (
"log"
"os/exec"
"bytes"
)
func createPgDb() {
cmd := exec.Command("createdb", "-p", "5432", "-h", "127.0.0.1", "-U", "superuser", "-e", "test_db")
var out bytes.Buffer
cmd.Stdout = &out
if err := cmd.Run(); err != nil {
log.Printf("Error: %v", err)
}
log.Printf("Output: %q\n", out.String())
}
中的“命令/运行”示例