Как решить проблему структурирования базы данных на языке программирования go? - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь создать структуру базы данных postgresql для автоматизации системы в Голанге.

Этот код работает;

package main

import (
    "database/sql"
    "fmt"

    _ "github.com/lib/pq"
)

func checkError(err error){
    if err!=nil{
        panic(err)
    }
}

const (
    host     = "localhost"
    port     = 5432
    user     = "postgres"
    password = "123"
    dbname   = "DatabaseName"
)

func main() {
    psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
        "password=%s dbname=%s sslmode=disable",
        host, port, user, password, dbname)
    db, err := sql.Open("postgres", psqlInfo)
    checkError(err)

    err = db.Ping()
    checkError(err)

    defer db.Close()
    fmt.Println("Successfully connected!")
}

Результат: Успешно подключено!

Но когда я пытаюсь создать структуру, система выдает ошибку;

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/lib/pq"
)

func checkError(err error){
    if err!=nil{
        panic(err)
    }
}

type Database struct{
    host, port, user, password, dbname string
    db *sql.DB
}

func(d *Database) Open(){
    psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+"password=%s dbname=%s sslmode=disable", d.host, d.port, d.user, d.password, d.dbname)
    db, err := sql.Open("postgres", psqlInfo)
    checkError(err)
    d.db = db
}

func(d *Database) IsOpened() {
    checkError(d.db.Ping())
}

func main() {
    a := Database{host: "localhost", port: "5432", user: "postgres", password: "123", dbname: "DatabaseName"}
    a.Open()
    a.IsOpened()
}

Результат: panic: dial tcp: lookup tcp /%! D (string= 5432): getaddrinfow: указанный класс не найден.

маршрут 1 [выполняется]: main.checkError (...) /main.go:11

main. (*База данных) .IsOpened (...) /main.go:28 main.main () /main.go:34 + 0xcc

1 Ответ

0 голосов
/ 07 апреля 2019

Это произошло потому, что у вас есть гибридное приложение с типом данных. Вы объявили номер порта в виде строки, но когда вы строите строку подключения, вы указали номер порта в виде целого числа, что приведет к host=localhost port=%!d(string=5432) user=postgres password=123 dbname=DatabaseName sslmode=disable неправильной строке подключения. Строка подключения должна быть host=localhost port=5432 user=postgres password=123 dbname=DatabaseName sslmode=disable. Вы можете изменить тип данных номера порта с string на int в struct

type Database struct {
    host, user, password, dbname string
    port                         int
    db                           *sql.DB
}

https://play.golang.org/p/yP3Y-0NdloQ

Или вы можете изменить тип номера порта с %d на %s при построении строки подключения

psqlInfo := fmt.Sprintf("host=%s port=%s user=%s "+"password=%s dbname=%s sslmode=disable", d.host, d.port, d.user, d.password, d.dbname)

https://play.golang.org/p/e61dOUg0MA-

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