v / vlib / orm
Raw file | 408 loc (322 sloc) | 6.15 KB | Latest commit hash d56373926
1// import db.mysql
2// import db.pg
3import time
4import db.sqlite
5
6const (
7 offset_const = 2
8)
9
10struct Module {
11 id int [primary; sql: serial]
12 name string
13 nr_downloads int
14 test_id u64
15 user User
16 created time.Time
17}
18
19[table: 'userlist']
20struct User {
21 id int [primary; sql: serial]
22 age int
23 name string [sql: 'username']
24 is_customer bool
25 skipped_string string [skip]
26 skipped_string2 string [sql: '-']
27 skipped_array []string [skip]
28 skipped_array2 []string [sql: '-']
29}
30
31struct Foo {
32 age int
33}
34
35struct TestTime {
36 id int [primary; sql: serial]
37 create time.Time
38}
39
40fn test_use_struct_field_as_limit() {
41 db := sqlite.connect(':memory:') or { panic(err) }
42
43 sql db {
44 create table User
45 }!
46
47 foo := Foo{
48 age: 10
49 }
50
51 sam := User{
52 age: 29
53 name: 'Sam'
54 skipped_string2: 'this should be ignored'
55 skipped_array: ['ignored', 'array']
56 skipped_array2: ['another', 'ignored', 'array']
57 }
58
59 sql db {
60 insert sam into User
61 }!
62
63 users := sql db {
64 select from User limit foo.age
65 }!
66
67 assert users.len == 1
68 assert users[0].name == 'Sam'
69 assert users[0].age == 29
70 assert users[0].skipped_string == ''
71 assert users[0].skipped_string2 == ''
72 assert users[0].skipped_array == [], 'skipped because of the [skip] tag, used for both sql and json'
73 assert users[0].skipped_array2 == [], "should be skipped, because of the sql specific [sql: '-'] tag"
74}
75
76fn test_orm() {
77 db := sqlite.connect(':memory:') or { panic(err) }
78
79 sql db {
80 create table Module
81 }!
82 sql db {
83 create table User
84 }!
85
86 name := 'Peter'
87
88 sam := User{
89 age: 29
90 name: 'Sam'
91 }
92
93 peter := User{
94 age: 31
95 name: 'Peter'
96 }
97
98 k := User{
99 age: 30
100 name: 'Kate'
101 is_customer: true
102 }
103
104 sql db {
105 insert sam into User
106 insert peter into User
107 insert k into User
108 }!
109
110 c := sql db {
111 select count from User where id != 1
112 }!
113 assert c == 2
114
115 nr_all_users := sql db {
116 select count from User
117 }!
118 assert nr_all_users == 3
119
120 nr_users1 := sql db {
121 select count from User where id == 1
122 }!
123 assert nr_users1 == 1
124
125 nr_peters := sql db {
126 select count from User where id == 2 && name == 'Peter'
127 }!
128 assert nr_peters == 1
129
130 nr_peters2 := sql db {
131 select count from User where id == 2 && name == name
132 }!
133 assert nr_peters2 == 1
134
135 nr_peters3 := sql db {
136 select count from User where name == name
137 }!
138 assert nr_peters3 == 1
139
140 peters := sql db {
141 select from User where name == name
142 }!
143 assert peters.len == 1
144 assert peters[0].name == 'Peter'
145
146 mut users := sql db {
147 select from User where name == name limit 1
148 }!
149
150 one_peter := users.first()
151 assert one_peter.name == 'Peter'
152 assert one_peter.id == 2
153
154 users = sql db {
155 select from User where id == 1
156 }!
157
158 user := users.first()
159 assert user.name == 'Sam'
160 assert user.id == 1
161 assert user.age == 29
162
163 users = sql db {
164 select from User where id > 0
165 }!
166 assert users.len == 3
167 assert users[0].name == 'Sam'
168 assert users[1].name == 'Peter'
169 assert users[1].age == 31
170
171 users2 := sql db {
172 select from User where id < 0
173 }!
174 assert users2.len == 0
175
176 users3 := sql db {
177 select from User where age == 29 || age == 31
178 }!
179
180 assert users3.len == 2
181 assert users3[0].age == 29
182 assert users3[1].age == 31
183
184 new_user := User{
185 name: 'New user'
186 age: 30
187 }
188 sql db {
189 insert new_user into User
190 }!
191
192 users = sql db {
193 select from User where id == 4
194 }!
195
196 x := users.first()
197 assert x.age == 30
198 assert x.id == 4
199 assert x.name == 'New user'
200
201 users = sql db {
202 select from User where id == 3
203 }!
204
205 kate := users.first()
206 assert kate.is_customer == true
207
208 users = sql db {
209 select from User where is_customer == true limit 1
210 }!
211
212 customer := users.first()
213 assert customer.is_customer == true
214 assert customer.name == 'Kate'
215
216 sql db {
217 update User set age = 31 where name == 'Kate'
218 }!
219
220 users = sql db {
221 select from User where id == 3
222 }!
223 kate2 := users.first()
224 assert kate2.age == 31
225 assert kate2.name == 'Kate'
226
227 sql db {
228 update User set age = 32, name = 'Kate N' where name == 'Kate'
229 }!
230
231 users = sql db {
232 select from User where id == 3
233 }!
234 mut kate3 := users.first()
235 assert kate3.age == 32
236 assert kate3.name == 'Kate N'
237
238 new_age := 33
239 sql db {
240 update User set age = new_age, name = 'Kate N' where id == 3
241 }!
242
243 users = sql db {
244 select from User where id == 3
245 }!
246
247 kate3 = users.first()
248 assert kate3.age == 33
249 assert kate3.name == 'Kate N'
250
251 foo := Foo{34}
252 sql db {
253 update User set age = foo.age, name = 'Kate N' where id == 3
254 }!
255
256 users = sql db {
257 select from User where id == 3
258 }!
259 kate3 = users.first()
260 assert kate3.age == 34
261 assert kate3.name == 'Kate N'
262
263 no_user := sql db {
264 select from User where id == 30
265 }!
266
267 assert no_user.len == 0
268
269 two_users := sql db {
270 select from User limit 2
271 }!
272 assert two_users.len == 2
273 assert two_users[0].id == 1
274
275 y := sql db {
276 select from User limit 2 offset 1
277 }!
278 assert y.len == 2
279 assert y[0].id == 2
280
281 z := sql db {
282 select from User order by id limit 2 offset offset_const
283 }!
284 assert z.len == 2
285 assert z[0].id == 3
286
287 users = sql db {
288 select from User order by age desc limit 1
289 }!
290
291 oldest := users.first()
292 assert oldest.age == 34
293
294 offs := 1
295 users = sql db {
296 select from User order by age desc limit 1 offset offs
297 }!
298
299 second_oldest := users.first()
300 assert second_oldest.age == 31
301 sql db {
302 delete from User where age == 34
303 }!
304
305 users = sql db {
306 select from User order by age desc limit 1
307 }!
308 updated_oldest := users.first()
309 assert updated_oldest.age == 31
310
311 // Remove this when pg is used
312 // db.exec('insert into User (name, age) values (NULL, 31)')
313 users = sql db {
314 select from User where id == 5
315 }!
316 assert users.len == 0
317
318 users = sql db {
319 select from User where id == 1
320 }!
321 age_test := users.first()
322
323 assert age_test.age == 29
324
325 sql db {
326 update User set age = age + 1 where id == 1
327 }!
328
329 users = sql db {
330 select from User where id == 1
331 }!
332
333 mut first := users.first()
334 assert first.age == 30
335
336 sql db {
337 update User set age = age * 2 where id == 1
338 }!
339
340 users = sql db {
341 select from User where id == 1
342 }!
343
344 first = users.first()
345 assert first.age == 60
346
347 sql db {
348 create table TestTime
349 }!
350
351 tnow := time.now()
352
353 time_test := TestTime{
354 create: tnow
355 }
356
357 sql db {
358 insert time_test into TestTime
359 }!
360
361 data := sql db {
362 select from TestTime where create == tnow
363 }!
364
365 assert data.len == 1
366 assert tnow.unix == data[0].create.unix
367
368 mod := Module{}
369
370 sql db {
371 insert mod into Module
372 }!
373
374 sql db {
375 update Module set test_id = 11 where id == 1
376 }!
377
378 mut modules := sql db {
379 select from Module where id == 1
380 }!
381
382 assert modules.first().test_id == 11
383
384 t := time.now()
385 sql db {
386 update Module set created = t where id == 1
387 }!
388
389 modules = sql db {
390 select from Module where id == 1
391 }!
392
393 // Note: usually updated_time_mod.created != t, because t has
394 // its microseconds set, while the value retrieved from the DB
395 // has them zeroed, because the db field resolution is seconds.
396 assert modules.first().created.format_ss() == t.format_ss()
397
398 users = sql db {
399 select from User where (name == 'Sam' && is_customer == true) || id == 1
400 }!
401
402 assert users.first() == first
403
404 sql db {
405 drop table Module
406 drop table TestTime
407 }!
408}