Halil MENGU
Halil MENGU

Reputation: 13

How to fix database structuring problem in go programming language?

I'm trying to create postgresql database struct to automate the system in Golang.

This code is working;

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!")
}

Result: Successfully connected!

But When I'm trying to create a struct the system giving me an error;

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

Result: panic: dial tcp: lookup tcp/%!d(string=5432): getaddrinfow: The specified class could not be found.

goroutine 1 [running]: main.checkError(...) /main.go:11

main.(*Database).IsOpened(...) /main.go:28 main.main() /main.go:34 +0xcc

Upvotes: 0

Views: 2827

Answers (1)

Shalauddin Ahamad Shuza
Shalauddin Ahamad Shuza

Reputation: 3657

This happened because you have mashup with data type. You have declared port number as string but when you are building the connection string you have specified port number as integer which will produce host=localhost port=%!d(string=5432) user=postgres password=123 dbname=DatabaseName sslmode=disable wrong connection string. Your connection string should be host=localhost port=5432 user=postgres password=123 dbname=DatabaseName sslmode=disable. You can change the port number data type from string to int in struct

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

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

Or you can change the port number type from %d to %s when building connection string

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-

Upvotes: 3

Related Questions