web-dev-qa-db-ja.com

Gormを使用してPostgresデータベースを作成する方法

これは主に、DBの作成を含む書き込みを計画しているテストスイートのSetup()とTearDown()メソッドを備えています。

私はgormを使ってdBを作成する方法を考え出しました。しかし、これが最良のアプローチであるかどうかわからない。

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 dbに接続しています。その後、私が使用することを計画している2番目のテストDBを作成しています。

これは最善のアプローチですか?または既存のDBを持たずにPostgresに接続する方法はあります。

[〜#〜]注[〜#〜]:私はすでに人々がSQLドライバを使用してDBに接続するためにDBに接続している回答をもう探しました。接続文字列user:password@/。それは私の訴訟で働いていません。(好きな ここ

私はALSEがDB名を持たずに接続文字列を試みました。その結果、ドライバがユーザーと同じ名前のDBに接続しようとしています。このようなDBが存在しないために失敗する。

10

あなたの方法は十分に有効であるようです。 Postgres 'createdbユーティリティを使用して、接続する前にDBを作成することもできます。例えば:

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())
}
 _

この例は、Goマニュアル内のコマンド/実行例から異なります https://golang.org/pkg/s/exec/##command

2
Nicko