Gustavo Semião-Lobo
Gustavo Semião-Lobo

Reputation: 2628

SSL is not enabled on the server

Trying to communicate with a postgres database with go, preparing the statement like this:

var stmt *sql.Stmt
var err error

stmt, err = db.Prepare(selectStatement)
if err != nil {
    fmt.Printf("db.Prepare error: %v\n",err)
    return err
}

Throws the following error:

db.Prepare error: pq: SSL is not enabled on the server

Any solution ?

I can add more information, if needed.

Upvotes: 173

Views: 141173

Answers (7)

Heartbit
Heartbit

Reputation: 1836

when you are using sqlx for connection to postgres try this one:

import (
    "github.com/jmoiron/sqlx"
    _ "github.com/lib/pq"
)

func main () {
  // c is my configuration struct use your own struct instead
  databseUrl := fmt.Sprintf(
        "postgres://%s:%s@%s:%s/%s?sslmode=disable",
        c.Postgres.User, c.Postgres.Password, c.Postgres.Host, c.Postgres.Port, c.Postgres.Name,
  )

  db, _ := sqlx.Open("postgres", databaseUrl)

}

Upvotes: 4

Jacob
Jacob

Reputation: 2414

You can use a Struct to pass the values or load it from Env or Config file.

Here is the solution,

package main

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

type Config struct {
    DBDriver      string
    DBSource      string
    ServerAddress string
}

func main() {

    db, err := openDB()
    if err != nil {
        log.Printf("Databse Connection Error", err)
    }

    err = db.Ping()
    fmt.Println("Database Conn opend")

    if err != nil {
        log.Printf("Error while Pinging Database")
    }

}

func openDB() (*sql.DB, error) {

    // Here you can populate the DB params from Env or Config file or use marshaling to fill in the values
    dbParams := Config{
        DBDriver:      "postgres",
        DBSource:      "postgres://usename:password@localhost:5432/DatabaseName?sslmode=disable",
        ServerAddress: "",
    }

    db, err := sql.Open(dbParams.DBDriver, dbParams.DBSource)

    if err != nil {
        fmt.Println("error", err)
        return nil, err
    }

    return db, nil
}

Upvotes: 0

gildniy
gildniy

Reputation: 3913

This is how I got it working:

db, err := sql.Open("postgres", "postgres://{user}:{password}@{hostname}:{port}/{database-name}?sslmode=disable")

Upvotes: 23

frops
frops

Reputation: 2365

Notice, please:

This even occurs, if you have indicated a sslmode=disable, but have empty other param. For example dbname=

For example, connection string:

user=test password=test dbname=sslmode=disable will also issue this error, because dbname is empty.

Upvotes: 42

Harald Nordgren
Harald Nordgren

Reputation: 12391

To establish a connection without SSL, try

postgres://username:password@host:5432/database?sslmode=disable

Upvotes: 28

eatonphil
eatonphil

Reputation: 13682

If your data source name is a url, you will do it like this:

db, err := sql.Open("postgres", "postgres://username:password@localhost/db_name?sslmode=disable")

sslmode is just added to the db url like a query parameter.

Upvotes: 186

Kavu
Kavu

Reputation: 8384

You should establish DB connection without SSL encryption, like that:

db, err := sql.Open("postgres", "user=test password=test dbname=test sslmode=disable") 

Upvotes: 274

Related Questions