db.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. package db
  2. import (
  3. "database/sql"
  4. "errors"
  5. "fmt"
  6. "sync"
  7. "time"
  8. // PostgreSQL
  9. _ "github.com/lib/pq"
  10. // MySQL
  11. //_ "github.com/go-sql-driver/mysql"
  12. "github.com/jmoiron/sqlx"
  13. )
  14. var (
  15. config Config
  16. db *sqlx.DB
  17. err error
  18. once sync.Once
  19. defaultDB *DB
  20. )
  21. // DB define
  22. type DB struct {
  23. Driver string
  24. conn *sqlx.DB
  25. tx *sqlx.Tx
  26. }
  27. // SetConfig set
  28. func SetConfig(cfg Config) {
  29. config.Driver = cfg.Driver
  30. config.DNS = cfg.DNS
  31. config.MaxOpenConns = cfg.MaxOpenConns
  32. config.MaxIdle = cfg.MaxIdle
  33. config.MaxLifetime = cfg.MaxLifetime * time.Second
  34. defaultDB = &DB{Driver: config.Driver}
  35. }
  36. // New new DB object
  37. func New() *DB {
  38. return &DB{Driver: config.Driver}
  39. }
  40. // Release free db connect
  41. func Release() {
  42. if db != nil {
  43. db.Close()
  44. }
  45. }
  46. // NewConfig new DB dynamic object
  47. func NewConfig(config Config) (dbx *DB, err error) {
  48. //dbx = &DB{}
  49. dbx.Driver = config.Driver
  50. dbx.conn, err = sqlx.Connect(config.Driver, config.DNS)
  51. if err != nil {
  52. return
  53. }
  54. dbx.conn.SetMaxOpenConns(config.MaxOpenConns)
  55. dbx.conn.SetMaxIdleConns(config.MaxIdle)
  56. dbx.conn.SetConnMaxLifetime(config.MaxLifetime)
  57. dbx.conn.Ping()
  58. return
  59. }
  60. // ReleaseConfig free db connect
  61. func ReleaseConfig(dbx *DB) {
  62. if dbx.conn != nil {
  63. dbx.conn.Close()
  64. }
  65. }
  66. func connect() (dbx *sqlx.DB, err error) {
  67. once.Do(func() {
  68. db, err = sqlx.Connect(config.Driver, config.DNS)
  69. if err == nil {
  70. db.DB.SetMaxOpenConns(config.MaxOpenConns)
  71. db.DB.SetMaxIdleConns(config.MaxIdle)
  72. db.DB.SetConnMaxLifetime(config.MaxLifetime)
  73. err = db.Ping()
  74. }
  75. })
  76. dbx = db
  77. return
  78. }
  79. // Stats Stats returns database statistics.
  80. func (d *DB) Stats() (s sql.DBStats) {
  81. s = d.conn.DB.Stats()
  82. return
  83. }
  84. // Connect connect to database
  85. func (d *DB) Connect() (err error) {
  86. if d.conn != nil {
  87. return
  88. }
  89. d.conn, err = connect()
  90. return
  91. }
  92. // Close close database connect
  93. func (d *DB) Close() {
  94. // use pool
  95. //d.conn.Close()
  96. }
  97. // Ping Ping connect
  98. func (d *DB) Ping() (err error) {
  99. d.conn, err = connect()
  100. if err != nil {
  101. return
  102. }
  103. return d.conn.Ping()
  104. }
  105. // BeginTrans begin trans
  106. func (d *DB) BeginTrans() (err error) {
  107. d.conn, err = connect()
  108. if err != nil {
  109. return
  110. }
  111. d.tx = d.conn.MustBegin()
  112. return
  113. }
  114. // Commit commit
  115. func (d *DB) Commit() error {
  116. return d.tx.Commit()
  117. }
  118. // Rollback rollback
  119. func (d *DB) Rollback() error {
  120. return d.tx.Rollback()
  121. }
  122. // TransExec trans execute
  123. func (d *DB) TransExec(query string, args interface{}) (LastInsertId, RowsAffected int64, err error) {
  124. if rs, err := d.tx.NamedExec(query, args); err == nil {
  125. RowsAffected, _ = rs.RowsAffected()
  126. LastInsertId, _ = rs.LastInsertId()
  127. }
  128. return
  129. }
  130. // TransUpdate trans update
  131. func (d *DB) TransUpdate(query string, args interface{}) (reply Reply) {
  132. var (
  133. err error
  134. rs sql.Result
  135. )
  136. if rs, err = d.tx.NamedExec(query, args); err == nil {
  137. a, _ := rs.RowsAffected()
  138. reply = ReplyOk(a, 0)
  139. } else {
  140. reply = ReplyFaild(ErrException, err, errors.New(`数据执行错误`))
  141. }
  142. return
  143. }
  144. // TransRow trans get row
  145. func (d *DB) TransRow(dest interface{}, query string, args interface{}) error {
  146. nstmt, err := d.tx.PrepareNamed(query)
  147. if err != nil {
  148. return err
  149. }
  150. defer nstmt.Close()
  151. err = nstmt.Get(dest, args)
  152. //err = d.tx.Get(dest, query, args)
  153. return err
  154. }
  155. // Select select
  156. func (d *DB) Select(dest interface{}, query string, args ...interface{}) error {
  157. err := d.Connect()
  158. if err != nil {
  159. return err
  160. }
  161. defer d.Close()
  162. err = d.conn.Select(dest, query, args...)
  163. return err
  164. }
  165. // Rows get rows
  166. func (d *DB) Rows(dest interface{}, query string, args interface{}) error {
  167. err := d.Connect()
  168. if err != nil {
  169. return err
  170. }
  171. defer d.Close()
  172. nstmt, err := d.conn.PrepareNamed(query)
  173. if err != nil {
  174. return err
  175. }
  176. defer nstmt.Close()
  177. err = nstmt.Select(dest, args)
  178. return err
  179. }
  180. // Get get
  181. func (d *DB) Get(dest interface{}, query string, args ...interface{}) error {
  182. err := d.Connect()
  183. if err != nil {
  184. return err
  185. }
  186. defer d.Close()
  187. err = d.conn.Get(dest, query, args...)
  188. return err
  189. }
  190. // Row get row
  191. func (d *DB) Row(dest interface{}, query string, args interface{}) error {
  192. err := d.Connect()
  193. if err != nil {
  194. return err
  195. }
  196. defer d.Close()
  197. nstmt, err := d.conn.PrepareNamed(query)
  198. if err != nil {
  199. return err
  200. }
  201. defer nstmt.Close()
  202. err = nstmt.Get(dest, args)
  203. return err
  204. }
  205. // InsertReply insert and return DbReply
  206. func (d *DB) InsertReply(query string, args interface{}) (reply Reply) {
  207. var (
  208. err error
  209. rs sql.Result
  210. )
  211. err = d.Connect()
  212. if err != nil {
  213. reply = ReplyFaild(ErrNotConnect, err, errors.New(`数据库连接错误`))
  214. return
  215. }
  216. defer d.Close()
  217. if rs, err = d.conn.NamedExec(query, args); err == nil {
  218. a, _ := rs.RowsAffected()
  219. n, _ := rs.LastInsertId()
  220. reply = ReplyOk(a, n)
  221. } else {
  222. reply = ReplyFaild(ErrException, err, errors.New(`数据执行错误`))
  223. }
  224. return
  225. }
  226. // UpdateReply update/delete and return DbReply
  227. func (d *DB) UpdateReply(query string, args interface{}) (reply Reply) {
  228. var (
  229. err error
  230. rs sql.Result
  231. )
  232. err = d.Connect()
  233. if err != nil {
  234. reply = ReplyFaild(ErrNotConnect, err, errors.New(`数据库连接错误`))
  235. return
  236. }
  237. defer d.Close()
  238. if rs, err = d.conn.NamedExec(query, args); err == nil {
  239. a, _ := rs.RowsAffected()
  240. reply = ReplyOk(a, 0)
  241. } else {
  242. reply = ReplyFaild(ErrException, err, errors.New(`数据执行错误`))
  243. }
  244. return
  245. }
  246. // Insert insert into
  247. func (d *DB) Insert(query string, args interface{}) (LastInsertId, RowsAffected int64, err error) {
  248. err = d.Connect()
  249. if err != nil {
  250. return
  251. }
  252. defer d.Close()
  253. var rs sql.Result
  254. if rs, err = d.conn.NamedExec(query, args); err == nil {
  255. LastInsertId, _ = rs.LastInsertId()
  256. RowsAffected, _ = rs.RowsAffected()
  257. }
  258. return
  259. }
  260. // Update update/delete
  261. func (d *DB) Update(query string, args interface{}) (RowsAffected int64, err error) {
  262. err = d.Connect()
  263. if err != nil {
  264. return
  265. }
  266. defer d.Close()
  267. var rs sql.Result
  268. if rs, err = d.conn.NamedExec(query, args); err == nil {
  269. RowsAffected, _ = rs.RowsAffected()
  270. }
  271. return
  272. }
  273. // Exec exec
  274. func (d *DB) Exec(query string, args ...interface{}) (LastInsertId, RowsAffected int64, err error) {
  275. err = d.Connect()
  276. if err != nil {
  277. return
  278. }
  279. defer d.Close()
  280. var rs sql.Result
  281. if rs, err = d.conn.Exec(query, args...); err == nil {
  282. LastInsertId, _ = rs.LastInsertId()
  283. RowsAffected, _ = rs.RowsAffected()
  284. }
  285. return
  286. }
  287. // Limit MySQL limit
  288. func (d *DB) Limit(page, pagesize int) string {
  289. // MySQL limit 0, size
  290. if d.Driver == `mysql` {
  291. return fmt.Sprintf(" limit %d, %d", (page-1)*pagesize, pagesize)
  292. }
  293. // // PostgreSQL limit size offset 0
  294. return fmt.Sprintf(" limit %d offset %d", pagesize, (page-1)*pagesize)
  295. }
  296. // Ping ping connect
  297. func Ping() (err error) {
  298. defaultDB.conn, err = connect()
  299. if err != nil {
  300. return
  301. }
  302. err = defaultDB.Ping()
  303. return
  304. }
  305. // Select select
  306. func Select(dest interface{}, query string, args ...interface{}) (err error) {
  307. defaultDB.conn, err = connect()
  308. if err != nil {
  309. return err
  310. }
  311. err = defaultDB.conn.Select(dest, query, args...)
  312. return
  313. }
  314. // Rows get rows
  315. func Rows(dest interface{}, query string, args interface{}) (err error) {
  316. defaultDB.conn, err = connect()
  317. if err != nil {
  318. return err
  319. }
  320. nstmt, err := defaultDB.conn.PrepareNamed(query)
  321. if err != nil {
  322. return
  323. }
  324. defer nstmt.Close()
  325. err = nstmt.Select(dest, args)
  326. return
  327. }
  328. // Get get
  329. func Get(dest interface{}, query string, args ...interface{}) (err error) {
  330. defaultDB.conn, err = connect()
  331. if err != nil {
  332. return
  333. }
  334. err = defaultDB.conn.Get(dest, query, args...)
  335. return
  336. }
  337. // Row get row
  338. func Row(dest interface{}, query string, args interface{}) (err error) {
  339. defaultDB.conn, err = connect()
  340. if err != nil {
  341. return
  342. }
  343. nstmt, err := defaultDB.conn.PrepareNamed(query)
  344. if err != nil {
  345. return err
  346. }
  347. defer nstmt.Close()
  348. err = nstmt.Get(dest, args)
  349. return
  350. }
  351. func Exec(query string, args ...interface{}) (LastInsertId, RowsAffected int64, err error) {
  352. defaultDB.conn, err = connect()
  353. if err != nil {
  354. return
  355. }
  356. LastInsertId, RowsAffected, err = defaultDB.Exec(query, args...)
  357. return
  358. }