Преобразование sqlx.DB в sql .DB в Go - PullRequest
0 голосов
/ 17 июня 2020

Как лучше всего преобразовать тип sqlx.DB (jmoiron / sqlx) в sql.DB (database / sql)?

В настоящее время я использую пакет github.com/golang-migrate/migrate, и он требует существующее соединение, чтобы следовать интерфейсу sql.DB.


func Migrate(db *sqlx.DB) error {
    driver, err := postgres.WithInstance(db, &postgres.Config{})
    m, err := migrate.NewWithDatabaseInstance(
        "file://src/db/migrations",
        "postgres", driver)
    if err != nil {
        return err
    }

    return m.Up()
}

Обновление: я перепутал описание и добавил больше деталей. Название правильное.

Ответы [ 2 ]

2 голосов
/ 17 июня 2020

In do c

sqlx.DB - это оболочка вокруг sql .DB, которая отслеживает driverName при открытии, используется в основном для автоматической привязки именованных запросы с использованием правильных bindvars.

Таким образом, вы можете делать как

db, err := sqlx.Connect("postgres", "user=foo dbname=bar sslmode=disable")
sqlDB := db.DB // sqlDB is *sql.DB
2 голосов
/ 17 июня 2020

Вы можете преобразовать sql.DB (который является структурой, а не интерфейсом) в sqlx.DB, используя метод sqlx NewDb: Код

Этот метод требует *sql.DB, а также имя драйвера в виде строки.

Вот пример использования «mysql» для драйвера:

var myDb *sql.DB

...

anSqlxDb := sqlx.NewDb(myDb, "mysql") // returns *sqlx.DB

Изменить: чтобы добавить ответ на новый вопрос, который был задан в комментариях, также можно сделайте обратное и получите *sql.DB от *sqlx.DB.

Структура *sqlx.DB содержит встроенный *sql.DB ( Код ). Как встроенную структуру, ее можно получить, используя ее имя типа (DB):

var mySqlxDb *sqlx.DB

...

var anSqlDb := mySqlxDb.DB
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...