v / vlib / db / sqlite / parent_child_test.v
93 lines · 81 sloc · 1.66 KB · 01093d6cce02bb7428caa37d4a206fcdd9f4005e
Raw
1// vtest build: present_sqlite3?
2import db.sqlite
3
4struct Parent {
5 id int @[primary; sql: serial]
6 name string
7 children []Child @[fkey: 'parent_id']
8}
9
10struct Child {
11 id int @[primary; sql: serial]
12 name string
13 parent_id int
14 babies []Baby @[fkey: 'child_id']
15}
16
17struct Baby {
18 id int @[primary; sql: serial]
19 name string
20 child_id int
21}
22
23fn test_main() {
24 mut db := sqlite.connect(':memory:')!
25
26 sql db {
27 create table Parent
28 create table Child
29 create table Baby
30 } or { panic(err) }
31
32 new_parent := Parent{
33 name: 'first parent'
34 children: [
35 Child{
36 name: 'first child'
37 },
38 Child{
39 name: 'second_child'
40 },
41 ]
42 }
43
44 sql db {
45 insert new_parent into Parent
46 } or { panic(err) }
47
48 babies := [
49 Baby{
50 name: 'first baby'
51 child_id: 1
52 },
53 Baby{
54 name: 'second baby'
55 child_id: 1
56 },
57 Baby{
58 name: 'third baby'
59 child_id: 2
60 },
61 Baby{
62 name: 'fourth baby'
63 child_id: 2
64 },
65 Baby{
66 name: 'fifth baby'
67 child_id: 2
68 },
69 ]
70
71 for v in babies {
72 sql db {
73 insert v into Baby
74 } or { panic(err) }
75 }
76
77 parent := sql db {
78 select from Parent
79 } or { panic(err) }
80
81 assert parent[0].children[0].id == 1
82 assert parent[0].children[1].id == 2
83 assert parent[0].children.len == 2
84 assert parent[0].children[0].babies.len == 2
85 assert parent[0].children[1].babies.len == 3
86 assert parent[0].children[0].babies[0].name == 'first baby'
87 assert parent[0].children[0].babies[1].name == 'second baby'
88 assert parent[0].children[1].babies[0].name == 'third baby'
89 assert parent[0].children[1].babies[1].name == 'fourth baby'
90 assert parent[0].children[1].babies[2].name == 'fifth baby'
91
92 db.close()!
93}
94