base_db.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. // Copyright (c) [2022] [巴拉迪维 BaratSemet]
  2. // [ohUrlShortener] is licensed under Mulan PSL v2.
  3. // You can use this software according to the terms and conditions of the Mulan PSL v2.
  4. // You may obtain a copy of Mulan PSL v2 at:
  5. // http://license.coscl.org.cn/MulanPSL2
  6. // THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
  7. // See the Mulan PSL v2 for more details.
  8. package storage
  9. import (
  10. "database/sql"
  11. "fmt"
  12. "github.com/jmoiron/sqlx"
  13. _ "github.com/lib/pq"
  14. "ohurlshortener/utils"
  15. )
  16. var dbService = &DatabaseService{}
  17. // DatabaseService 数据库服务
  18. type DatabaseService struct {
  19. Connection *sqlx.DB
  20. }
  21. // InitDatabaseService 初始化数据库服务
  22. func InitDatabaseService() (*DatabaseService, error) {
  23. connStr := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",
  24. utils.DatabaseConfig.Host, utils.DatabaseConfig.Port, utils.DatabaseConfig.User,
  25. utils.DatabaseConfig.Password, utils.DatabaseConfig.DbName)
  26. conn, err := sqlx.Connect("postgres", connStr)
  27. if err != nil {
  28. return dbService, err
  29. }
  30. conn.SetMaxOpenConns(utils.DatabaseConfig.MaxOpenConns)
  31. conn.SetMaxIdleConns(utils.DatabaseConfig.MaxIdleConn)
  32. conn.SetConnMaxLifetime(0) // always REUSE
  33. dbService.Connection = conn
  34. return dbService, nil
  35. }
  36. // DbNamedExec 执行带有命名参数的sql语句
  37. func DbNamedExec(query string, args interface{}) error {
  38. _, err := dbService.Connection.NamedExec(query, args)
  39. return err
  40. }
  41. // DbExecTx 执行事务
  42. func DbExecTx(query ...string) error {
  43. tx := dbService.Connection.MustBegin()
  44. for _, s := range query {
  45. tx.MustExec(s)
  46. } // end of for
  47. err := tx.Commit()
  48. if err != nil {
  49. return tx.Rollback()
  50. }
  51. return nil
  52. } // end of func
  53. //
  54. // func DbExecTx(query string, args ...interface{}) error {
  55. // tx, err := dbService.Connection.Begin()
  56. // if err != nil {
  57. // return err
  58. // }
  59. // defer tx.Commit()
  60. //
  61. // stmt, err := tx.Prepare(dbService.Connection.Rebind(query))
  62. // if err != nil {
  63. // return err
  64. // }
  65. // defer stmt.Close()
  66. //
  67. // _, err = stmt.Exec(args...)
  68. // if err != nil {
  69. // return err
  70. // }
  71. //
  72. // return nil
  73. // }
  74. // DbGet 获取单条记录
  75. func DbGet(query string, dest interface{}, args ...interface{}) error {
  76. err := dbService.Connection.Get(dest, query, args...)
  77. if err == sql.ErrNoRows {
  78. return nil
  79. }
  80. return err
  81. }
  82. // DbSelect 获取多条记录
  83. func DbSelect(query string, dest interface{}, args ...interface{}) error {
  84. return dbService.Connection.Select(dest, query, args...)
  85. }
  86. // DbClose 关闭数据库连接
  87. func DbClose() {
  88. dbService.Connection.Close()
  89. }