PostgreSQL es un sistema gestor de bases de datos objeto-relacional disponible para muchas plataformas, incluyendo Linux, FreeBSD, Solaris, Microsoft Windows y Mac OS X. Está liberado bajo una licencia de estilo MIT, y es por lo tanto software libre de código abierto. Es más grande que MySQL, pues está diseñada para un uso empresarial como Oracle. Así que es una buena opción usar PostgreSQL en proyectos empresariales.
Hay muchos drivers para la base de datos PostgreSQL, y tres de ellos son los siguientes:
- https://github.com/bmizerany/pq suporta
database/sql
, puro código Go. - https://github.com/jbarham/gopgsqldriver suporta
database/sql
, puro código Go. - https://github.com/lxn/go-pgsql suporta
database/sql
, puro código Go.
Voy a utilizar el primero para los siguientes ejemplos.
Creamos el SQL de la siguiente forma:
CREATE TABLE userinfo
(
uid serial NOT NULL,
username character varying(100) NOT NULL,
departname character varying(500) NOT NULL,
Created date,
CONSTRAINT userinfo_pkey PRIMARY KEY (uid)
)
WITH (OIDS=FALSE);
Un ejemplo:
package main
import (
"database/sql"
"fmt"
_ "github.com/bmizerany/pq"
"time"
)
const (
DB_USER = "postgres"
DB_PASSWORD = "postgres"
DB_NAME = "test"
)
func main() {
dbinfo := fmt.Sprintf("user=%s password=%s dbname=%s sslmode=disable",
DB_USER, DB_PASSWORD, DB_NAME)
db, err := sql.Open("postgres", dbinfo)
checkErr(err)
defer db.Close()
fmt.Println("# Inserting values")
var lastInsertId int
err = db.QueryRow("INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3) returning uid;", "astaxie", "研发部门", "2012-12-09").Scan(&lastInsertId)
checkErr(err)
fmt.Println("last inserted id =", lastInsertId)
fmt.Println("# Updating")
stmt, err := db.Prepare("update userinfo set username=$1 where uid=$2")
checkErr(err)
res, err := stmt.Exec("astaxieupdate", lastInsertId)
checkErr(err)
affect, err := res.RowsAffected()
checkErr(err)
fmt.Println(affect, "rows changed")
fmt.Println("# Querying")
rows, err := db.Query("SELECT * FROM userinfo")
checkErr(err)
for rows.Next() {
var uid int
var username string
var department string
var created time.Time
err = rows.Scan(&uid, &username, &department, &created)
checkErr(err)
fmt.Println("uid | username | department | created ")
fmt.Printf("%3v | %8v | %6v | %6v\n", uid, username, department, created)
}
fmt.Println("# Deleting")
stmt, err = db.Prepare("delete from userinfo where uid=$1")
checkErr(err)
res, err = stmt.Exec(lastInsertId)
checkErr(err)
affect, err = res.RowsAffected()
checkErr(err)
fmt.Println(affect, "rows changed")
}
func checkErr(err error) {
if err != nil {
panic(err)
}
}
Tenga en cuenta que PostgreSQL usa formato como $1,$2
en vez de ?
como en MySQL, y tiene un formato diferente de DSN en sql.Open
.
Otra cosa es que Postgres no soporta sql.Result.LastInsertId()
.
Por eso en vez de esto,
stmt, err := db.Prepare("INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3);")
res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09")
fmt.Println(res.LastInsertId())
Usamos esto db.QueryRow()
y esto .Scan()
para obtener el valor del ultimo id insertado.
err = db.QueryRow("INSERT INTO TABLE_NAME values($1) returning uid;", VALUE1").Scan(&lastInsertId)
fmt.Println(lastInsertId)
- Indice
- Sección anterior: SQLite
- Siguiente sección: Desarrollo de un ORM basado en beedb