SQL
Remarks#
For a list of SQL database drivers see the official Go wiki article SQLDrivers.
The SQL drivers are imported and prefixed by _
, so that they are only available to driver.
Querying
This example is showing how to query a database with database/sql
, taking as example a MySql database.
package main
import (
"log"
"fmt"
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
func main() {
dsn := "mysql_username:CHANGEME@tcp(localhost:3306)/dbname"
db, err := sql.Open("mysql", dsn)
if err != nil {
log.Fatal(err)
}
defer sql.Close()
rows, err := db.Query("select id, first_name from user limit 10")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int
var username string
if err := rows.Scan(&id, &username); err != nil {
log.Fatal(err)
}
fmt.Printf("%d-%s\n", id, username)
}
}
MySQL
To enable MySQL, a database driver is needed. For example github.com/go-sql-driver/mysql.
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
Opening a database
Opening a database is database specific, here there are examples for some databases.
Sqlite 3
file := "path/to/file"
db_, err := sql.Open("sqlite3", file)
if err != nil {
panic(err)
}
MySql
dsn := "mysql_username:CHANGEME@tcp(localhost:3306)/dbname"
db, err := sql.Open("mysql", dsn)
if err != nil {
panic(err)
}
MongoDB: connect & insert & remove & update & query
package main
import (
"fmt"
"time"
log "github.com/Sirupsen/logrus"
mgo "gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
var mongoConn *mgo.Session
type MongoDB_Conn struct {
Host string `json:"Host"`
Port string `json:"Port"`
User string `json:"User"`
Pass string `json:"Pass"`
DB string `json:"DB"`
}
func MongoConn(mdb MongoDB_Conn) (*mgo.Session, string, error) {
if mongoConn != nil {
if mongoConn.Ping() == nil {
return mongoConn, nil
}
}
user := mdb.User
pass := mdb.Pass
host := mdb.Host
port := mdb.Port
db := mdb.DB
if host == "" || port == "" || db == "" {
log.Fatal("Host or port or db is nil")
}
url := fmt.Sprintf("mongodb://%s:%s@%s:%s/%s", user, pass, host, port, db)
if user == "" {
url = fmt.Sprintf("mongodb://%s:%s/%s", host, port, db)
}
mongo, err := mgo.DialWithTimeout(url, 3*time.Second)
if err != nil {
log.Errorf("Mongo Conn Error: [%v], Mongo ConnUrl: [%v]",
err, url)
errTextReturn := fmt.Sprintf("Mongo Conn Error: [%v]", err)
return &mgo.Session{}, errors.New(errTextReturn)
}
mongoConn = mongo
return mongoConn, nil
}
func MongoInsert(dbName, C string, data interface{}) error {
mongo, err := MongoConn()
if err != nil {
log.Error(err)
return err
}
db := mongo.DB(dbName)
collection := db.C(C)
err = collection.Insert(data)
if err != nil {
return err
}
return nil
}
func MongoRemove(dbName, C string, selector bson.M) error {
mongo, err := MongoConn()
if err != nil {
log.Error(err)
return err
}
db := mongo.DB(dbName)
collection := db.C(C)
err = collection.Remove(selector)
if err != nil {
return err
}
return nil
}
func MongoFind(dbName, C string, query, selector bson.M) ([]interface{}, error) {
mongo, err := MongoConn()
if err != nil {
return nil, err
}
db := mongo.DB(dbName)
collection := db.C(C)
result := make([]interface{}, 0)
err = collection.Find(query).Select(selector).All(&result)
return result, err
}
func MongoUpdate(dbName, C string, selector bson.M, update interface{}) error {
mongo, err := MongoConn()
if err != nil {
log.Error(err)
return err
}
db := mongo.DB(dbName)
collection := db.C(C)
err = collection.Update(selector, update)
if err != nil {
return err
}
return nil
}