| 1 | // vtest build: !(macos || windows) |
| 2 | import os |
| 3 | import db.sqlite |
| 4 | import db.mysql |
| 5 | import 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 | |
| 24 | const mysql_host = os.getenv_opt('MHOST') or { 'localhost' } |
| 25 | const mysql_port = os.getenv_opt('MPORT') or { '3306' }.u32() |
| 26 | const mysql_user = os.getenv_opt('MUSER') or { 'myuser' } |
| 27 | const mysql_pass = os.getenv_opt('MPASS') or { 'abc' } |
| 28 | const mysql_db = os.getenv_opt('MDATABASE') or { 'test' } |
| 29 | |
| 30 | const pg_host = os.getenv_opt('PGHOST') or { 'localhost' } |
| 31 | const pg_user = os.getenv_opt('PGUSER') or { 'test' } |
| 32 | const pg_pass = os.getenv_opt('PGPASS') or { 'abc' } |
| 33 | const pg_db = os.getenv_opt('PGDATABASE') or { 'test' } |
| 34 | |
| 35 | @[table: 'modules'] |
| 36 | struct Module { |
| 37 | id int @[primary; sql: serial] |
| 38 | name string |
| 39 | nr_downloads int @[sql: u64] |
| 40 | creator User |
| 41 | } |
| 42 | |
| 43 | struct 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 | |
| 51 | struct Parent { |
| 52 | id int @[primary; sql: serial] |
| 53 | name string |
| 54 | children []Child @[fkey: 'parent_id'] |
| 55 | } |
| 56 | |
| 57 | struct Child { |
| 58 | id int @[primary; sql: serial] |
| 59 | parent_id int |
| 60 | name string |
| 61 | } |
| 62 | |
| 63 | fn 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 | |
| 100 | fn 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 | |
| 142 | fn 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 | |
| 175 | fn 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 | |
| 210 | fn 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 | |
| 251 | fn 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 | |
| 284 | fn main() { |
| 285 | eprintln('------------ ${@METHOD} -----------------') |
| 286 | sqlite3_array()! |
| 287 | msql_array()! |
| 288 | psql_array()! |
| 289 | |
| 290 | sqlite3()! |
| 291 | msql()! |
| 292 | psql()! |
| 293 | } |
| 294 | |