Reputation: 2628
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
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
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
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
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
Reputation: 12391
To establish a connection without SSL, try
postgres://username:password@host:5432/database?sslmode=disable
Upvotes: 28
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
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