Skip to content

Latest commit

 

History

History
131 lines (99 loc) · 3.71 KB

File metadata and controls

131 lines (99 loc) · 3.71 KB

5.4 PostgreSQL

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.

Drivers de PostgreSQL

Hay muchos drivers para la base de datos PostgreSQL, y tres de ellos son los siguientes:

Voy a utilizar el primero para los siguientes ejemplos.

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)

Enlaces