session_get_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. // Copyright 2017 The Xorm Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package xorm
  5. import (
  6. "database/sql"
  7. "fmt"
  8. "testing"
  9. "time"
  10. "github.com/stretchr/testify/assert"
  11. "github.com/xormplus/core"
  12. )
  13. func TestGetVar(t *testing.T) {
  14. assert.NoError(t, prepareEngine())
  15. type GetVar struct {
  16. Id int64 `xorm:"autoincr pk"`
  17. Msg string `xorm:"varchar(255)"`
  18. Age int
  19. Money float32
  20. Created time.Time `xorm:"created"`
  21. }
  22. assert.NoError(t, testEngine.Sync2(new(GetVar)))
  23. var data = GetVar{
  24. Msg: "hi",
  25. Age: 28,
  26. Money: 1.5,
  27. }
  28. _, err := testEngine.InsertOne(&data)
  29. assert.NoError(t, err)
  30. var msg string
  31. has, err := testEngine.Table("get_var").Cols("msg").Get(&msg)
  32. assert.NoError(t, err)
  33. assert.Equal(t, true, has)
  34. assert.Equal(t, "hi", msg)
  35. var age int
  36. has, err = testEngine.Table("get_var").Cols("age").Get(&age)
  37. assert.NoError(t, err)
  38. assert.Equal(t, true, has)
  39. assert.Equal(t, 28, age)
  40. var age2 int64
  41. has, err = testEngine.Table("get_var").Cols("age").
  42. Where("age > ?", 20).
  43. And("age < ?", 30).
  44. Get(&age2)
  45. assert.NoError(t, err)
  46. assert.Equal(t, true, has)
  47. assert.EqualValues(t, 28, age2)
  48. var id sql.NullInt64
  49. has, err = testEngine.Table("get_var").Cols("id").Get(&id)
  50. assert.NoError(t, err)
  51. assert.Equal(t, true, has)
  52. assert.Equal(t, true, id.Valid)
  53. assert.EqualValues(t, data.Id, id.Int64)
  54. var msgNull sql.NullString
  55. has, err = testEngine.Table("get_var").Cols("msg").Get(&msgNull)
  56. assert.NoError(t, err)
  57. assert.Equal(t, true, has)
  58. assert.Equal(t, true, msgNull.Valid)
  59. assert.EqualValues(t, data.Msg, msgNull.String)
  60. var nullMoney sql.NullFloat64
  61. has, err = testEngine.Table("get_var").Cols("money").Get(&nullMoney)
  62. assert.NoError(t, err)
  63. assert.Equal(t, true, has)
  64. assert.Equal(t, true, nullMoney.Valid)
  65. assert.EqualValues(t, data.Money, nullMoney.Float64)
  66. var money float64
  67. has, err = testEngine.Table("get_var").Cols("money").Get(&money)
  68. assert.NoError(t, err)
  69. assert.Equal(t, true, has)
  70. assert.Equal(t, "1.5", fmt.Sprintf("%.1f", money))
  71. var money2 float64
  72. if testEngine.Dialect().DBType() == core.MSSQL {
  73. has, err = testEngine.SQL("SELECT TOP 1 money FROM " + testEngine.TableName("get_var", true)).Get(&money2)
  74. } else {
  75. has, err = testEngine.SQL("SELECT money FROM " + testEngine.TableName("get_var", true) + " LIMIT 1").Get(&money2)
  76. }
  77. assert.NoError(t, err)
  78. assert.Equal(t, true, has)
  79. assert.Equal(t, "1.5", fmt.Sprintf("%.1f", money2))
  80. var money3 float64
  81. has, err = testEngine.SQL("SELECT money FROM " + testEngine.TableName("get_var", true) + " WHERE money > 20").Get(&money3)
  82. assert.NoError(t, err)
  83. assert.Equal(t, false, has)
  84. var valuesString = make(map[string]string)
  85. has, err = testEngine.Table("get_var").Get(&valuesString)
  86. assert.NoError(t, err)
  87. assert.Equal(t, true, has)
  88. assert.Equal(t, 5, len(valuesString))
  89. assert.Equal(t, "1", valuesString["id"])
  90. assert.Equal(t, "hi", valuesString["msg"])
  91. assert.Equal(t, "28", valuesString["age"])
  92. assert.Equal(t, "1.5", valuesString["money"])
  93. // for mymysql driver, interface{} will be []byte, so ignore it currently
  94. if testEngine.Dialect().DriverName() != "mymysql" {
  95. var valuesInter = make(map[string]interface{})
  96. has, err = testEngine.Table("get_var").Where("id = ?", 1).Select("*").Get(&valuesInter)
  97. assert.NoError(t, err)
  98. assert.Equal(t, true, has)
  99. assert.Equal(t, 5, len(valuesInter))
  100. assert.EqualValues(t, 1, valuesInter["id"])
  101. assert.Equal(t, "hi", fmt.Sprintf("%s", valuesInter["msg"]))
  102. assert.EqualValues(t, 28, valuesInter["age"])
  103. assert.Equal(t, "1.5", fmt.Sprintf("%v", valuesInter["money"]))
  104. }
  105. var valuesSliceString = make([]string, 5)
  106. has, err = testEngine.Table("get_var").Get(&valuesSliceString)
  107. assert.NoError(t, err)
  108. assert.Equal(t, true, has)
  109. assert.Equal(t, "1", valuesSliceString[0])
  110. assert.Equal(t, "hi", valuesSliceString[1])
  111. assert.Equal(t, "28", valuesSliceString[2])
  112. assert.Equal(t, "1.5", valuesSliceString[3])
  113. var valuesSliceInter = make([]interface{}, 5)
  114. has, err = testEngine.Table("get_var").Get(&valuesSliceInter)
  115. assert.NoError(t, err)
  116. assert.Equal(t, true, has)
  117. v1, err := convertInt(valuesSliceInter[0])
  118. assert.NoError(t, err)
  119. assert.EqualValues(t, 1, v1)
  120. assert.Equal(t, "hi", fmt.Sprintf("%s", valuesSliceInter[1]))
  121. v3, err := convertInt(valuesSliceInter[2])
  122. assert.NoError(t, err)
  123. assert.EqualValues(t, 28, v3)
  124. v4, err := convertFloat(valuesSliceInter[3])
  125. assert.NoError(t, err)
  126. assert.Equal(t, "1.5", fmt.Sprintf("%v", v4))
  127. }
  128. func TestGetStruct(t *testing.T) {
  129. assert.NoError(t, prepareEngine())
  130. type UserinfoGet struct {
  131. Uid int `xorm:"pk autoincr"`
  132. IsMan bool
  133. }
  134. assert.NoError(t, testEngine.Sync2(new(UserinfoGet)))
  135. session := testEngine.NewSession()
  136. defer session.Close()
  137. var err error
  138. if testEngine.Dialect().DBType() == core.MSSQL {
  139. err = session.Begin()
  140. assert.NoError(t, err)
  141. _, err = session.Exec("SET IDENTITY_INSERT userinfo_get ON")
  142. assert.NoError(t, err)
  143. }
  144. cnt, err := session.Insert(&UserinfoGet{Uid: 2})
  145. assert.NoError(t, err)
  146. assert.EqualValues(t, 1, cnt)
  147. if testEngine.Dialect().DBType() == core.MSSQL {
  148. err = session.Commit()
  149. assert.NoError(t, err)
  150. }
  151. user := UserinfoGet{Uid: 2}
  152. has, err := testEngine.Get(&user)
  153. assert.NoError(t, err)
  154. assert.True(t, has)
  155. type NoIdUser struct {
  156. User string `xorm:"unique"`
  157. Remain int64
  158. Total int64
  159. }
  160. assert.NoError(t, testEngine.Sync2(&NoIdUser{}))
  161. userCol := testEngine.GetColumnMapper().Obj2Table("User")
  162. _, err = testEngine.Where("`"+userCol+"` = ?", "xlw").Delete(&NoIdUser{})
  163. assert.NoError(t, err)
  164. cnt, err = testEngine.Insert(&NoIdUser{"xlw", 20, 100})
  165. assert.NoError(t, err)
  166. assert.EqualValues(t, 1, cnt)
  167. noIdUser := new(NoIdUser)
  168. has, err = testEngine.Where("`"+userCol+"` = ?", "xlw").Get(noIdUser)
  169. assert.NoError(t, err)
  170. assert.True(t, has)
  171. }
  172. func TestGetSlice(t *testing.T) {
  173. assert.NoError(t, prepareEngine())
  174. type UserinfoSlice struct {
  175. Uid int `xorm:"pk autoincr"`
  176. IsMan bool
  177. }
  178. assertSync(t, new(UserinfoSlice))
  179. var users []UserinfoSlice
  180. has, err := testEngine.Get(&users)
  181. assert.False(t, has)
  182. assert.Error(t, err)
  183. }
  184. func TestGetError(t *testing.T) {
  185. assert.NoError(t, prepareEngine())
  186. type GetError struct {
  187. Uid int `xorm:"pk autoincr"`
  188. IsMan bool
  189. }
  190. assertSync(t, new(GetError))
  191. var info = new(GetError)
  192. has, err := testEngine.Get(&info)
  193. assert.False(t, has)
  194. assert.Error(t, err)
  195. has, err = testEngine.Get(info)
  196. assert.False(t, has)
  197. assert.NoError(t, err)
  198. }
  199. func TestJSONString(t *testing.T) {
  200. assert.NoError(t, prepareEngine())
  201. type JsonString struct {
  202. Id int64
  203. Content string `xorm:"json"`
  204. }
  205. type JsonJson struct {
  206. Id int64
  207. Content []string `xorm:"json"`
  208. }
  209. assertSync(t, new(JsonJson))
  210. _, err := testEngine.Insert(&JsonJson{
  211. Content: []string{"1", "2"},
  212. })
  213. assert.NoError(t, err)
  214. var js JsonString
  215. has, err := testEngine.Table("json_json").Get(&js)
  216. assert.NoError(t, err)
  217. assert.True(t, has)
  218. assert.EqualValues(t, 1, js.Id)
  219. assert.EqualValues(t, `["1","2"]`, js.Content)
  220. var jss []JsonString
  221. err = testEngine.Table("json_json").Find(&jss)
  222. assert.NoError(t, err)
  223. assert.EqualValues(t, 1, len(jss))
  224. assert.EqualValues(t, `["1","2"]`, jss[0].Content)
  225. }
  226. func TestGetActionMapping(t *testing.T) {
  227. assert.NoError(t, prepareEngine())
  228. type ActionMapping struct {
  229. ActionId string `xorm:"pk"`
  230. ActionName string `xorm:"index"`
  231. ScriptId string `xorm:"unique"`
  232. RollbackId string `xorm:"unique"`
  233. Env string
  234. Tags string
  235. Description string
  236. UpdateTime time.Time `xorm:"updated"`
  237. DeleteTime time.Time `xorm:"deleted"`
  238. }
  239. assertSync(t, new(ActionMapping))
  240. _, err := testEngine.Insert(&ActionMapping{
  241. ActionId: "1",
  242. ScriptId: "2",
  243. })
  244. assert.NoError(t, err)
  245. var valuesSlice = make([]string, 2)
  246. has, err := testEngine.Table(new(ActionMapping)).
  247. Cols("script_id", "rollback_id").
  248. ID("1").Get(&valuesSlice)
  249. assert.NoError(t, err)
  250. assert.True(t, has)
  251. assert.EqualValues(t, "2", valuesSlice[0])
  252. assert.EqualValues(t, "", valuesSlice[1])
  253. }
  254. func TestGetStructId(t *testing.T) {
  255. type TestGetStruct struct {
  256. Id int64
  257. }
  258. assert.NoError(t, prepareEngine())
  259. assertSync(t, new(TestGetStruct))
  260. _, err := testEngine.Insert(&TestGetStruct{})
  261. assert.NoError(t, err)
  262. _, err = testEngine.Insert(&TestGetStruct{})
  263. assert.NoError(t, err)
  264. type maxidst struct {
  265. Id int64
  266. }
  267. //var id int64
  268. var maxid maxidst
  269. sql := "select max(id) as id from " + testEngine.TableName(&TestGetStruct{}, true)
  270. has, err := testEngine.SQL(sql).Get(&maxid)
  271. assert.NoError(t, err)
  272. assert.True(t, has)
  273. assert.EqualValues(t, 2, maxid.Id)
  274. }
  275. func TestContextGet(t *testing.T) {
  276. type ContextGetStruct struct {
  277. Id int64
  278. Name string
  279. }
  280. assert.NoError(t, prepareEngine())
  281. assertSync(t, new(ContextGetStruct))
  282. _, err := testEngine.Insert(&ContextGetStruct{Name: "1"})
  283. assert.NoError(t, err)
  284. sess := testEngine.NewSession()
  285. defer sess.Close()
  286. context := NewMemoryContextCache()
  287. var c2 ContextGetStruct
  288. has, err := sess.ID(1).NoCache().ContextCache(context).Get(&c2)
  289. assert.NoError(t, err)
  290. assert.True(t, has)
  291. assert.EqualValues(t, 1, c2.Id)
  292. assert.EqualValues(t, "1", c2.Name)
  293. sql, args := sess.LastSQL()
  294. assert.True(t, len(sql) > 0)
  295. assert.True(t, len(args) > 0)
  296. var c3 ContextGetStruct
  297. has, err = sess.ID(1).NoCache().ContextCache(context).Get(&c3)
  298. assert.NoError(t, err)
  299. assert.True(t, has)
  300. assert.EqualValues(t, 1, c3.Id)
  301. assert.EqualValues(t, "1", c3.Name)
  302. sql, args = sess.LastSQL()
  303. assert.True(t, len(sql) == 0)
  304. assert.True(t, len(args) == 0)
  305. }
  306. func TestContextGet2(t *testing.T) {
  307. type ContextGetStruct2 struct {
  308. Id int64
  309. Name string
  310. }
  311. assert.NoError(t, prepareEngine())
  312. assertSync(t, new(ContextGetStruct2))
  313. _, err := testEngine.Insert(&ContextGetStruct2{Name: "1"})
  314. assert.NoError(t, err)
  315. context := NewMemoryContextCache()
  316. var c2 ContextGetStruct2
  317. has, err := testEngine.ID(1).NoCache().ContextCache(context).Get(&c2)
  318. assert.NoError(t, err)
  319. assert.True(t, has)
  320. assert.EqualValues(t, 1, c2.Id)
  321. assert.EqualValues(t, "1", c2.Name)
  322. var c3 ContextGetStruct2
  323. has, err = testEngine.ID(1).NoCache().ContextCache(context).Get(&c3)
  324. assert.NoError(t, err)
  325. assert.True(t, has)
  326. assert.EqualValues(t, 1, c3.Id)
  327. assert.EqualValues(t, "1", c3.Name)
  328. }
  329. type GetCustomTableInterface interface {
  330. TableName() string
  331. }
  332. type MyGetCustomTableImpletation struct {
  333. Id int64 `json:"id"`
  334. Name string `json:"name"`
  335. }
  336. const getCustomTableName = "GetCustomTableInterface"
  337. func (m *MyGetCustomTableImpletation) TableName() string {
  338. return getCustomTableName
  339. }
  340. func TestGetCustomTableInterface(t *testing.T) {
  341. assert.NoError(t, prepareEngine())
  342. assert.NoError(t, testEngine.Table(getCustomTableName).Sync2(new(MyGetCustomTableImpletation)))
  343. exist, err := testEngine.IsTableExist(getCustomTableName)
  344. assert.NoError(t, err)
  345. assert.True(t, exist)
  346. _, err = testEngine.Insert(&MyGetCustomTableImpletation{
  347. Name: "xlw",
  348. })
  349. assert.NoError(t, err)
  350. var c GetCustomTableInterface = new(MyGetCustomTableImpletation)
  351. has, err := testEngine.Get(c)
  352. assert.NoError(t, err)
  353. assert.True(t, has)
  354. }