db.go 22 KB

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