Files
build-web-application-with-…/5.4.md
2012-09-11 17:35:09 +08:00

123 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#5.4使用PostgreSQL数据库
PostgreSQL 是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和对专有系统比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server的一种选择。
PostgreSQL和MySQL比较它更加庞大一点因为它是用来替代Oracle而设计的。所以在企业应用中采用PostgreSQL是一个明智的选择。
现在MySQL被Oracle收购之后有传闻Oracle正在逐步的封闭MySQL,也许将来我们会选择PostgreSQL作为我们后端数据库。
##驱动
Go实现的支持PostgreSQL的驱动还是挺多的发现国外很多人使用这个数据库。
- https://github.com/bmizerany/pq 支持database/sql驱动纯Go写的
- https://github.com/jbarham/gopgsqldriver 支持database/sql驱动纯Go写的
- https://github.com/lxn/go-pgsql 支持database/sql驱动纯Go写的
这里演示我采用了第一个驱动这个库目前在Go里面使用的人多在github上也比较活跃。
##实例代码
数据库建表语句:
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);
CREATE TABLE userdeatail
(
uid integer,
intro character varying(100),
profile character varying(100)
)
WITH(OIDS=FALSE);
看下面这个Go如何操作数据库表数据:增删改查
package main
import (
"database/sql"
"fmt"
_ "github.com/bmizerany/pq"
)
func main() {
db, err := sql.Open("postgres", "user=astaxie password=astaxie dbname=test sslmode=disable")
checkErr(err)
//插入数据
stmt, errs := db.Prepare("INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3) RETURNING uid")
checkErr(errs)
res, errres := stmt.Exec("astaxie", "研发部门", "2012-12-09")
checkErr(errres)
//pg不支持这个函数因为他没有类似MySQL的自增ID
id, errid := res.LastInsertId()
checkErr(errid)
fmt.Println(id)
//更新数据
stmt, errs = db.Prepare("update userinfo set username=$1 where uid=$2")
checkErr(errs)
res, errres = stmt.Exec("astaxieupdate", 1)
checkErr(errres)
affect, erraff := res.RowsAffected()
checkErr(erraff)
fmt.Println(affect)
//查询数据
rows, errrow := db.Query("SELECT * FROM userinfo")
checkErr(errrow)
for rows.Next() {
var uid int
var username string
var department string
var created string
err = rows.Scan(&uid, &username, &department, &created)
checkErr(err)
fmt.Println(uid)
fmt.Println(username)
fmt.Println(department)
fmt.Println(created)
}
//删除数据
stmt, errrow = db.Prepare("delete from userinfo where uid=$1")
checkErr(errrow)
res, errres = stmt.Exec(1)
checkErr(errres)
affect, erraff = res.RowsAffected()
checkErr(erraff)
fmt.Println(affect)
}
func checkErr(err error) {
if err != nil {
panic(err)
}
}
上面的代码我们可以看到PostgreSQL传递参数是通过`$1`,`$2`这种方式来指定要传递的参数而不是MySQL中的`?`,所以在处理的时候稍微有点不一样。还有pg不支持LastInsertId函数因为PostgreSQL内部没有实现类似MySQL的自增ID返回其他的代码几乎是一模一样。
## links
* [目录](<preface.md>)
* 上一节: [使用SQLite数据库](<5.3.md>)
* 下一节: [使用beedb库进行ORM开发](<5.5.md>)
## LastModified
* $Id$