5.4 使用PostgreSQL数据库

    PostgreSQL和MySQL比较,它更加庞大一点,因为它是用来替代Oracle而设计的。所以在企业应用中采用PostgreSQL是一个明智的选择。

    MySQL被Oracle收购之后正在逐步的封闭(自MySQL 5.5.31以后的所有版本将不再遵循GPL协议),鉴于此,将来我们也许会选择PostgreSQL而不是MySQL作为项目的后端数据库。

    在下面的示例中我采用了第一个驱动,因为它目前使用的人最多,在github上也比较活跃。

    数据库建表语句:

    1. package main
    2. import (
    3. "database/sql"
    4. "fmt"
    5. _ "github.com/lib/pq"
    6. )
    7. func main() {
    8. db, err := sql.Open("postgres", "user=astaxie password=astaxie dbname=test sslmode=disable")
    9. checkErr(err)
    10. //插入数据
    11. stmt, err := db.Prepare("INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3) RETURNING uid")
    12. checkErr(err)
    13. res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09")
    14. checkErr(err)
    15. //pg不支持这个函数,因为他没有类似MySQL的自增ID
    16. // id, err := res.LastInsertId()
    17. // fmt.Println(id)
    18. var lastInsertId int
    19. err = db.QueryRow("INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3) returning uid;", "astaxie", "研发部门", "2012-12-09").Scan(&lastInsertId)
    20. fmt.Println("最后插入id =", lastInsertId)
    21. //更新数据
    22. stmt, err = db.Prepare("update userinfo set username=$1 where uid=$2")
    23. checkErr(err)
    24. res, err = stmt.Exec("astaxieupdate", 1)
    25. checkErr(err)
    26. affect, err := res.RowsAffected()
    27. checkErr(err)
    28. fmt.Println(affect)
    29. //查询数据
    30. rows, err := db.Query("SELECT * FROM userinfo")
    31. checkErr(err)
    32. for rows.Next() {
    33. var uid int
    34. var username string
    35. var department string
    36. var created string
    37. checkErr(err)
    38. fmt.Println(uid)
    39. fmt.Println(department)
    40. fmt.Println(created)
    41. }
    42. //删除数据
    43. stmt, err = db.Prepare("delete from userinfo where uid=$1")
    44. checkErr(err)
    45. res, err = stmt.Exec(1)
    46. checkErr(err)
    47. affect, err = res.RowsAffected()
    48. checkErr(err)
    49. fmt.Println(affect)
    50. db.Close()
    51. }
    52. func checkErr(err error) {
    53. if err != nil {
    54. panic(err)
    55. }
    56. }

    从上面的代码我们可以看到,PostgreSQL是通过$1,$2这种方式来指定要传递的参数,而不是MySQL中的,另外在sql.Open中的dsn信息的格式也与MySQL的驱动中的dsn格式不一样,所以在使用时请注意它们的差异。

    还有pg不支持LastInsertId函数,因为PostgreSQL内部没有实现类似MySQL的自增ID返回,其他的代码几乎是一模一样。

    • 上一节: