如何使用pgx进行鹅迁移?

4
我有一个使用PostgreSQL的小型Go Web应用程序。
我的数据库驱动是pgx。现在我想在应用程序启动时自动运行迁移,我找到了goose来实现这个功能。
然而,我在使用pgx驱动时遇到了困难。
当我运行我的代码时,会出现以下错误:
Opening DB
2023/08/09 09:39:28 sql: unknown driver "pgx" (forgotten import?)

这是简化后的 main.go 文件:
package main

import (
"context"
"flag"
"fmt"
"log"
"os"

    _ "github.com/jackc/pgx/v5"
    "github.com/pressly/goose/v3"

)

func main() {

    // DSN is the PostgreSQL Data Source Name, Database Source Name.
    // Often the same as connection string.
    dsn := flag.String("dsn", "postgres://postgres:password@localhost:5555/plazet", "PostgreSQL data source name")
    flag.Parse()
    
    db, err := openDbConnectionPool(*dsn)
    if err != nil {
        fmt.Printf("Unable to connect to database: %v\n", err)
        os.Exit(1)
    }
    
    // Ping the database to check if the connection is working
    connection, err := db.Acquire(context.Background())
    if err != nil {
        fmt.Printf("Unable to acquire connection: %v\n", err)
        os.Exit(1)
    }
    
    println("Opening DB")
    
    sql, err := goose.OpenDBWithDriver("pgx", *dsn)
    if err != nil {
        log.Fatalf(err.Error())
    }
    
    println("Migrating")
    
    err = goose.Up(sql, "./migrations")
    if err != nil {
        log.Fatalf(err.Error())
    }
    
    defer connection.Release()
    
    defer db.Close()
    
    // Code for router and stuff...

}

我检查了OpenDBWithDriver和pgx是预期的值。在这种情况下,我错过了什么?
2个回答

1
驱动程序 pgx 是由 github.com/jackc/pgx/v5/stdlib 包注册的(源代码):
package stdlib

// ...

func init() {
    pgxDriver = &Driver{
        configs: make(map[string]*pgx.ConnConfig),
    }

    // if pgx driver was already registered by different pgx major version then we
    // skip registration under the default name.
    if !contains(sql.Drivers(), "pgx") {
        sql.Register("pgx", pgxDriver)
    }
    sql.Register("pgx/v5", pgxDriver)
    // ...

尝试导入那个包而不是这个:
import (
    _ "github.com/jackc/pgx/v5/stdlib"
    "github.com/pressly/goose/v3"
)

0
对于在这里搜索如何将pgxpoolgoose一起使用的任何人 - 现在您可以使用pgx/v5/stdlib包中的OpenDBFromPool函数将*pgxpool.Pool转换为*sql.DB。该函数在版本v5.5.0中引入。
import (
    "github.com/jackc/pgx/v5/pgxpool"
    "github.com/jackc/pgx/v5/stdlib"
    "github.com/pressly/goose/v3"
)

// ...

func main() {
    var pool *pgxpool.Pool
    // setup pool

    goose.SetBaseFS(embedMigrations)

    if err := goose.SetDialect("postgres"); err != nil {
       panic(err)
    }

    db := stdlib.OpenDBFromPool(pool)
    if err := goose.Up(db, "migrations"); err != nil {
        panic(err)
    }
    if err := db.Close(); err != nil {
        panic(err)
    }

    // run app
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接