Skip to content

Commit db97630

Browse files
authored
examples, orm: fix orm example; add -d trace_orm option to see all ORM generated queries (#17770)
* orm: add tracing of the generated queries by the orm module, when a program is compiled with `-d trace_orm` * examples: fix examples/database/orm.v, add comments, and ensure that the example can be run several times with no errors The example demonstrates connecting to all 3 DBs in the same program, and will be added to the CI very soon, to serve both as a regression test, if it fails, and as an example to how to use the ORM in combination with raw SQL queries to the DBs (which are driver/wrapper specific, unlike the ORM, but can be more convenient in some situations).
1 parent f5f45d8 commit db97630

File tree

2 files changed

+155
-94
lines changed

2 files changed

+155
-94
lines changed

examples/database/orm.v

Lines changed: 137 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,40 @@
1+
import os
12
import db.sqlite
2-
import db.mysql as sql
3+
import db.mysql
34
import 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']
639
struct Module {
740
id int [primary; sql: serial]
@@ -13,7 +46,7 @@ struct Module {
1346
struct 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
}

vlib/orm/orm.v

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,12 @@ pub fn orm_stmt_gen(sql_dialect SQLDialect, table string, q string, kind StmtKin
305305
}
306306
}
307307
str += ';'
308+
$if trace_orm_stmt ? {
309+
eprintln('> orm_stmt sql_dialect: ${sql_dialect} | table: ${table} | kind: ${kind} | query: ${str}')
310+
}
311+
$if trace_orm ? {
312+
eprintln('> orm: ${str}')
313+
}
308314
return str, QueryData{
309315
fields: data_fields
310316
data: data_data
@@ -393,6 +399,12 @@ pub fn orm_select_gen(orm SelectConfig, q string, num bool, qm string, start_pos
393399
}
394400

395401
str += ';'
402+
$if trace_orm_query ? {
403+
eprintln('> orm_query: ${str}')
404+
}
405+
$if trace_orm ? {
406+
eprintln('> orm: ${str}')
407+
}
396408
return str
397409
}
398410

@@ -515,6 +527,12 @@ pub fn orm_table_gen(table string, q string, defaults bool, def_unique_len int,
515527
fs << unique_fields
516528
str += fs.join(', ')
517529
str += ');'
530+
$if trace_orm_create ? {
531+
eprintln('> orm_create table: ${table} | query: ${str}')
532+
}
533+
$if trace_orm ? {
534+
eprintln('> orm: ${str}')
535+
}
518536
return str
519537
}
520538

0 commit comments

Comments
 (0)