db.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994
  1. package db
  2. import (
  3. "context"
  4. "database/sql"
  5. "errors"
  6. "fmt"
  7. "sync"
  8. "time"
  9. // PostgreSQL
  10. _ "github.com/lib/pq"
  11. // MySQL
  12. _ "github.com/go-sql-driver/mysql"
  13. "github.com/jmoiron/sqlx"
  14. _ "github.com/mattn/go-sqlite3"
  15. )
  16. var (
  17. config Config
  18. db *sqlx.DB
  19. //err error
  20. once sync.Once
  21. defaultDB *DB
  22. errNoneConnect = errors.New(`数据库连接错误`)
  23. )
  24. // DB define
  25. type DB struct {
  26. Driver string
  27. conn *sqlx.DB
  28. tx *sqlx.Tx
  29. }
  30. // Tx is an in-progress database transaction.
  31. type Tx struct {
  32. tx *sqlx.Tx
  33. }
  34. // SetConfig set
  35. func SetConfig(cfg Config) {
  36. config.Driver = cfg.Driver
  37. config.DNS = cfg.DNS
  38. config.MaxOpenConns = cfg.MaxOpenConns
  39. config.MaxIdle = cfg.MaxIdle
  40. config.MaxIdleTime = cfg.MaxIdleTime * time.Second
  41. config.MaxLifeTime = cfg.MaxLifeTime * time.Second
  42. defaultDB = &DB{Driver: config.Driver}
  43. }
  44. // New new DB object
  45. func New() *DB {
  46. return &DB{Driver: config.Driver}
  47. }
  48. // Release free db connect
  49. func Release() {
  50. if db != nil {
  51. db.Close()
  52. }
  53. }
  54. // NewConfig new DB dynamic object
  55. func NewConfig(config Config) (dbx *DB, err error) {
  56. dbx = &DB{}
  57. dbx.Driver = config.Driver
  58. dbx.conn, err = sqlx.Connect(config.Driver, config.DNS)
  59. if err != nil {
  60. return
  61. }
  62. dbx.conn.SetMaxOpenConns(config.MaxOpenConns)
  63. dbx.conn.SetMaxIdleConns(config.MaxIdle)
  64. dbx.conn.SetConnMaxIdleTime(config.MaxIdleTime)
  65. dbx.conn.SetConnMaxLifetime(config.MaxLifeTime)
  66. //err = dbx.conn.Ping()
  67. return
  68. }
  69. // ReleaseConfig free db connect
  70. func ReleaseConfig(dbx *DB) {
  71. if dbx.conn != nil {
  72. dbx.conn.Close()
  73. }
  74. }
  75. func connect() (dbx *sqlx.DB, err error) {
  76. once.Do(func() {
  77. db, err = sqlx.Connect(config.Driver, config.DNS)
  78. if err != nil {
  79. fmt.Println("Connect ERR", err)
  80. return
  81. }
  82. db.DB.SetMaxOpenConns(config.MaxOpenConns)
  83. db.DB.SetMaxIdleConns(config.MaxIdle)
  84. db.DB.SetConnMaxIdleTime(config.MaxIdleTime)
  85. db.DB.SetConnMaxLifetime(config.MaxLifeTime)
  86. /*
  87. err = db.Ping()
  88. if err != nil {
  89. fmt.Println("Connect Ping", err)
  90. return
  91. }
  92. // */
  93. })
  94. if db == nil {
  95. err = errNoneConnect
  96. return
  97. }
  98. dbx = db
  99. return
  100. }
  101. func connectContext(ctx context.Context) (dbx *sqlx.DB, err error) {
  102. once.Do(func() {
  103. db, err = sqlx.ConnectContext(ctx, config.Driver, config.DNS)
  104. if err != nil {
  105. fmt.Println("Connect ERR", err)
  106. return
  107. }
  108. db.DB.SetMaxOpenConns(config.MaxOpenConns)
  109. db.DB.SetMaxIdleConns(config.MaxIdle)
  110. db.DB.SetConnMaxIdleTime(config.MaxIdleTime)
  111. db.DB.SetConnMaxLifetime(config.MaxLifeTime)
  112. })
  113. if db == nil {
  114. err = errNoneConnect
  115. return
  116. }
  117. dbx = db
  118. return
  119. }
  120. // Stats Stats returns database statistics.
  121. func (d *DB) Stats() (s sql.DBStats) {
  122. s = d.conn.DB.Stats()
  123. return
  124. }
  125. // Connect connect to database
  126. func (d *DB) Connect() (err error) {
  127. if d.conn != nil {
  128. return
  129. }
  130. d.conn, err = connect()
  131. return
  132. }
  133. // ConnectContext connect to database
  134. func (d *DB) ConnectContext(ctx context.Context) (err error) {
  135. if d.conn != nil {
  136. return
  137. }
  138. d.conn, err = connectContext(ctx)
  139. return
  140. }
  141. // Close close database connect
  142. func (d *DB) Close() {
  143. // use pool
  144. //d.conn.Close()
  145. }
  146. // Ping Ping connect
  147. func (d *DB) Ping() (err error) {
  148. d.conn, err = connect()
  149. if err != nil {
  150. return
  151. }
  152. return d.conn.Ping()
  153. }
  154. // PingContext Ping connect
  155. func (d *DB) PingContext(ctx context.Context) (err error) {
  156. d.conn, err = connectContext(ctx)
  157. if err != nil {
  158. return
  159. }
  160. return d.conn.PingContext(ctx)
  161. }
  162. // BeginTrans begin trans
  163. func (d *DB) BeginTrans() (err error) {
  164. d.conn, err = connect()
  165. if err != nil {
  166. return
  167. }
  168. d.tx, err = d.conn.Beginx()
  169. return
  170. }
  171. // Begin starts a transaction. The default isolation level is dependent on the driver.
  172. func (d *DB) Begin() (tx *Tx, err error) {
  173. d.conn, err = connect()
  174. if err != nil {
  175. return
  176. }
  177. tx = &Tx{}
  178. tx.tx, err = d.conn.Beginx()
  179. return
  180. }
  181. // BeginTransx begin trans
  182. func (d *DB) BeginTransx(ctx context.Context, opts *sql.TxOptions) (err error) {
  183. d.conn, err = connectContext(ctx)
  184. if err != nil {
  185. return
  186. }
  187. d.tx, err = d.conn.BeginTxx(ctx, opts)
  188. return
  189. }
  190. // BeginTx starts a transaction.
  191. func (d *DB) BeginTx(ctx context.Context, opts *sql.TxOptions) (tx *Tx, err error) {
  192. d.conn, err = connectContext(ctx)
  193. if err != nil {
  194. return
  195. }
  196. tx = &Tx{}
  197. tx.tx, err = d.conn.BeginTxx(ctx, opts)
  198. return
  199. }
  200. // Commit commit
  201. func (d *DB) Commit() (err error) {
  202. return d.tx.Commit()
  203. }
  204. // Rollback rollback
  205. func (d *DB) Rollback() (err error) {
  206. return d.tx.Rollback()
  207. }
  208. // TransExec trans execute with named args
  209. func (d *DB) TransExec(query string, args interface{}) (LastInsertId, RowsAffected int64, err error) {
  210. var rs sql.Result
  211. if rs, err = d.tx.NamedExec(query, args); err == nil {
  212. RowsAffected, _ = rs.RowsAffected()
  213. LastInsertId, _ = rs.LastInsertId()
  214. }
  215. return
  216. }
  217. // TransExec trans execute with named args
  218. func (d *DB) TransExecContext(ctx context.Context, query string, args interface{}) (LastInsertId, RowsAffected int64, err error) {
  219. var rs sql.Result
  220. if rs, err = d.tx.NamedExecContext(ctx, query, args); err == nil {
  221. RowsAffected, _ = rs.RowsAffected()
  222. LastInsertId, _ = rs.LastInsertId()
  223. }
  224. return
  225. }
  226. // TransUpdate trans update
  227. func (d *DB) TransUpdate(query string, args interface{}) (reply Reply) {
  228. var (
  229. err error
  230. rs sql.Result
  231. )
  232. if rs, err = d.tx.NamedExec(query, args); err == nil {
  233. a, _ := rs.RowsAffected()
  234. reply = ReplyOk(a, 0)
  235. } else {
  236. reply = ReplyFaild(ErrException, err, errors.New(`数据执行错误`))
  237. }
  238. return
  239. }
  240. // TransRow trans get row
  241. func (d *DB) TransRow(dest interface{}, query string, args interface{}) (err error) {
  242. nstmt := new(sqlx.NamedStmt)
  243. nstmt, err = d.tx.PrepareNamed(query)
  244. if err != nil {
  245. return err
  246. }
  247. defer nstmt.Close()
  248. err = nstmt.Get(dest, args)
  249. //err = d.tx.Get(dest, query, args)
  250. return err
  251. }
  252. // Select select
  253. func (d *DB) Select(dest interface{}, query string, args ...interface{}) (err error) {
  254. err = d.Connect()
  255. if err != nil {
  256. return err
  257. }
  258. defer d.Close()
  259. err = d.conn.Select(dest, query, args...)
  260. return
  261. }
  262. // SelectContext select
  263. func (d *DB) SelectContext(ctx context.Context, dest interface{}, query string, args ...interface{}) (err error) {
  264. err = d.ConnectContext(ctx)
  265. if err != nil {
  266. return
  267. }
  268. defer d.Close()
  269. err = d.conn.SelectContext(ctx, dest, query, args...)
  270. return
  271. }
  272. // Query get rows with named args, Query executes a query that returns rows, typically a SELECT. The args are for any placeholder parameters in the query.
  273. func (d *DB) Query(dest interface{}, query string, args interface{}) (err error) {
  274. err = d.Connect()
  275. if err != nil {
  276. return err
  277. }
  278. defer d.Close()
  279. nstmt := new(sqlx.NamedStmt)
  280. nstmt, err = d.conn.PrepareNamed(query)
  281. if err != nil {
  282. return
  283. }
  284. defer nstmt.Close()
  285. err = nstmt.Select(dest, args)
  286. return
  287. }
  288. // QueryContext get rows with named args, QueryContext executes a query that returns rows, typically a SELECT. The args are for any placeholder parameters in the query.
  289. func (d *DB) QueryContext(ctx context.Context, dest interface{}, query string, args interface{}) (err error) {
  290. err = d.ConnectContext(ctx)
  291. if err != nil {
  292. return
  293. }
  294. defer d.Close()
  295. nstmt := new(sqlx.NamedStmt)
  296. nstmt, err = d.conn.PrepareNamedContext(ctx, query)
  297. if err != nil {
  298. return
  299. }
  300. defer nstmt.Close()
  301. err = nstmt.SelectContext(ctx, dest, args)
  302. return
  303. }
  304. // Rows get rows with named args
  305. func (d *DB) Rows(dest interface{}, query string, args interface{}) (err error) {
  306. err = d.Connect()
  307. if err != nil {
  308. return
  309. }
  310. defer d.Close()
  311. nstmt := new(sqlx.NamedStmt)
  312. nstmt, err = d.conn.PrepareNamed(query)
  313. if err != nil {
  314. return
  315. }
  316. defer nstmt.Close()
  317. err = nstmt.Select(dest, args)
  318. return
  319. }
  320. // RowsContext get rows with named args
  321. func (d *DB) RowsContext(ctx context.Context, dest interface{}, query string, args interface{}) (err error) {
  322. err = d.ConnectContext(ctx)
  323. if err != nil {
  324. return
  325. }
  326. defer d.Close()
  327. nstmt := new(sqlx.NamedStmt)
  328. nstmt, err = d.conn.PrepareNamedContext(ctx, query)
  329. if err != nil {
  330. return err
  331. }
  332. defer nstmt.Close()
  333. err = nstmt.SelectContext(ctx, dest, args)
  334. return
  335. }
  336. // QueryRow get row, QueryRow executes a query that is expected to return at most one row.
  337. func (d *DB) QueryRow(dest interface{}, query string, args ...interface{}) (err error) {
  338. err = d.Connect()
  339. if err != nil {
  340. return err
  341. }
  342. defer d.Close()
  343. err = d.conn.Get(dest, query, args...)
  344. return
  345. }
  346. // QueryRowContext get row, QueryRowContext executes a query that is expected to return at most one row.
  347. func (d *DB) QueryRowContext(ctx context.Context, dest interface{}, query string, args ...interface{}) (err error) {
  348. err = d.ConnectContext(ctx)
  349. if err != nil {
  350. return
  351. }
  352. defer d.Close()
  353. err = d.conn.GetContext(ctx, dest, query, args...)
  354. return
  355. }
  356. // Get get row, QueryRow executes a query that is expected to return at most one row.
  357. func (d *DB) Get(dest interface{}, query string, args ...interface{}) (err error) {
  358. err = d.Connect()
  359. if err != nil {
  360. return
  361. }
  362. defer d.Close()
  363. err = d.conn.Get(dest, query, args...)
  364. return
  365. }
  366. // GetContext get
  367. func (d *DB) GetContext(ctx context.Context, dest interface{}, query string, args ...interface{}) (err error) {
  368. err = d.ConnectContext(ctx)
  369. if err != nil {
  370. return
  371. }
  372. defer d.Close()
  373. err = d.conn.GetContext(ctx, dest, query, args...)
  374. return
  375. }
  376. // Row get row with named args
  377. func (d *DB) Row(dest interface{}, query string, args interface{}) (err error) {
  378. err = d.Connect()
  379. if err != nil {
  380. return
  381. }
  382. defer d.Close()
  383. nstmt := new(sqlx.NamedStmt)
  384. nstmt, err = d.conn.PrepareNamed(query)
  385. if err != nil {
  386. return
  387. }
  388. defer nstmt.Close()
  389. err = nstmt.Get(dest, args)
  390. return
  391. }
  392. // RowContext get row with named args
  393. func (d *DB) RowContext(ctx context.Context, dest interface{}, query string, args interface{}) (err error) {
  394. err = d.ConnectContext(ctx)
  395. if err != nil {
  396. return
  397. }
  398. defer d.Close()
  399. nstmt := new(sqlx.NamedStmt)
  400. nstmt, err = d.conn.PrepareNamedContext(ctx, query)
  401. if err != nil {
  402. return
  403. }
  404. defer nstmt.Close()
  405. err = nstmt.GetContext(ctx, dest, args)
  406. return
  407. }
  408. // InsertReply insert and return DbReply
  409. func (d *DB) InsertReply(query string, args interface{}) (reply Reply) {
  410. var (
  411. err error
  412. rs sql.Result
  413. )
  414. err = d.Connect()
  415. if err != nil {
  416. reply = ReplyFaild(ErrNotConnect, err, errors.New(`数据库连接错误`))
  417. return
  418. }
  419. defer d.Close()
  420. if rs, err = d.conn.NamedExec(query, args); err == nil {
  421. a, _ := rs.RowsAffected()
  422. n, _ := rs.LastInsertId()
  423. reply = ReplyOk(a, n)
  424. } else {
  425. reply = ReplyFaild(ErrException, err, errors.New(`数据执行错误`))
  426. }
  427. return
  428. }
  429. // UpdateReply update/delete and return DbReply
  430. func (d *DB) UpdateReply(query string, args interface{}) (reply Reply) {
  431. var (
  432. err error
  433. rs sql.Result
  434. )
  435. err = d.Connect()
  436. if err != nil {
  437. reply = ReplyFaild(ErrNotConnect, err, errors.New(`数据库连接错误`))
  438. return
  439. }
  440. defer d.Close()
  441. if rs, err = d.conn.NamedExec(query, args); err == nil {
  442. a, _ := rs.RowsAffected()
  443. reply = ReplyOk(a, 0)
  444. } else {
  445. reply = ReplyFaild(ErrException, err, errors.New(`数据执行错误`))
  446. }
  447. return
  448. }
  449. // Insert insert into with named args
  450. func (d *DB) Insert(query string, args interface{}) (LastInsertId, RowsAffected int64, err error) {
  451. err = d.Connect()
  452. if err != nil {
  453. return
  454. }
  455. defer d.Close()
  456. var rs sql.Result
  457. if rs, err = d.conn.NamedExec(query, args); err == nil {
  458. LastInsertId, _ = rs.LastInsertId()
  459. RowsAffected, _ = rs.RowsAffected()
  460. }
  461. return
  462. }
  463. // InsertContext insert into with named args
  464. func (d *DB) InsertContext(ctx context.Context, query string, args interface{}) (LastInsertId, RowsAffected int64, err error) {
  465. err = d.ConnectContext(ctx)
  466. if err != nil {
  467. return
  468. }
  469. defer d.Close()
  470. var rs sql.Result
  471. if rs, err = d.conn.NamedExecContext(ctx, query, args); err == nil {
  472. LastInsertId, _ = rs.LastInsertId()
  473. RowsAffected, _ = rs.RowsAffected()
  474. }
  475. return
  476. }
  477. // Update update/delete with named args
  478. func (d *DB) Update(query string, args interface{}) (RowsAffected int64, err error) {
  479. err = d.Connect()
  480. if err != nil {
  481. return
  482. }
  483. defer d.Close()
  484. var rs sql.Result
  485. if rs, err = d.conn.NamedExec(query, args); err == nil {
  486. RowsAffected, _ = rs.RowsAffected()
  487. }
  488. return
  489. }
  490. // Update update/delete with named args
  491. func (d *DB) UpdateContext(ctx context.Context, query string, args interface{}) (RowsAffected int64, err error) {
  492. err = d.ConnectContext(ctx)
  493. if err != nil {
  494. return
  495. }
  496. defer d.Close()
  497. var rs sql.Result
  498. if rs, err = d.conn.NamedExecContext(ctx, query, args); err == nil {
  499. RowsAffected, _ = rs.RowsAffected()
  500. }
  501. return
  502. }
  503. // Exec exec
  504. func (d *DB) Exec(query string, args ...interface{}) (LastInsertId, RowsAffected int64, err error) {
  505. err = d.Connect()
  506. if err != nil {
  507. return
  508. }
  509. defer d.Close()
  510. var rs sql.Result
  511. if rs, err = d.conn.Exec(query, args...); err == nil {
  512. LastInsertId, _ = rs.LastInsertId()
  513. RowsAffected, _ = rs.RowsAffected()
  514. }
  515. return
  516. }
  517. // ExecContext exec
  518. func (d *DB) ExecContext(ctx context.Context, query string, args ...interface{}) (LastInsertId, RowsAffected int64, err error) {
  519. err = d.ConnectContext(ctx)
  520. if err != nil {
  521. return
  522. }
  523. defer d.Close()
  524. var rs sql.Result
  525. if rs, err = d.conn.ExecContext(ctx, query, args...); err == nil {
  526. LastInsertId, _ = rs.LastInsertId()
  527. RowsAffected, _ = rs.RowsAffected()
  528. }
  529. return
  530. }
  531. // Exec exec, with named args
  532. func (d *DB) NamedExec(query string, args interface{}) (LastInsertId, RowsAffected int64, err error) {
  533. err = d.Connect()
  534. if err != nil {
  535. return
  536. }
  537. defer d.Close()
  538. var rs sql.Result
  539. if rs, err = d.conn.NamedExec(query, args); err == nil {
  540. LastInsertId, _ = rs.LastInsertId()
  541. RowsAffected, _ = rs.RowsAffected()
  542. }
  543. return
  544. }
  545. // NamedExecContext exec, with named args
  546. func (d *DB) NamedExecContext(ctx context.Context, query string, args interface{}) (LastInsertId, RowsAffected int64, err error) {
  547. err = d.ConnectContext(ctx)
  548. if err != nil {
  549. return
  550. }
  551. defer d.Close()
  552. var rs sql.Result
  553. if rs, err = d.conn.NamedExecContext(ctx, query, args); err == nil {
  554. LastInsertId, _ = rs.LastInsertId()
  555. RowsAffected, _ = rs.RowsAffected()
  556. }
  557. return
  558. }
  559. // Limit MySQL limit
  560. func (d *DB) Limit(page, pagesize int) string {
  561. // MySQL limit 0, size
  562. if d.Driver == `mysql` {
  563. return fmt.Sprintf(" LIMIT %d, %d", (page-1)*pagesize, pagesize)
  564. }
  565. // // PostgreSQL limit size offset 0
  566. return fmt.Sprintf(" LIMIT %d OFFSET %d", pagesize, (page-1)*pagesize)
  567. }
  568. // Commit commits the transaction.
  569. func (t *Tx) Commit() error {
  570. return t.tx.Commit()
  571. }
  572. // Rollback aborts the transaction.
  573. func (t *Tx) Rollback() error {
  574. return t.tx.Rollback()
  575. }
  576. // NamedExec executes a query that doesn't return rows. For example: an INSERT and UPDATE. with named args
  577. func (t *Tx) NamedExec(query string, args interface{}) (LastInsertId, RowsAffected int64, err error) {
  578. var rs sql.Result
  579. if rs, err = t.tx.NamedExec(query, args); err == nil {
  580. RowsAffected, _ = rs.RowsAffected()
  581. LastInsertId, _ = rs.LastInsertId()
  582. }
  583. return
  584. }
  585. // NamedExecContext executes a query that doesn't return rows. For example: an INSERT and UPDATE. with named args
  586. func (t *Tx) NamedExecContext(ctx context.Context, query string, args interface{}) (LastInsertId, RowsAffected int64, err error) {
  587. var rs sql.Result
  588. if rs, err = t.tx.NamedExecContext(ctx, query, args); err == nil {
  589. RowsAffected, _ = rs.RowsAffected()
  590. LastInsertId, _ = rs.LastInsertId()
  591. }
  592. return
  593. }
  594. // Exec executes a query that doesn't return rows. For example: an INSERT and UPDATE.
  595. func (t *Tx) Exec(query string, args ...interface{}) (LastInsertId, RowsAffected int64, err error) {
  596. var rs sql.Result
  597. if rs, err = t.tx.Exec(query, args...); err == nil {
  598. RowsAffected, _ = rs.RowsAffected()
  599. LastInsertId, _ = rs.LastInsertId()
  600. }
  601. return
  602. }
  603. // ExecContext executes a query that doesn't return rows. For example: an INSERT and UPDATE.
  604. func (t *Tx) ExecContext(ctx context.Context, query string, args ...interface{}) (LastInsertId, RowsAffected int64, err error) {
  605. var rs sql.Result
  606. if rs, err = t.tx.ExecContext(ctx, query, args...); err == nil {
  607. RowsAffected, _ = rs.RowsAffected()
  608. LastInsertId, _ = rs.LastInsertId()
  609. }
  610. return
  611. }
  612. // Query executes a query that returns rows, typically a SELECT. with named args
  613. func (t *Tx) Query(dest interface{}, query string, args interface{}) (err error) {
  614. nstmt := new(sqlx.NamedStmt)
  615. nstmt, err = t.tx.PrepareNamed(query)
  616. if err != nil {
  617. return
  618. }
  619. defer nstmt.Close()
  620. err = nstmt.Select(dest, args)
  621. return
  622. }
  623. // QueryContext executes a query that returns rows, typically a SELECT. with named args
  624. func (t *Tx) QueryContext(ctx context.Context, dest interface{}, query string, args interface{}) (err error) {
  625. nstmt := new(sqlx.NamedStmt)
  626. nstmt, err = t.tx.PrepareNamedContext(ctx, query)
  627. if err != nil {
  628. return
  629. }
  630. defer nstmt.Close()
  631. err = nstmt.SelectContext(ctx, dest, args)
  632. return
  633. }
  634. // QueryRow executes a query that returns rows, typically a SELECT. with named args
  635. func (t *Tx) QueryRow(dest interface{}, query string, args interface{}) (err error) {
  636. nstmt := new(sqlx.NamedStmt)
  637. nstmt, err = t.tx.PrepareNamed(query)
  638. if err != nil {
  639. return err
  640. }
  641. defer nstmt.Close()
  642. err = nstmt.Get(dest, args)
  643. return
  644. }
  645. // QueryRowContext get row with named args
  646. func (t *Tx) QueryRowContext(ctx context.Context, dest interface{}, query string, args interface{}) (err error) {
  647. nstmt := new(sqlx.NamedStmt)
  648. nstmt, err = t.tx.PrepareNamedContext(ctx, query)
  649. if err != nil {
  650. return err
  651. }
  652. defer nstmt.Close()
  653. err = nstmt.GetContext(ctx, dest, args)
  654. return
  655. }
  656. // Ping ping connect
  657. func Ping() (err error) {
  658. defaultDB.conn, err = connect()
  659. if err != nil {
  660. return
  661. }
  662. err = defaultDB.Ping()
  663. return
  664. }
  665. // PingContext ping connect
  666. func PingContext(ctx context.Context) (err error) {
  667. defaultDB.conn, err = connectContext(ctx)
  668. if err != nil {
  669. return
  670. }
  671. err = defaultDB.PingContext(ctx)
  672. return
  673. }
  674. // Select select
  675. func Select(dest interface{}, query string, args ...interface{}) (err error) {
  676. defaultDB.conn, err = connect()
  677. if err != nil {
  678. return err
  679. }
  680. err = defaultDB.conn.Select(dest, query, args...)
  681. return
  682. }
  683. // Query get rows with named args
  684. func Query(dest interface{}, query string, args interface{}) (err error) {
  685. defaultDB.conn, err = connect()
  686. if err != nil {
  687. return
  688. }
  689. nstmt := new(sqlx.NamedStmt)
  690. nstmt, err = defaultDB.conn.PrepareNamed(query)
  691. if err != nil {
  692. return
  693. }
  694. defer nstmt.Close()
  695. err = nstmt.Select(dest, args)
  696. return
  697. }
  698. // QueryContext get rows with named args
  699. func QueryContext(ctx context.Context, dest interface{}, query string, args interface{}) (err error) {
  700. defaultDB.conn, err = connectContext(ctx)
  701. if err != nil {
  702. return
  703. }
  704. nstmt := new(sqlx.NamedStmt)
  705. nstmt, err = defaultDB.conn.PrepareNamedContext(ctx, query)
  706. if err != nil {
  707. return
  708. }
  709. defer nstmt.Close()
  710. err = nstmt.SelectContext(ctx, dest, args)
  711. return
  712. }
  713. // Rows get rows with named args
  714. func Rows(dest interface{}, query string, args interface{}) (err error) {
  715. defaultDB.conn, err = connect()
  716. if err != nil {
  717. return
  718. }
  719. nstmt := new(sqlx.NamedStmt)
  720. nstmt, err = defaultDB.conn.PrepareNamed(query)
  721. if err != nil {
  722. return
  723. }
  724. defer nstmt.Close()
  725. err = nstmt.Select(dest, args)
  726. return
  727. }
  728. // RowsContext get rows with named args
  729. func RowsContext(ctx context.Context, dest interface{}, query string, args interface{}) (err error) {
  730. defaultDB.conn, err = connectContext(ctx)
  731. if err != nil {
  732. return
  733. }
  734. nstmt := new(sqlx.NamedStmt)
  735. nstmt, err = defaultDB.conn.PrepareNamedContext(ctx, query)
  736. if err != nil {
  737. return
  738. }
  739. defer nstmt.Close()
  740. err = nstmt.SelectContext(ctx, dest, args)
  741. return
  742. }
  743. // Get get
  744. func Get(dest interface{}, query string, args ...interface{}) (err error) {
  745. defaultDB.conn, err = connect()
  746. if err != nil {
  747. return
  748. }
  749. err = defaultDB.conn.Get(dest, query, args...)
  750. return
  751. }
  752. // QueryRow get row with named args
  753. func QueryRow(dest interface{}, query string, args interface{}) (err error) {
  754. defaultDB.conn, err = connect()
  755. if err != nil {
  756. return
  757. }
  758. nstmt := new(sqlx.NamedStmt)
  759. nstmt, err = defaultDB.conn.PrepareNamed(query)
  760. if err != nil {
  761. return
  762. }
  763. defer nstmt.Close()
  764. err = nstmt.Get(dest, args)
  765. return
  766. }
  767. // QueryRowContext get row with named args
  768. func QueryRowContext(ctx context.Context, dest interface{}, query string, args interface{}) (err error) {
  769. defaultDB.conn, err = connectContext(ctx)
  770. if err != nil {
  771. return
  772. }
  773. nstmt := new(sqlx.NamedStmt)
  774. nstmt, err = defaultDB.conn.PrepareNamedContext(ctx, query)
  775. if err != nil {
  776. return
  777. }
  778. defer nstmt.Close()
  779. err = nstmt.GetContext(ctx, dest, args)
  780. return
  781. }
  782. // Row get row with named args
  783. func Row(dest interface{}, query string, args interface{}) (err error) {
  784. defaultDB.conn, err = connect()
  785. if err != nil {
  786. return
  787. }
  788. nstmt := new(sqlx.NamedStmt)
  789. nstmt, err = defaultDB.conn.PrepareNamed(query)
  790. if err != nil {
  791. return
  792. }
  793. defer nstmt.Close()
  794. err = nstmt.Get(dest, args)
  795. return
  796. }
  797. // RowContext get row with named args
  798. func RowContext(ctx context.Context, dest interface{}, query string, args interface{}) (err error) {
  799. defaultDB.conn, err = connectContext(ctx)
  800. if err != nil {
  801. return
  802. }
  803. nstmt := new(sqlx.NamedStmt)
  804. nstmt, err = defaultDB.conn.PrepareNamedContext(ctx, query)
  805. if err != nil {
  806. return
  807. }
  808. defer nstmt.Close()
  809. err = nstmt.GetContext(ctx, dest, args)
  810. return
  811. }
  812. // Exec exec
  813. func Exec(query string, args ...interface{}) (LastInsertId, RowsAffected int64, err error) {
  814. defaultDB.conn, err = connect()
  815. if err != nil {
  816. return
  817. }
  818. LastInsertId, RowsAffected, err = defaultDB.Exec(query, args...)
  819. return
  820. }
  821. // Exec exec
  822. func ExecContext(ctx context.Context, query string, args ...interface{}) (LastInsertId, RowsAffected int64, err error) {
  823. defaultDB.conn, err = connectContext(ctx)
  824. if err != nil {
  825. return
  826. }
  827. LastInsertId, RowsAffected, err = defaultDB.ExecContext(ctx, query, args...)
  828. return
  829. }
  830. // NamedExec exec with named args
  831. func NamedExec(query string, args interface{}) (LastInsertId, RowsAffected int64, err error) {
  832. defaultDB.conn, err = connect()
  833. if err != nil {
  834. return
  835. }
  836. LastInsertId, RowsAffected, err = defaultDB.NamedExec(query, args)
  837. return
  838. }
  839. // NamedExecContext exec with named args
  840. func NamedExecContext(ctx context.Context, query string, args interface{}) (LastInsertId, RowsAffected int64, err error) {
  841. defaultDB.conn, err = connectContext(ctx)
  842. if err != nil {
  843. return
  844. }
  845. LastInsertId, RowsAffected, err = defaultDB.NamedExecContext(ctx, query, args)
  846. return
  847. }