2020-12-26 15:40:22 +03:00
|
|
|
// import os
|
|
|
|
// import term
|
2022-06-16 20:19:49 +03:00
|
|
|
// import mysql
|
2022-05-26 22:53:09 +03:00
|
|
|
// import pg
|
2022-06-16 20:19:49 +03:00
|
|
|
import time
|
2020-06-16 13:14:22 +03:00
|
|
|
import sqlite
|
2020-06-07 16:44:33 +03:00
|
|
|
|
2020-06-17 05:05:13 +03:00
|
|
|
struct Module {
|
2021-10-28 22:31:41 +03:00
|
|
|
id int [primary; sql: serial]
|
2020-12-26 15:40:22 +03:00
|
|
|
name string
|
2020-06-28 22:10:49 +03:00
|
|
|
nr_downloads int
|
2021-09-26 11:17:56 +03:00
|
|
|
test_id u64
|
2021-07-23 12:33:55 +03:00
|
|
|
user User
|
2021-10-28 22:31:41 +03:00
|
|
|
created time.Time
|
2020-06-28 22:10:49 +03:00
|
|
|
}
|
|
|
|
|
2021-04-15 10:53:43 +03:00
|
|
|
[table: 'userlist']
|
2020-06-28 22:10:49 +03:00
|
|
|
struct User {
|
2021-04-15 10:53:43 +03:00
|
|
|
id int [primary; sql: serial]
|
2020-12-26 15:40:22 +03:00
|
|
|
age int
|
2021-04-15 10:53:43 +03:00
|
|
|
name string [sql: 'username']
|
2020-12-26 15:40:22 +03:00
|
|
|
is_customer bool
|
2020-06-28 22:10:49 +03:00
|
|
|
skipped_string string [skip]
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Foo {
|
|
|
|
age int
|
2019-08-02 07:57:35 +03:00
|
|
|
}
|
|
|
|
|
2021-08-03 05:17:00 +03:00
|
|
|
struct TestTime {
|
|
|
|
id int [primary; sql: serial]
|
|
|
|
create time.Time
|
|
|
|
}
|
|
|
|
|
2022-05-26 22:53:09 +03:00
|
|
|
fn test_orm() {
|
2021-03-01 02:18:14 +03:00
|
|
|
db := sqlite.connect(':memory:') or { panic(err) }
|
2022-06-16 20:19:49 +03:00
|
|
|
db.exec('drop table if exists User')
|
2022-05-26 22:53:09 +03:00
|
|
|
|
|
|
|
// db := pg.connect(host: 'localhost', port: 5432, user: 'louis', password: 'abc', dbname: 'orm') or { panic(err) }
|
2022-06-16 20:19:49 +03:00
|
|
|
/*
|
|
|
|
mut db := mysql.Connection{
|
|
|
|
host: '127.0.0.1'
|
|
|
|
username: 'root'
|
|
|
|
password: 'pw'
|
|
|
|
dbname: 'v'
|
|
|
|
}
|
|
|
|
db.connect() or { panic(err) }*/
|
2022-05-26 22:53:09 +03:00
|
|
|
|
2021-04-07 16:27:02 +03:00
|
|
|
sql db {
|
2021-09-26 11:17:56 +03:00
|
|
|
create table Module
|
2021-04-07 16:27:02 +03:00
|
|
|
}
|
2021-04-27 15:28:57 +03:00
|
|
|
|
2020-06-22 17:52:03 +03:00
|
|
|
name := 'Peter'
|
2021-04-27 15:28:57 +03:00
|
|
|
|
|
|
|
sam := User{
|
|
|
|
age: 29
|
|
|
|
name: 'Sam'
|
|
|
|
}
|
|
|
|
|
|
|
|
peter := User{
|
|
|
|
age: 31
|
|
|
|
name: 'Peter'
|
|
|
|
}
|
|
|
|
|
|
|
|
k := User{
|
|
|
|
age: 30
|
|
|
|
name: 'Kate'
|
|
|
|
is_customer: true
|
|
|
|
}
|
|
|
|
|
|
|
|
sql db {
|
|
|
|
insert sam into User
|
|
|
|
insert peter into User
|
|
|
|
insert k into User
|
|
|
|
}
|
2021-02-01 23:44:09 +03:00
|
|
|
|
2021-04-08 03:13:25 +03:00
|
|
|
c := sql db {
|
|
|
|
select count from User where id != 1
|
|
|
|
}
|
|
|
|
assert c == 2
|
|
|
|
|
2020-06-17 01:59:33 +03:00
|
|
|
nr_all_users := sql db {
|
|
|
|
select count from User
|
2020-06-16 13:14:22 +03:00
|
|
|
}
|
2020-06-17 01:59:33 +03:00
|
|
|
assert nr_all_users == 3
|
|
|
|
println('nr_all_users=$nr_all_users')
|
|
|
|
//
|
|
|
|
nr_users1 := sql db {
|
|
|
|
select count from User where id == 1
|
|
|
|
}
|
|
|
|
assert nr_users1 == 1
|
|
|
|
println('nr_users1=$nr_users1')
|
|
|
|
//
|
|
|
|
nr_peters := sql db {
|
|
|
|
select count from User where id == 2 && name == 'Peter'
|
|
|
|
}
|
|
|
|
assert nr_peters == 1
|
|
|
|
println('nr_peters=$nr_peters')
|
|
|
|
//
|
2020-06-22 17:52:03 +03:00
|
|
|
nr_peters2 := sql db {
|
|
|
|
select count from User where id == 2 && name == name
|
2020-06-17 01:59:33 +03:00
|
|
|
}
|
2020-06-22 17:52:03 +03:00
|
|
|
assert nr_peters2 == 1
|
|
|
|
nr_peters3 := sql db {
|
|
|
|
select count from User where name == name
|
|
|
|
}
|
|
|
|
assert nr_peters3 == 1
|
|
|
|
peters := sql db {
|
2020-06-22 17:58:43 +03:00
|
|
|
select from User where name == name
|
2020-06-22 17:52:03 +03:00
|
|
|
}
|
|
|
|
assert peters.len == 1
|
|
|
|
assert peters[0].name == 'Peter'
|
2020-06-22 17:58:43 +03:00
|
|
|
one_peter := sql db {
|
|
|
|
select from User where name == name limit 1
|
|
|
|
}
|
|
|
|
assert one_peter.name == 'Peter'
|
|
|
|
assert one_peter.id == 2
|
2020-06-17 05:05:13 +03:00
|
|
|
//
|
|
|
|
user := sql db {
|
|
|
|
select from User where id == 1
|
|
|
|
}
|
|
|
|
println(user)
|
|
|
|
assert user.name == 'Sam'
|
|
|
|
assert user.id == 1
|
|
|
|
assert user.age == 29
|
2020-06-17 15:18:32 +03:00
|
|
|
//
|
|
|
|
users := sql db {
|
|
|
|
select from User where id > 0
|
|
|
|
}
|
|
|
|
println(users)
|
|
|
|
assert users.len == 3
|
|
|
|
assert users[0].name == 'Sam'
|
|
|
|
assert users[1].name == 'Peter'
|
|
|
|
assert users[1].age == 31
|
2020-06-17 15:29:44 +03:00
|
|
|
//
|
|
|
|
users2 := sql db {
|
|
|
|
select from User where id < 0
|
|
|
|
}
|
|
|
|
println(users2)
|
|
|
|
assert users2.len == 0
|
|
|
|
//
|
|
|
|
users3 := sql db {
|
|
|
|
select from User where age == 29 || age == 31
|
|
|
|
}
|
|
|
|
println(users3)
|
|
|
|
assert users3.len == 2
|
|
|
|
assert users3[0].age == 29
|
|
|
|
assert users3[1].age == 31
|
2020-06-19 17:43:32 +03:00
|
|
|
//
|
2021-05-16 04:28:11 +03:00
|
|
|
missing_user := sql db {
|
|
|
|
select from User where id == 8777
|
|
|
|
}
|
|
|
|
println('missing_user:')
|
|
|
|
println(missing_user) // zero struct
|
|
|
|
//
|
2020-12-26 15:40:22 +03:00
|
|
|
new_user := User{
|
|
|
|
name: 'New user'
|
|
|
|
age: 30
|
|
|
|
}
|
2020-06-19 17:43:32 +03:00
|
|
|
sql db {
|
|
|
|
insert new_user into User
|
|
|
|
}
|
2021-04-27 15:28:57 +03:00
|
|
|
|
2020-12-26 15:40:22 +03:00
|
|
|
// db.insert<User>(user2)
|
2020-06-19 17:43:32 +03:00
|
|
|
x := sql db {
|
|
|
|
select from User where id == 4
|
|
|
|
}
|
|
|
|
println(x)
|
|
|
|
assert x.age == 30
|
|
|
|
assert x.id == 4
|
|
|
|
assert x.name == 'New user'
|
2020-06-23 14:59:00 +03:00
|
|
|
//
|
|
|
|
kate := sql db {
|
|
|
|
select from User where id == 3
|
|
|
|
}
|
|
|
|
assert kate.is_customer == true
|
|
|
|
//
|
|
|
|
customer := sql db {
|
|
|
|
select from User where is_customer == true limit 1
|
|
|
|
}
|
|
|
|
assert customer.is_customer == true
|
|
|
|
assert customer.name == 'Kate'
|
2020-06-24 15:32:14 +03:00
|
|
|
//
|
|
|
|
sql db {
|
2020-06-24 17:35:18 +03:00
|
|
|
update User set age = 31 where name == 'Kate'
|
2020-06-24 15:32:14 +03:00
|
|
|
}
|
2021-04-27 15:28:57 +03:00
|
|
|
|
2020-06-25 18:12:32 +03:00
|
|
|
kate2 := sql db {
|
|
|
|
select from User where id == 3
|
|
|
|
}
|
|
|
|
assert kate2.age == 31
|
|
|
|
assert kate2.name == 'Kate'
|
2020-06-25 18:18:44 +03:00
|
|
|
//
|
|
|
|
sql db {
|
|
|
|
update User set age = 32, name = 'Kate N' where name == 'Kate'
|
|
|
|
}
|
2021-04-15 10:53:43 +03:00
|
|
|
|
2020-06-25 23:23:19 +03:00
|
|
|
mut kate3 := sql db {
|
|
|
|
select from User where id == 3
|
|
|
|
}
|
|
|
|
assert kate3.age == 32
|
|
|
|
assert kate3.name == 'Kate N'
|
|
|
|
//
|
|
|
|
/*
|
|
|
|
sql db {
|
|
|
|
update User set age = age + 1, name = 'Kate N' where name == 'Kate'
|
|
|
|
}
|
|
|
|
kate3 = sql db {
|
2020-06-25 18:18:44 +03:00
|
|
|
select from User where id == 3
|
|
|
|
}
|
|
|
|
println(kate3)
|
|
|
|
assert kate3.age == 32
|
|
|
|
assert kate3.name == 'Kate N'
|
2020-06-25 23:23:19 +03:00
|
|
|
*/
|
|
|
|
new_age := 33
|
|
|
|
sql db {
|
|
|
|
update User set age = new_age, name = 'Kate N' where id == 3
|
|
|
|
}
|
2021-04-27 15:28:57 +03:00
|
|
|
|
2020-06-25 23:23:19 +03:00
|
|
|
kate3 = sql db {
|
|
|
|
select from User where id == 3
|
|
|
|
}
|
|
|
|
assert kate3.age == 33
|
|
|
|
assert kate3.name == 'Kate N'
|
|
|
|
//
|
|
|
|
foo := Foo{34}
|
|
|
|
sql db {
|
|
|
|
update User set age = foo.age, name = 'Kate N' where id == 3
|
|
|
|
}
|
2021-04-27 15:28:57 +03:00
|
|
|
|
2020-06-25 23:23:19 +03:00
|
|
|
kate3 = sql db {
|
|
|
|
select from User where id == 3
|
|
|
|
}
|
|
|
|
assert kate3.age == 34
|
|
|
|
assert kate3.name == 'Kate N'
|
2020-06-26 21:38:17 +03:00
|
|
|
//
|
|
|
|
no_user := sql db {
|
|
|
|
select from User where id == 30
|
|
|
|
}
|
|
|
|
assert no_user.name == '' // TODO optional
|
|
|
|
assert no_user.age == 0
|
2020-06-27 17:19:12 +03:00
|
|
|
//
|
|
|
|
two_users := sql db {
|
|
|
|
select from User limit 2
|
|
|
|
}
|
|
|
|
assert two_users.len == 2
|
2020-06-27 17:25:25 +03:00
|
|
|
assert two_users[0].id == 1
|
|
|
|
//
|
|
|
|
y := sql db {
|
|
|
|
select from User limit 2 offset 1
|
|
|
|
}
|
|
|
|
assert y.len == 2
|
|
|
|
assert y[0].id == 2
|
2020-06-27 17:41:29 +03:00
|
|
|
//
|
|
|
|
offset_const := 2
|
|
|
|
z := sql db {
|
2022-05-26 22:53:09 +03:00
|
|
|
select from User order by id limit 2 offset offset_const
|
2020-06-27 17:41:29 +03:00
|
|
|
}
|
|
|
|
assert z.len == 2
|
|
|
|
assert z[0].id == 3
|
2020-07-02 20:29:22 +03:00
|
|
|
oldest := sql db {
|
2020-07-02 23:37:24 +03:00
|
|
|
select from User order by age desc limit 1
|
2020-07-02 20:29:22 +03:00
|
|
|
}
|
|
|
|
assert oldest.age == 34
|
2020-07-02 23:22:52 +03:00
|
|
|
offs := 1
|
|
|
|
second_oldest := sql db {
|
2020-07-02 23:37:24 +03:00
|
|
|
select from User order by age desc limit 1 offset offs
|
2020-07-02 23:22:52 +03:00
|
|
|
}
|
|
|
|
assert second_oldest.age == 31
|
2020-07-07 17:55:32 +03:00
|
|
|
sql db {
|
|
|
|
delete from User where age == 34
|
|
|
|
}
|
2021-04-27 15:28:57 +03:00
|
|
|
|
2020-07-07 17:55:32 +03:00
|
|
|
updated_oldest := sql db {
|
|
|
|
select from User order by age desc limit 1
|
|
|
|
}
|
|
|
|
assert updated_oldest.age == 31
|
2021-02-01 23:44:09 +03:00
|
|
|
|
2022-05-26 22:53:09 +03:00
|
|
|
// Remove this when pg is used
|
2022-06-16 20:19:49 +03:00
|
|
|
// db.exec('insert into User (name, age) values (NULL, 31)')
|
2021-02-01 23:44:09 +03:00
|
|
|
null_user := sql db {
|
|
|
|
select from User where id == 5
|
|
|
|
}
|
|
|
|
assert null_user.name == ''
|
2020-06-16 13:14:22 +03:00
|
|
|
|
2021-07-23 12:33:55 +03:00
|
|
|
age_test := sql db {
|
|
|
|
select from User where id == 1
|
|
|
|
}
|
2020-06-07 16:44:33 +03:00
|
|
|
|
2021-07-23 12:33:55 +03:00
|
|
|
assert age_test.age == 29
|
2020-06-07 16:44:33 +03:00
|
|
|
|
2021-07-23 12:33:55 +03:00
|
|
|
sql db {
|
|
|
|
update User set age = age + 1 where id == 1
|
2020-06-07 16:44:33 +03:00
|
|
|
}
|
|
|
|
|
2021-07-23 12:33:55 +03:00
|
|
|
mut first := sql db {
|
|
|
|
select from User where id == 1
|
|
|
|
}
|
2020-06-07 16:44:33 +03:00
|
|
|
|
2021-07-23 12:33:55 +03:00
|
|
|
assert first.age == 30
|
2020-06-07 16:44:33 +03:00
|
|
|
|
2021-07-23 12:33:55 +03:00
|
|
|
sql db {
|
|
|
|
update User set age = age * 2 where id == 1
|
|
|
|
}
|
2020-06-07 16:44:33 +03:00
|
|
|
|
2021-07-23 12:33:55 +03:00
|
|
|
first = sql db {
|
|
|
|
select from User where id == 1
|
|
|
|
}
|
2020-06-07 16:44:33 +03:00
|
|
|
|
2021-07-23 12:33:55 +03:00
|
|
|
assert first.age == 60
|
2021-08-03 05:17:00 +03:00
|
|
|
|
|
|
|
sql db {
|
|
|
|
create table TestTime
|
|
|
|
}
|
|
|
|
|
|
|
|
tnow := time.now()
|
|
|
|
|
|
|
|
time_test := TestTime{
|
|
|
|
create: tnow
|
|
|
|
}
|
|
|
|
|
|
|
|
sql db {
|
|
|
|
insert time_test into TestTime
|
|
|
|
}
|
|
|
|
|
|
|
|
data := sql db {
|
|
|
|
select from TestTime where create == tnow
|
|
|
|
}
|
|
|
|
|
|
|
|
assert data.len == 1
|
2022-06-16 20:19:49 +03:00
|
|
|
assert tnow.unix == data[0].create.unix
|
2021-09-26 11:17:56 +03:00
|
|
|
|
|
|
|
mod := Module{}
|
|
|
|
|
|
|
|
sql db {
|
|
|
|
insert mod into Module
|
|
|
|
}
|
|
|
|
|
|
|
|
sql db {
|
|
|
|
update Module set test_id = 11 where id == 1
|
|
|
|
}
|
|
|
|
|
|
|
|
test_id_mod := sql db {
|
|
|
|
select from Module where id == 1
|
|
|
|
}
|
|
|
|
|
|
|
|
assert test_id_mod.test_id == 11
|
2021-10-28 22:31:41 +03:00
|
|
|
|
|
|
|
t := time.now()
|
|
|
|
sql db {
|
|
|
|
update Module set created = t where id == 1
|
|
|
|
}
|
2022-05-26 22:53:09 +03:00
|
|
|
|
2021-10-28 22:31:41 +03:00
|
|
|
updated_time_mod := sql db {
|
|
|
|
select from Module where id == 1
|
|
|
|
}
|
2022-05-26 22:53:09 +03:00
|
|
|
|
2022-03-06 20:01:22 +03:00
|
|
|
// Note: usually updated_time_mod.created != t, because t has
|
2021-10-28 22:31:41 +03:00
|
|
|
// its microseconds set, while the value retrieved from the DB
|
|
|
|
// has them zeroed, because the db field resolution is seconds.
|
|
|
|
assert updated_time_mod.created.format_ss() == t.format_ss()
|
2022-05-26 22:53:09 +03:00
|
|
|
|
|
|
|
sql db {
|
|
|
|
drop table Module
|
|
|
|
drop table TestTime
|
|
|
|
}
|
2020-06-07 16:44:33 +03:00
|
|
|
}
|