6、golang程序开发

6.1、连接数据库

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/jackc/pgx"
  6. )
  7. func main() {
  8. var error_msg string
  9. //连接数据库
  10. conn, err := db_connect()
  11. if err != nil {
  12. error_msg = "连接数据库失败,详情:" + err.Error()
  13. write_log("Error", error_msg)
  14. return
  15. }
  16. //程序运行结束时关闭连接
  17. defer conn.Close()
  18. write_log("Log", "连接数据库成功")
  19. }
  20. /*
  21. 功能描述:写入日志处理
  22. 参数说明:
  23. log_level -- 日志级别,只能是是Error或Log
  24. error_msg -- 日志内容
  25. 返回值说明:无
  26. */
  27. func write_log(log_level string, error_msg string) {
  28. //打印错误信息
  29. fmt.Println("访问时间:", time.Now().Format("2006-01-02 15:04:05"))
  30. fmt.Println("日志级别:", log_level)
  31. fmt.Println("详细信息:", error_msg)
  32. }
  33. /*
  34. 功能描述:连接数据库
  35. 参数说明:无
  36. 返回值说明:
  37. conn *pgx.Conn -- 连接信息
  38. err error --错误信息
  39. */
  40. func db_connect() (conn *pgx.Conn, err error) {
  41. var config pgx.ConnConfig
  42. config.Host = "127.0.0.1" //数据库主机host或ip
  43. config.User = "tbase" //连接用户
  44. config.Password = "pgsql" //用户密码
  45. config.Database = "postgres" //连接数据库名
  46. config.Port = 15432 //端口号
  47. conn, err = pgx.Connect(config)
  48. return conn, err
  49. }
  1. [root@VM_0_29_centos tbase]# go run conn.go
  2. 访问时间: 2018-04-03 20:40:28
  3. 日志级别: Log
  4. 详细信息: 连接数据库成功

编译后运行

  1. [root@VM_0_29_centos tbase]# go build conn.go
  2. [root@VM_0_29_centos tbase]# ./conn
  3. 访问时间: 2018-04-03 20:40:48
  4. 日志级别: Log
  5. 详细信息: 连接数据库成功

6.2、创建数据表

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/jackc/pgx"
  6. )
  7. func main() {
  8. var error_msg string
  9. var sql string
  10. //连接数据库
  11. conn, err := db_connect()
  12. if err != nil {
  13. error_msg = "连接数据库失败,详情:" + err.Error()
  14. write_log("Error", error_msg)
  15. return
  16. }
  17. //程序运行结束时关闭连接
  18. defer conn.Close()
  19. write_log("Log", "连接数据库成功")
  20. //建立数据表
  21. sql = "create table public.tbase(id varchar(20),nickname varchar(100)) distribute by shard(id) to group default_group;"
  22. _, err = conn.Exec(sql)
  23. if err != nil {
  24. error_msg = "创建数据表失败,详情:" + err.Error()
  25. write_log("Error", error_msg)
  26. return
  27. } else {
  28. write_log("Log", "创建数据表成功")
  29. }
  30. }
  31. /*
  32. 功能描述:写入日志处理
  33. 参数说明:
  34. log_level -- 日志级别,只能是是Error或Log
  35. error_msg -- 日志内容
  36. 返回值说明:无
  37. */
  38. func write_log(log_level string, error_msg string) {
  39. //打印错误信息
  40. fmt.Println("访问时间:", time.Now().Format("2006-01-02 15:04:05"))
  41. fmt.Println("日志级别:", log_level)
  42. fmt.Println("详细信息:", error_msg)
  43. }
  44. /*
  45. 功能描述:连接数据库
  46. 参数说明:无
  47. 返回值说明:
  48. conn *pgx.Conn -- 连接信息
  49. err error --错误信息
  50. */
  51. func db_connect() (conn *pgx.Conn, err error) {
  52. var config pgx.ConnConfig
  53. config.Host = "127.0.0.1" //数据库主机host或ip
  54. config.User = "tbase" //连接用户
  55. config.Password = "pgsql" //用户密码
  56. config.Database = "postgres" //连接数据库名
  57. config.Port = 15432 //端口号
  58. conn, err = pgx.Connect(config)
  59. return conn, err
  60. }
  1. [root@VM_0_29_centos tbase]# go run createtable.go
  2. 访问时间: 2018-04-03 20:50:24
  3. 日志级别: Log
  4. 详细信息: 连接数据库成功
  5. 访问时间: 2018-04-03 20:50:24
  6. 日志级别: Log
  7. 详细信息: 创建数据表成功

6.3、插入数据

  1. package main
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. "github.com/jackc/pgx"
  7. )
  8. func main() {
  9. var error_msg string
  10. var sql string
  11. var nickname string
  12. //连接数据库
  13. conn, err := db_connect()
  14. if err != nil {
  15. error_msg = "连接数据库失败,详情:" + err.Error()
  16. write_log("Error", error_msg)
  17. return
  18. }
  19. //程序运行结束时关闭连接
  20. defer conn.Close()
  21. write_log("Log", "连接数据库成功")
  22. //插入数据
  23. sql = "insert into public.tbase values('1','tbase'),('2','pgxz');"
  24. _, err = conn.Exec(sql)
  25. if err != nil {
  26. error_msg = "插入数据失败,详情:" + err.Error()
  27. write_log("Error", error_msg)
  28. return
  29. } else {
  30. write_log("Log", "插入数据成功")
  31. }
  32. //绑定变量插入数据,不需要做防注入处理
  33. sql = "insert into public.tbase values($1,$2),($1,$3);"
  34. _, err = conn.Exec(sql, "3", "postgresql", "postgres")
  35. if err != nil {
  36. error_msg = "插入数据失败,详情:" + err.Error()
  37. write_log("Error", error_msg)
  38. return
  39. } else {
  40. write_log("Log", "插入数据成功")
  41. }
  42. //拼接sql语句插入数据,需要做防注入处理
  43. nickname = "TBase is ' good!"
  44. sql = "insert into public.tbase values('1','" + sql_data_encode(nickname) + "')"
  45. _, err = conn.Exec(sql)
  46. if err != nil {
  47. error_msg = "插入数据失败,详情:" + err.Error()
  48. write_log("Error", error_msg)
  49. return
  50. } else {
  51. write_log("Log", "插入数据成功")
  52. }
  53. }
  54. /*
  55. 功能描述:sql查询拼接字符串编码
  56. 参数说明:
  57. str -- 要编码的字符串
  58. 返回值说明:
  59. 返回编码过的字符串
  60. */
  61. func sql_data_encode(str string) string {
  62. return strings.Replace(str, "'", "''", -1)
  63. }
  64. /*
  65. 功能描述:写入日志处理
  66. 参数说明:
  67. log_level -- 日志级别,只能是是Error或Log
  68. error_msg -- 日志内容
  69. 返回值说明:无
  70. */
  71. func write_log(log_level string, error_msg string) {
  72. //打印错误信息
  73. fmt.Println("访问时间:", time.Now().Format("2006-01-02 15:04:05"))
  74. fmt.Println("日志级别:", log_level)
  75. fmt.Println("详细信息:", error_msg)
  76. }
  77. /*
  78. 功能描述:连接数据库
  79. 参数说明:无
  80. 返回值说明:
  81. conn *pgx.Conn -- 连接信息
  82. err error --错误信息
  83. */
  84. func db_connect() (conn *pgx.Conn, err error) {
  85. var config pgx.ConnConfig
  86. config.Host = "127.0.0.1" //数据库主机host或ip
  87. config.User = "tbase" //连接用户
  88. config.Password = "pgsql" //用户密码
  89. config.Database = "postgres" //连接数据库名
  90. config.Port = 15432 //端口号
  91. conn, err = pgx.Connect(config)
  92. return conn, err
  93. }
  1. [root@VM_0_29_centos tbase]# go run insert.go
  2. 访问时间: 2018-04-03 21:05:51
  3. 日志级别: Log
  4. 详细信息: 连接数据库成功
  5. 访问时间: 2018-04-03 21:05:51
  6. 日志级别: Log
  7. 详细信息: 插入数据成功
  8. 访问时间: 2018-04-03 21:05:51
  9. 日志级别: Log
  10. 详细信息: 插入数据成功
  11. 访问时间: 2018-04-03 21:05:51
  12. 日志级别: Log
  13. 详细信息: 插入数据成功

6.4、查询数据

  1. package main
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. "github.com/jackc/pgx"
  7. )
  8. func main() {
  9. var error_msg string
  10. var sql string
  11. //连接数据库
  12. conn, err := db_connect()
  13. if err != nil {
  14. error_msg = "连接数据库失败,详情:" + err.Error()
  15. write_log("Error", error_msg)
  16. return
  17. }
  18. //程序运行结束时关闭连接
  19. defer conn.Close()
  20. write_log("Log", "连接数据库成功")
  21. sql = "SELECT id,nickname FROM public.tbase LIMIT 2"
  22. rows, err := conn.Query(sql)
  23. if err != nil {
  24. error_msg = "查询数据失败,详情:" + err.Error()
  25. write_log("Error", error_msg)
  26. return
  27. } else {
  28. write_log("Log", "查询数据成功")
  29. }
  30. var nickname string
  31. var id string
  32. for rows.Next() {
  33. err = rows.Scan(&id, &nickname)
  34. if err != nil {
  35. error_msg = "执行查询失败,详情:" + err.Error()
  36. write_log("Error", error_msg)
  37. return
  38. }
  39. error_msg = fmt.Sprintf("id:%s nickname:%s", id, nickname)
  40. write_log("Log", error_msg)
  41. }
  42. rows.Close()
  43. nickname = "tbase"
  44. sql = "SELECT id,nickname FROM public.tbase WHERE nickname ='" + sql_data_encode(nickname) + "' "
  45. rows, err = conn.Query(sql)
  46. if err != nil {
  47. error_msg = "查询数据失败,详情:" + err.Error()
  48. write_log("Error", error_msg)
  49. return
  50. } else {
  51. write_log("Log", "查询数据成功")
  52. }
  53. defer rows.Close()
  54. for rows.Next() {
  55. err = rows.Scan(&id, &nickname)
  56. if err != nil {
  57. error_msg = "执行查询失败,详情:" + err.Error()
  58. write_log("Error", error_msg)
  59. return
  60. }
  61. error_msg = fmt.Sprintf("id:%s nickname:%s", id, nickname)
  62. write_log("Log", error_msg)
  63. }
  64. }
  65. /*
  66. 功能描述:sql查询拼接字符串编码
  67. 参数说明:
  68. str -- 要编码的字符串
  69. 返回值说明:
  70. 返回编码过的字符串
  71. */
  72. func sql_data_encode(str string) string {
  73. return strings.Replace(str, "'", "''", -1)
  74. }
  75. /*
  76. 功能描述:写入日志处理
  77. 参数说明:
  78. log_level -- 日志级别,只能是是Error或Log
  79. error_msg -- 日志内容
  80. 返回值说明:无
  81. */
  82. func write_log(log_level string, error_msg string) {
  83. //打印错误信息
  84. fmt.Println("访问时间:", time.Now().Format("2006-01-02 15:04:05"))
  85. fmt.Println("日志级别:", log_level)
  86. fmt.Println("详细信息:", error_msg)
  87. }
  88. /*
  89. 功能描述:连接数据库
  90. 参数说明:无
  91. 返回值说明:
  92. conn *pgx.Conn -- 连接信息
  93. err error --错误信息
  94. */
  95. func db_connect() (conn *pgx.Conn, err error) {
  96. var config pgx.ConnConfig
  97. config.Host = "127.0.0.1" //数据库主机host或ip
  98. config.User = "tbase" //连接用户
  99. config.Password = "pgsql" //用户密码
  100. config.Database = "postgres" //连接数据库名
  101. config.Port = 15432 //端口号
  102. conn, err = pgx.Connect(config)
  103. return conn, err
  104. }
  1. [root@VM_0_29_centos tbase]# go run select.go
  2. 访问时间: 2018-04-09 10:35:50
  3. 日志级别: Log
  4. 详细信息: 连接数据库成功
  5. 访问时间: 2018-04-09 10:35:50
  6. 日志级别: Log
  7. 详细信息: 查询数据成功
  8. 访问时间: 2018-04-09 10:35:50
  9. 日志级别: Log
  10. 详细信息: id2 nicknametbase
  11. 访问时间: 2018-04-09 10:35:50
  12. 日志级别: Log
  13. 详细信息: id3 nicknamepostgresql
  14. 访问时间: 2018-04-09 10:35:50
  15. 日志级别: Log
  16. 详细信息: 查询数据成功
  17. 访问时间: 2018-04-09 10:35:50
  18. 日志级别: Log
  19. 详细信息: id1 nicknametbase

6.5、流数据copy from入表

  1. package main
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "time"
  6. "github.com/jackc/pgx"
  7. )
  8. func main() {
  9. var error_msg string
  10. //连接数据库
  11. conn, err := db_connect()
  12. if err != nil {
  13. error_msg = "连接数据库失败,详情:" + err.Error()
  14. write_log("Error", error_msg)
  15. return
  16. }
  17. //程序运行结束时关闭连接
  18. defer conn.Close()
  19. write_log("Log", "连接数据库成功")
  20. //构造5000行数据
  21. inputRows := [][]interface{}{}
  22. var id string
  23. var nickname string
  24. for i := 0; i < 5000; i++ {
  25. id = fmt.Sprintf("%d", rand.Intn(10000))
  26. nickname = fmt.Sprintf("%d", rand.Intn(10000))
  27. inputRows = append(inputRows, []interface{}{id, nickname})
  28. }
  29. copyCount, err := conn.CopyFrom(pgx.Identifier{"tbase"}, []string{"id", "nickname"}, pgx.CopyFromRows(inputRows))
  30. if err != nil {
  31. error_msg = "执行copyFrom失败,详情:" + err.Error()
  32. write_log("Error", error_msg)
  33. return
  34. }
  35. if copyCount != len(inputRows) {
  36. error_msg = fmt.Sprintf("执行copyFrom失败,copy行数:%d 返回行数为:%d", len(inputRows), copyCount)
  37. write_log("Error", error_msg)
  38. return
  39. } else {
  40. error_msg = "Copy 记录成功"
  41. write_log("Log", error_msg)
  42. }
  43. }
  44. /*
  45. 功能描述:写入日志处理
  46. 参数说明:
  47. log_level -- 日志级别,只能是是Error或Log
  48. error_msg -- 日志内容
  49. 返回值说明:无
  50. */
  51. func write_log(log_level string, error_msg string) {
  52. //打印错误信息
  53. fmt.Println("访问时间:", time.Now().Format("2006-01-02 15:04:05"))
  54. fmt.Println("日志级别:", log_level)
  55. fmt.Println("详细信息:", error_msg)
  56. }
  57. /*
  58. 功能描述:连接数据库
  59. 参数说明:无
  60. 返回值说明:
  61. conn *pgx.Conn -- 连接信息
  62. err error --错误信息
  63. */
  64. func db_connect() (conn *pgx.Conn, err error) {
  65. var config pgx.ConnConfig
  66. config.Host = "127.0.0.1" //数据库主机host或ip
  67. config.User = "tbase" //连接用户
  68. config.Password = "pgsql" //用户密码
  69. config.Database = "postgres" //连接数据库名
  70. config.Port = 15432 //端口号
  71. conn, err = pgx.Connect(config)
  72. return conn, err
  73. }
  1. [root@VM_0_29_centos tbase]# go run copy_from.go
  2. 访问时间: 2018-04-09 10:36:40
  3. 日志级别: Log
  4. 详细信息: 连接数据库成功
  5. 访问时间: 2018-04-09 10:36:40
  6. 日志级别: Log
  7. 详细信息: Copy 记录成功

6.6、golang相关资源包

需要git的资源包:https://github.com/jackc/pgxhttps://github.com/pkg/errors