v / examples / database / orm.v
293 lines · 273 sloc · 5.88 KB · 7039081d66b63e5c914b640d93e620889a18a693
Raw
1// vtest build: !(macos || windows)
2import os
3import db.sqlite
4import db.mysql
5import db.pg
6
7// The goal of this example, is to show how you can connect to
8// several different databases in the same program, and use both
9// the ORM and the native connection wrapper, that each DB driver
10// provides, if you need to execute more complex SQL queries.
11//
12// You can use environment variables to pass your local DB connection
13// settings, without editing the code, like this:
14//
15// MUSER='myuser' MPASS='abc' MDATABASE='vtestdb' PGUSER='postgres' PGPASS='password' PGDATABASE='postgres' ./v -g run examples/database/orm.v
16//
17// WARNING: this example will drop and re-create any tables named:
18// * modules
19// * User
20// * Parent
21// * Child
22// in the passed databases, so it is better to use empty DBs for it.
23
24const mysql_host = os.getenv_opt('MHOST') or { 'localhost' }
25const mysql_port = os.getenv_opt('MPORT') or { '3306' }.u32()
26const mysql_user = os.getenv_opt('MUSER') or { 'myuser' }
27const mysql_pass = os.getenv_opt('MPASS') or { 'abc' }
28const mysql_db = os.getenv_opt('MDATABASE') or { 'test' }
29
30const pg_host = os.getenv_opt('PGHOST') or { 'localhost' }
31const pg_user = os.getenv_opt('PGUSER') or { 'test' }
32const pg_pass = os.getenv_opt('PGPASS') or { 'abc' }
33const pg_db = os.getenv_opt('PGDATABASE') or { 'test' }
34
35@[table: 'modules']
36struct Module {
37 id int @[primary; sql: serial]
38 name string
39 nr_downloads int @[sql: u64]
40 creator User
41}
42
43struct User {
44 id int @[primary; sql: serial]
45 age u32 @[unique: 'user']
46 name string @[sql: 'username'; sql_type: 'VARCHAR(200)'; unique]
47 is_customer bool @[sql: 'abc'; unique: 'user']
48 skipped_string string @[skip]
49}
50
51struct Parent {
52 id int @[primary; sql: serial]
53 name string
54 children []Child @[fkey: 'parent_id']
55}
56
57struct Child {
58 id int @[primary; sql: serial]
59 parent_id int
60 name string
61}
62
63fn sqlite3_array() ! {
64 eprintln('------------ ${@METHOD} -----------------')
65 mut db := sqlite.connect(':memory:')!
66 defer {
67 sql db {
68 drop table Parent
69 drop table Child
70 } or {}
71 db.close() or {}
72 }
73
74 sql db {
75 create table Parent
76 }!
77 sql db {
78 create table Child
79 }!
80 par := Parent{
81 name: 'test'
82 children: [
83 Child{
84 name: 'abc'
85 },
86 Child{
87 name: 'def'
88 },
89 ]
90 }
91 sql db {
92 insert par into Parent
93 }!
94 parent := sql db {
95 select from Parent where id == 1
96 }!
97 eprintln(parent)
98}
99
100fn msql_array() ! {
101 eprintln('------------ ${@METHOD} -----------------')
102 mut db := mysql.connect(
103 host: mysql_host
104 port: mysql_port
105 username: mysql_user
106 password: mysql_pass
107 dbname: mysql_db
108 )!
109 defer {
110 sql db {
111 drop table Parent
112 } or {}
113 db.close() or {}
114 }
115
116 db.query('drop table if exists Parent')!
117 db.query('drop table if exists Child')!
118 sql db {
119 create table Parent
120 create table Child
121 }!
122 par := Parent{
123 name: 'test'
124 children: [
125 Child{
126 name: 'abc'
127 },
128 Child{
129 name: 'def'
130 },
131 ]
132 }
133 sql db {
134 insert par into Parent
135 }!
136 parent := sql db {
137 select from Parent where id == 1
138 }!
139 eprintln(parent)
140}
141
142fn psql_array() ! {
143 eprintln('------------ ${@METHOD} -----------------')
144 mut db := pg.connect(host: pg_host, user: pg_user, password: pg_pass, dbname: pg_db)!
145 defer {
146 db.exec_one('drop table if exists "Parent", "Child"') or { eprintln(err) }
147 db.close() or {}
148 }
149 db.exec_one('drop table if exists "Parent", "Child"') or { eprintln(err) }
150
151 sql db {
152 create table Parent
153 create table Child
154 }!
155 par := Parent{
156 name: 'test'
157 children: [
158 Child{
159 name: 'abc'
160 },
161 Child{
162 name: 'def'
163 },
164 ]
165 }
166 sql db {
167 insert par into Parent
168 }!
169 parent := sql db {
170 select from Parent where id == 1
171 }!
172 eprintln(parent)
173}
174
175fn sqlite3() ! {
176 eprintln('------------ ${@METHOD} -----------------')
177 mut db := sqlite.connect(':memory:')!
178 defer {
179 sql db {
180 drop table Module
181 drop table User
182 } or {}
183 db.close() or {}
184 }
185
186 sql db {
187 create table Module
188 }!
189 sql db {
190 create table User
191 }!
192 mod := Module{
193 name: 'test'
194 nr_downloads: 10
195 creator: User{
196 age: 21
197 name: 'VUser'
198 is_customer: true
199 }
200 }
201 sql db {
202 insert mod into Module
203 }!
204 modul := sql db {
205 select from Module where id == 1
206 }!
207 eprintln(modul)
208}
209
210fn msql() ! {
211 eprintln('------------ ${@METHOD} -----------------')
212 mut conn := mysql.connect(
213 host: mysql_host
214 port: mysql_port
215 username: mysql_user
216 password: mysql_pass
217 dbname: mysql_db
218 )!
219 defer {
220 conn.query('DROP TABLE IF EXISTS Module') or { eprintln(err) }
221 conn.query('DROP TABLE IF EXISTS User') or { eprintln(err) }
222 conn.close() or {}
223 }
224 conn.query('DROP TABLE IF EXISTS Module') or { eprintln(err) }
225 conn.query('DROP TABLE IF EXISTS User') or { eprintln(err) }
226
227 sql conn {
228 create table Module
229 }!
230 sql conn {
231 create table User
232 }!
233 mod := Module{
234 name: 'test'
235 nr_downloads: 10
236 creator: User{
237 age: 21
238 name: 'VUser'
239 is_customer: true
240 }
241 }
242 sql conn {
243 insert mod into Module
244 }!
245 m := sql conn {
246 select from Module where id == 1
247 }!
248 eprintln(m)
249}
250
251fn psql() ! {
252 eprintln('------------ ${@METHOD} -----------------')
253 mut db := pg.connect(host: pg_host, user: pg_user, password: pg_pass, dbname: pg_db)!
254 defer {
255 db.exec_one('drop table if exists "modules", "User"') or { eprintln(err) }
256 db.close() or {}
257 }
258 db.exec_one('drop table if exists "modules", "User"') or { eprintln(err) }
259 sql db {
260 create table Module
261 create table User
262 }!
263 mod := Module{
264 name: 'test'
265 nr_downloads: 10
266 creator: User{
267 age: 21
268 name: 'VUser'
269 is_customer: true
270 }
271 }
272 sql db {
273 insert mod into Module
274 }!
275 modul := sql db {
276 select from Module where id == 1
277 }!
278 sql db {
279 drop table Module
280 }!
281 eprintln(modul)
282}
283
284fn main() {
285 eprintln('------------ ${@METHOD} -----------------')
286 sqlite3_array()!
287 msql_array()!
288 psql_array()!
289
290 sqlite3()!
291 msql()!
292 psql()!
293}
294