db_test.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  1. package core
  2. import (
  3. "errors"
  4. "flag"
  5. "os"
  6. "testing"
  7. "time"
  8. _ "github.com/go-sql-driver/mysql"
  9. _ "github.com/mattn/go-sqlite3"
  10. )
  11. var (
  12. dbtype = flag.String("dbtype", "mysql", "database type")
  13. createTableSql string
  14. )
  15. type User struct {
  16. Id int64
  17. Name string
  18. Title string
  19. Age float32
  20. Alias string
  21. NickName string
  22. Created NullTime
  23. }
  24. func init() {
  25. flag.Parse()
  26. switch *dbtype {
  27. case "sqlite3":
  28. createTableSql = "CREATE TABLE IF NOT EXISTS `user` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NULL, " +
  29. "`title` TEXT NULL, `age` FLOAT NULL, `alias` TEXT NULL, `nick_name` TEXT NULL, `created` datetime);"
  30. case "mysql":
  31. createTableSql = "CREATE TABLE IF NOT EXISTS `user` (`id` INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, `name` TEXT NULL, " +
  32. "`title` TEXT NULL, `age` FLOAT NULL, `alias` TEXT NULL, `nick_name` TEXT NULL, `created` datetime);"
  33. default:
  34. panic("no db type")
  35. }
  36. }
  37. func testOpen() (*DB, error) {
  38. switch *dbtype {
  39. case "sqlite3":
  40. os.Remove("./test.db")
  41. return Open("sqlite3", "./test.db")
  42. case "mysql":
  43. return Open("mysql", "root:@/core_test?charset=utf8")
  44. default:
  45. panic("no db type")
  46. }
  47. }
  48. func BenchmarkOriQuery(b *testing.B) {
  49. b.StopTimer()
  50. db, err := testOpen()
  51. if err != nil {
  52. b.Error(err)
  53. }
  54. defer db.Close()
  55. _, err = db.Exec(createTableSql)
  56. if err != nil {
  57. b.Error(err)
  58. }
  59. for i := 0; i < 50; i++ {
  60. _, err = db.Exec("insert into user (`name`, title, age, alias, nick_name, created) values (?,?,?,?,?, ?)",
  61. "xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now())
  62. if err != nil {
  63. b.Error(err)
  64. }
  65. }
  66. b.StartTimer()
  67. for i := 0; i < b.N; i++ {
  68. rows, err := db.Query("select * from user")
  69. if err != nil {
  70. b.Error(err)
  71. }
  72. for rows.Next() {
  73. var Id int64
  74. var Name, Title, Alias, NickName string
  75. var Age float32
  76. var Created NullTime
  77. err = rows.Scan(&Id, &Name, &Title, &Age, &Alias, &NickName, &Created)
  78. if err != nil {
  79. b.Error(err)
  80. }
  81. //fmt.Println(Id, Name, Title, Age, Alias, NickName)
  82. }
  83. rows.Close()
  84. }
  85. }
  86. func BenchmarkStructQuery(b *testing.B) {
  87. b.StopTimer()
  88. db, err := testOpen()
  89. if err != nil {
  90. b.Error(err)
  91. }
  92. defer db.Close()
  93. _, err = db.Exec(createTableSql)
  94. if err != nil {
  95. b.Error(err)
  96. }
  97. for i := 0; i < 50; i++ {
  98. _, err = db.Exec("insert into user (`name`, title, age, alias, nick_name, created) values (?,?,?,?,?, ?)",
  99. "xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now())
  100. if err != nil {
  101. b.Error(err)
  102. }
  103. }
  104. b.StartTimer()
  105. for i := 0; i < b.N; i++ {
  106. rows, err := db.Query("select * from user")
  107. if err != nil {
  108. b.Error(err)
  109. }
  110. for rows.Next() {
  111. var user User
  112. err = rows.ScanStructByIndex(&user)
  113. if err != nil {
  114. b.Error(err)
  115. }
  116. if user.Name != "xlw" {
  117. b.Log(user)
  118. b.Error(errors.New("name should be xlw"))
  119. }
  120. }
  121. rows.Close()
  122. }
  123. }
  124. func BenchmarkStruct2Query(b *testing.B) {
  125. b.StopTimer()
  126. db, err := testOpen()
  127. if err != nil {
  128. b.Error(err)
  129. }
  130. defer db.Close()
  131. _, err = db.Exec(createTableSql)
  132. if err != nil {
  133. b.Error(err)
  134. }
  135. for i := 0; i < 50; i++ {
  136. _, err = db.Exec("insert into user (`name`, title, age, alias, nick_name, created) values (?,?,?,?,?,?)",
  137. "xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now())
  138. if err != nil {
  139. b.Error(err)
  140. }
  141. }
  142. db.Mapper = NewCacheMapper(&SnakeMapper{})
  143. b.StartTimer()
  144. for i := 0; i < b.N; i++ {
  145. rows, err := db.Query("select * from user")
  146. if err != nil {
  147. b.Error(err)
  148. }
  149. for rows.Next() {
  150. var user User
  151. err = rows.ScanStructByName(&user)
  152. if err != nil {
  153. b.Error(err)
  154. }
  155. if user.Name != "xlw" {
  156. b.Log(user)
  157. b.Error(errors.New("name should be xlw"))
  158. }
  159. }
  160. rows.Close()
  161. }
  162. }
  163. func BenchmarkSliceInterfaceQuery(b *testing.B) {
  164. b.StopTimer()
  165. db, err := testOpen()
  166. if err != nil {
  167. b.Error(err)
  168. }
  169. defer db.Close()
  170. _, err = db.Exec(createTableSql)
  171. if err != nil {
  172. b.Error(err)
  173. }
  174. for i := 0; i < 50; i++ {
  175. _, err = db.Exec("insert into user (`name`, title, age, alias, nick_name,created) values (?,?,?,?,?,?)",
  176. "xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now())
  177. if err != nil {
  178. b.Error(err)
  179. }
  180. }
  181. b.StartTimer()
  182. for i := 0; i < b.N; i++ {
  183. rows, err := db.Query("select * from user")
  184. if err != nil {
  185. b.Error(err)
  186. }
  187. cols, err := rows.Columns()
  188. if err != nil {
  189. b.Error(err)
  190. }
  191. for rows.Next() {
  192. slice := make([]interface{}, len(cols))
  193. err = rows.ScanSlice(&slice)
  194. if err != nil {
  195. b.Error(err)
  196. }
  197. b.Log(slice)
  198. if *slice[1].(*string) != "xlw" {
  199. b.Error(errors.New("name should be xlw"))
  200. }
  201. }
  202. rows.Close()
  203. }
  204. }
  205. /*func BenchmarkSliceBytesQuery(b *testing.B) {
  206. b.StopTimer()
  207. os.Remove("./test.db")
  208. db, err := Open("sqlite3", "./test.db")
  209. if err != nil {
  210. b.Error(err)
  211. }
  212. defer db.Close()
  213. _, err = db.Exec(createTableSql)
  214. if err != nil {
  215. b.Error(err)
  216. }
  217. for i := 0; i < 50; i++ {
  218. _, err = db.Exec("insert into user (name, title, age, alias, nick_name,created) values (?,?,?,?,?,?)",
  219. "xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now())
  220. if err != nil {
  221. b.Error(err)
  222. }
  223. }
  224. b.StartTimer()
  225. for i := 0; i < b.N; i++ {
  226. rows, err := db.Query("select * from user")
  227. if err != nil {
  228. b.Error(err)
  229. }
  230. cols, err := rows.Columns()
  231. if err != nil {
  232. b.Error(err)
  233. }
  234. for rows.Next() {
  235. slice := make([][]byte, len(cols))
  236. err = rows.ScanSlice(&slice)
  237. if err != nil {
  238. b.Error(err)
  239. }
  240. if string(slice[1]) != "xlw" {
  241. fmt.Println(slice)
  242. b.Error(errors.New("name should be xlw"))
  243. }
  244. }
  245. rows.Close()
  246. }
  247. }
  248. */
  249. func BenchmarkSliceStringQuery(b *testing.B) {
  250. b.StopTimer()
  251. db, err := testOpen()
  252. if err != nil {
  253. b.Error(err)
  254. }
  255. defer db.Close()
  256. _, err = db.Exec(createTableSql)
  257. if err != nil {
  258. b.Error(err)
  259. }
  260. for i := 0; i < 50; i++ {
  261. _, err = db.Exec("insert into user (name, title, age, alias, nick_name, created) values (?,?,?,?,?,?)",
  262. "xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now())
  263. if err != nil {
  264. b.Error(err)
  265. }
  266. }
  267. b.StartTimer()
  268. for i := 0; i < b.N; i++ {
  269. rows, err := db.Query("select * from user")
  270. if err != nil {
  271. b.Error(err)
  272. }
  273. cols, err := rows.Columns()
  274. if err != nil {
  275. b.Error(err)
  276. }
  277. for rows.Next() {
  278. slice := make([]*string, len(cols))
  279. err = rows.ScanSlice(&slice)
  280. if err != nil {
  281. b.Error(err)
  282. }
  283. if (*slice[1]) != "xlw" {
  284. b.Log(slice)
  285. b.Error(errors.New("name should be xlw"))
  286. }
  287. }
  288. rows.Close()
  289. }
  290. }
  291. func BenchmarkMapInterfaceQuery(b *testing.B) {
  292. b.StopTimer()
  293. db, err := testOpen()
  294. if err != nil {
  295. b.Error(err)
  296. }
  297. defer db.Close()
  298. _, err = db.Exec(createTableSql)
  299. if err != nil {
  300. b.Error(err)
  301. }
  302. for i := 0; i < 50; i++ {
  303. _, err = db.Exec("insert into user (name, title, age, alias, nick_name,created) values (?,?,?,?,?,?)",
  304. "xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now())
  305. if err != nil {
  306. b.Error(err)
  307. }
  308. }
  309. b.StartTimer()
  310. for i := 0; i < b.N; i++ {
  311. rows, err := db.Query("select * from user")
  312. if err != nil {
  313. b.Error(err)
  314. }
  315. for rows.Next() {
  316. m := make(map[string]interface{})
  317. err = rows.ScanMap(&m)
  318. if err != nil {
  319. b.Error(err)
  320. }
  321. if m["name"].(string) != "xlw" {
  322. b.Log(m)
  323. b.Error(errors.New("name should be xlw"))
  324. }
  325. }
  326. rows.Close()
  327. }
  328. }
  329. /*func BenchmarkMapBytesQuery(b *testing.B) {
  330. b.StopTimer()
  331. os.Remove("./test.db")
  332. db, err := Open("sqlite3", "./test.db")
  333. if err != nil {
  334. b.Error(err)
  335. }
  336. defer db.Close()
  337. _, err = db.Exec(createTableSql)
  338. if err != nil {
  339. b.Error(err)
  340. }
  341. for i := 0; i < 50; i++ {
  342. _, err = db.Exec("insert into user (name, title, age, alias, nick_name,created) values (?,?,?,?,?,?)",
  343. "xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now())
  344. if err != nil {
  345. b.Error(err)
  346. }
  347. }
  348. b.StartTimer()
  349. for i := 0; i < b.N; i++ {
  350. rows, err := db.Query("select * from user")
  351. if err != nil {
  352. b.Error(err)
  353. }
  354. for rows.Next() {
  355. m := make(map[string][]byte)
  356. err = rows.ScanMap(&m)
  357. if err != nil {
  358. b.Error(err)
  359. }
  360. if string(m["name"]) != "xlw" {
  361. fmt.Println(m)
  362. b.Error(errors.New("name should be xlw"))
  363. }
  364. }
  365. rows.Close()
  366. }
  367. }
  368. */
  369. /*
  370. func BenchmarkMapStringQuery(b *testing.B) {
  371. b.StopTimer()
  372. os.Remove("./test.db")
  373. db, err := Open("sqlite3", "./test.db")
  374. if err != nil {
  375. b.Error(err)
  376. }
  377. defer db.Close()
  378. _, err = db.Exec(createTableSql)
  379. if err != nil {
  380. b.Error(err)
  381. }
  382. for i := 0; i < 50; i++ {
  383. _, err = db.Exec("insert into user (name, title, age, alias, nick_name,created) values (?,?,?,?,?,?)",
  384. "xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now())
  385. if err != nil {
  386. b.Error(err)
  387. }
  388. }
  389. b.StartTimer()
  390. for i := 0; i < b.N; i++ {
  391. rows, err := db.Query("select * from user")
  392. if err != nil {
  393. b.Error(err)
  394. }
  395. for rows.Next() {
  396. m := make(map[string]string)
  397. err = rows.ScanMap(&m)
  398. if err != nil {
  399. b.Error(err)
  400. }
  401. if m["name"] != "xlw" {
  402. fmt.Println(m)
  403. b.Error(errors.New("name should be xlw"))
  404. }
  405. }
  406. rows.Close()
  407. }
  408. }*/
  409. func BenchmarkExec(b *testing.B) {
  410. b.StopTimer()
  411. db, err := testOpen()
  412. if err != nil {
  413. b.Error(err)
  414. }
  415. defer db.Close()
  416. _, err = db.Exec(createTableSql)
  417. if err != nil {
  418. b.Error(err)
  419. }
  420. b.StartTimer()
  421. for i := 0; i < b.N; i++ {
  422. _, err = db.Exec("insert into user (`name`, title, age, alias, nick_name,created) values (?,?,?,?,?,?)",
  423. "xlw", "tester", 1.2, "lunny", "lunny xiao", time.Now())
  424. if err != nil {
  425. b.Error(err)
  426. }
  427. }
  428. }
  429. func BenchmarkExecMap(b *testing.B) {
  430. b.StopTimer()
  431. db, err := testOpen()
  432. if err != nil {
  433. b.Error(err)
  434. }
  435. defer db.Close()
  436. _, err = db.Exec(createTableSql)
  437. if err != nil {
  438. b.Error(err)
  439. }
  440. b.StartTimer()
  441. mp := map[string]interface{}{
  442. "name": "xlw",
  443. "title": "tester",
  444. "age": 1.2,
  445. "alias": "lunny",
  446. "nick_name": "lunny xiao",
  447. "created": time.Now(),
  448. }
  449. for i := 0; i < b.N; i++ {
  450. _, err = db.ExecMap("insert into user (`name`, title, age, alias, nick_name, created) "+
  451. "values (?name,?title,?age,?alias,?nick_name,?created)",
  452. &mp)
  453. if err != nil {
  454. b.Error(err)
  455. }
  456. }
  457. }
  458. func TestExecMap(t *testing.T) {
  459. db, err := testOpen()
  460. if err != nil {
  461. t.Error(err)
  462. }
  463. defer db.Close()
  464. _, err = db.Exec(createTableSql)
  465. if err != nil {
  466. t.Error(err)
  467. }
  468. mp := map[string]interface{}{
  469. "name": "xlw",
  470. "title": "tester",
  471. "age": 1.2,
  472. "alias": "lunny",
  473. "nick_name": "lunny xiao",
  474. "created": time.Now(),
  475. }
  476. _, err = db.ExecMap("insert into user (`name`, title, age, alias, nick_name,created) "+
  477. "values (?name,?title,?age,?alias,?nick_name,?created)",
  478. &mp)
  479. if err != nil {
  480. t.Error(err)
  481. }
  482. rows, err := db.Query("select * from user")
  483. if err != nil {
  484. t.Error(err)
  485. }
  486. for rows.Next() {
  487. var user User
  488. err = rows.ScanStructByName(&user)
  489. if err != nil {
  490. t.Error(err)
  491. }
  492. t.Log("--", user)
  493. }
  494. }
  495. func TestExecStruct(t *testing.T) {
  496. db, err := testOpen()
  497. if err != nil {
  498. t.Error(err)
  499. }
  500. defer db.Close()
  501. _, err = db.Exec(createTableSql)
  502. if err != nil {
  503. t.Error(err)
  504. }
  505. user := User{Name: "xlw",
  506. Title: "tester",
  507. Age: 1.2,
  508. Alias: "lunny",
  509. NickName: "lunny xiao",
  510. Created: NullTime(time.Now()),
  511. }
  512. _, err = db.ExecStruct("insert into user (`name`, title, age, alias, nick_name,created) "+
  513. "values (?Name,?Title,?Age,?Alias,?NickName,?Created)",
  514. &user)
  515. if err != nil {
  516. t.Error(err)
  517. }
  518. rows, err := db.QueryStruct("select * from user where `name` = ?Name", &user)
  519. if err != nil {
  520. t.Error(err)
  521. }
  522. for rows.Next() {
  523. var user User
  524. err = rows.ScanStructByName(&user)
  525. if err != nil {
  526. t.Error(err)
  527. }
  528. t.Log("1--", user)
  529. }
  530. }
  531. func BenchmarkExecStruct(b *testing.B) {
  532. b.StopTimer()
  533. db, err := testOpen()
  534. if err != nil {
  535. b.Error(err)
  536. }
  537. defer db.Close()
  538. _, err = db.Exec(createTableSql)
  539. if err != nil {
  540. b.Error(err)
  541. }
  542. b.StartTimer()
  543. user := User{Name: "xlw",
  544. Title: "tester",
  545. Age: 1.2,
  546. Alias: "lunny",
  547. NickName: "lunny xiao",
  548. Created: NullTime(time.Now()),
  549. }
  550. for i := 0; i < b.N; i++ {
  551. _, err = db.ExecStruct("insert into user (`name`, title, age, alias, nick_name,created) "+
  552. "values (?Name,?Title,?Age,?Alias,?NickName,?Created)",
  553. &user)
  554. if err != nil {
  555. b.Error(err)
  556. }
  557. }
  558. }