1+ import os
12import db.sqlite
2- import db.mysql as sql
3+ import db.mysql
34import db.pg
45
6+ // The goal of this example, is to show how you can connect to
7+ // several different databases in the same program, and use both
8+ // the ORM and the native connection wrapper, that each DB driver
9+ // provides, if you need to execute more complex SQL queries.
10+ //
11+ // You can use environment variables to pass your local DB connection
12+ // settings, without editing the code, like this:
13+ //
14+ // MUSER='myuser' MPASS='abc' MDATABASE='vtestdb' PGUSER='postgres' PGPASS='password' PGDATABASE='postgres' ./v -g run examples/database/orm.v
15+ //
16+ // WARNING: this example will drop and re-create any tables named:
17+ // * modules
18+ // * User
19+ // * Parent
20+ // * Child
21+ // in the passed databases, so it is better to use empty DBs for it.
22+
23+ const (
24+ mysql_host = os.getenv_opt ('MHOST' ) or { 'localhost' }
25+ mysql_port = os.getenv_opt ('MPORT' ) or { '3306' }.u32 ()
26+ mysql_user = os.getenv_opt ('MUSER' ) or { 'myuser' }
27+ mysql_pass = os.getenv_opt ('MPASS' ) or { 'abc' }
28+ mysql_db = os.getenv_opt ('MDATABASE' ) or { 'test' }
29+ )
30+
31+ const (
32+ pg_host = os.getenv_opt ('PGHOST' ) or { 'localhost' }
33+ pg_user = os.getenv_opt ('PGUSER' ) or { 'test' }
34+ pg_pass = os.getenv_opt ('PGPASS' ) or { 'abc' }
35+ pg_db = os.getenv_opt ('PGDATABASE' ) or { 'test' }
36+ )
37+
538[table: 'modules' ]
639struct Module {
740 id int [primary; sql: serial]
@@ -13,7 +46,7 @@ struct Module {
1346struct User {
1447 id int [primary; sql: serial]
1548 age u32 [unique: 'user' ]
16- name string [sql: 'username' ; unique]
49+ name string [sql: 'username' ; sql_type: 'VARCHAR(200)' ; unique]
1750 is_customer bool [sql: 'abc' ; unique: 'user' ]
1851 skipped_string string [skip]
1952}
@@ -30,22 +63,23 @@ struct Child {
3063 name string
3164}
3265
33- fn main () {
34- sqlite3_array ()
35- mysql_array ()
36- psql_array ()
37-
38- sqlite3 ()
39- mysql ()
40- psql ()
41- }
42-
43- fn sqlite3_array () {
44- mut db := sqlite.connect (':memory:' ) or { panic (err) }
66+ fn sqlite3_array () ! {
67+ eprintln ('------------ ${@METHOD} -----------------' )
68+ mut db := sqlite.connect (':memory:' )!
69+ defer {
70+ sql db {
71+ drop table Parent
72+ drop table Child
73+ }
74+ db.close () or {}
75+ }
76+ //
4577 sql db {
4678 create table Parent
4779 }
48-
80+ sql db {
81+ create table Child
82+ }
4983 par := Parent{
5084 name: 'test'
5185 children: [
@@ -57,36 +91,38 @@ fn sqlite3_array() {
5791 },
5892 ]
5993 }
60-
6194 sql db {
6295 insert par into Parent
6396 }
64-
6597 parent := sql db {
6698 select from Parent where id == 1
6799 }
68-
69- sql db {
70- drop table Parent
71- }
72-
73100 eprintln (parent)
74101}
75102
76- fn mysql_array () {
77- mut db := sql.Connection{
78- host: 'localhost'
79- port: 3306
80- username: 'root'
81- password: 'abc'
82- dbname: 'test'
83- }
84- db.connect () or { panic (err) }
85-
103+ fn msql_array () ! {
104+ eprintln ('------------ ${@METHOD} -----------------' )
105+ mut db := mysql.Connection{
106+ host: mysql_host
107+ port: mysql_port
108+ username: mysql_user
109+ password: mysql_pass
110+ dbname: mysql_db
111+ }
112+ db.connect ()!
113+ defer {
114+ sql db {
115+ drop table Parent
116+ }
117+ db.close ()
118+ }
119+ //
120+ db.query ('drop table if exists Parent' )!
121+ db.query ('drop table if exists Child' )!
86122 sql db {
87123 create table Parent
124+ create table Child
88125 }
89-
90126 par := Parent{
91127 name: 'test'
92128 children: [
@@ -98,33 +134,28 @@ fn mysql_array() {
98134 },
99135 ]
100136 }
101-
102137 sql db {
103138 insert par into Parent
104139 }
105-
106140 parent := sql db {
107141 select from Parent where id == 1
108142 }
109-
110143 eprintln (parent)
111-
112- sql db {
113- drop table Parent
114- }
115-
116- db.close ()
117144}
118145
119- fn psql_array () {
120- mut db := pg.connect (host: 'localhost' , user: 'test' , password: 'abc' , dbname: 'test' ) or {
121- panic (err)
146+ fn psql_array () ! {
147+ eprintln ('------------ ${@METHOD} -----------------' )
148+ mut db := pg.connect (host: pg_host, user: pg_user, password: pg_pass, dbname: pg_db)!
149+ defer {
150+ db.exec_one ('drop table if exists "Parent", "Child"' ) or { eprintln (err) }
151+ db.close ()
122152 }
123-
153+ db.exec_one ('drop table if exists "Parent", "Child"' ) or { eprintln (err) }
154+ //
124155 sql db {
125156 create table Parent
157+ create table Child
126158 }
127-
128159 par := Parent{
129160 name: 'test'
130161 children: [
@@ -136,30 +167,34 @@ fn psql_array() {
136167 },
137168 ]
138169 }
139-
140170 sql db {
141171 insert par into Parent
142172 }
143-
144173 parent := sql db {
145174 select from Parent where id == 1
146175 }
147-
148176 eprintln (parent)
149-
150- sql db {
151- drop table Parent
152- }
153-
154- db.close ()
155177}
156178
157- fn sqlite3 () {
158- mut db := sqlite.connect (':memory:' ) or { panic (err) }
179+ fn sqlite3 () ! {
180+ eprintln ('------------ ${@METHOD} -----------------' )
181+ mut db := sqlite.connect (':memory:' )!
182+ defer {
183+ sql db {
184+ drop table Module
185+ }
186+ sql db {
187+ drop table User
188+ }
189+ db.close () or {}
190+ }
191+ //
159192 sql db {
160193 create table Module
161194 }
162-
195+ sql db {
196+ create table User
197+ }
163198 mod := Module{
164199 name: 'test'
165200 nr_downloads: 10
@@ -172,33 +207,36 @@ fn sqlite3() {
172207 sql db {
173208 insert mod into Module
174209 }
175-
176210 modul := sql db {
177211 select from Module where id == 1
178212 }
179-
180- sql db {
181- drop table Module
182- }
183-
184213 eprintln (modul)
185- db.close () or { panic (err) }
186214}
187215
188- fn mysql () {
189- mut conn := sql.Connection{
190- host: 'localhost'
191- port: 3306
192- username: 'root'
193- password: 'abc'
194- dbname: 'test'
195- }
196- conn.connect () or { panic (err) }
197-
216+ fn msql () ! {
217+ eprintln ('------------ ${@METHOD} -----------------' )
218+ mut conn := mysql.Connection{
219+ host: mysql_host
220+ port: mysql_port
221+ username: mysql_user
222+ password: mysql_pass
223+ dbname: mysql_db
224+ }
225+ conn.connect ()!
226+ defer {
227+ conn.query ('DROP TABLE IF EXISTS Module' ) or { eprintln (err) }
228+ conn.query ('DROP TABLE IF EXISTS User' ) or { eprintln (err) }
229+ conn.close ()
230+ }
231+ conn.query ('DROP TABLE IF EXISTS Module' ) or { eprintln (err) }
232+ conn.query ('DROP TABLE IF EXISTS User' ) or { eprintln (err) }
233+ //
198234 sql conn {
199235 create table Module
200236 }
201-
237+ sql conn {
238+ create table User
239+ }
202240 mod := Module{
203241 name: 'test'
204242 nr_downloads: 10
@@ -208,24 +246,27 @@ fn mysql() {
208246 is_customer: true
209247 }
210248 }
211-
212249 sql conn {
213250 insert mod into Module
214251 }
215-
216252 m := sql conn {
217253 select from Module where id == 1
218254 }
219-
220255 eprintln (m)
221- conn.close ()
222256}
223257
224- fn psql () {
225- mut db := pg.connect (host: 'localhost' , user: 'test' , password: 'abc' , dbname: 'test' ) or {
226- panic (err)
258+ fn psql () ! {
259+ eprintln ('------------ ${@METHOD} -----------------' )
260+ mut db := pg.connect (host: pg_host, user: pg_user, password: pg_pass, dbname: pg_db)!
261+ defer {
262+ db.exec_one ('drop table if exists "modules", "User"' ) or { eprintln (err) }
263+ db.close ()
264+ }
265+ db.exec_one ('drop table if exists "modules", "User"' ) or { eprintln (err) }
266+ sql db {
267+ create table Module
268+ create table User
227269 }
228-
229270 mod := Module{
230271 name: 'test'
231272 nr_downloads: 10
@@ -235,23 +276,25 @@ fn psql() {
235276 is_customer: true
236277 }
237278 }
238-
239- sql db {
240- create table Module
241- }
242-
243279 sql db {
244280 insert mod into Module
245281 }
246-
247282 modul := sql db {
248283 select from Module where id == 1
249284 }
250-
251285 sql db {
252286 drop table Module
253287 }
254-
255288 eprintln (modul)
256- db.close ()
289+ }
290+
291+ fn main () {
292+ eprintln ('------------ ${@METHOD} -----------------' )
293+ sqlite3_array ()!
294+ msql_array ()!
295+ psql_array ()!
296+
297+ sqlite3 ()!
298+ msql ()!
299+ psql ()!
257300}
0 commit comments