1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

orm: enforce that queries always return a Result, a query-resulting array can be used as a V array in place. (#17871)

This commit is contained in:
walking devel
2023-04-04 05:23:06 +00:00
committed by GitHub
parent 9addede0ea
commit 8452644ec3
67 changed files with 479 additions and 354 deletions

View File

@ -23,18 +23,24 @@ fn test_create_only_one_table() {
sql db {
create table Parent
}
}!
mut is_child_created := true
mut is_note_created := true
_ := sql db {
select count from Child
} or { is_child_created = false }
} or {
is_child_created = false
0
}
_ := sql db {
select count from Note
} or { is_note_created = false }
} or {
is_note_created = false
0
}
assert is_child_created == false
assert is_note_created == false
@ -45,13 +51,13 @@ fn test_drop_only_one_table() {
sql db {
create table Parent
}
}!
sql db {
create table Child
}
}!
sql db {
create table Note
}
}!
mut is_parent_dropped := false
mut is_child_dropped := false
@ -59,19 +65,28 @@ fn test_drop_only_one_table() {
sql db {
drop table Parent
}
}!
_ := sql db {
select count from Parent
} or { is_parent_dropped = true }
} or {
is_parent_dropped = true
0
}
_ := sql db {
select count from Child
} or { is_child_dropped = true }
} or {
is_child_dropped = true
0
}
_ := sql db {
select count from Note
} or { is_note_dropped = true }
} or {
is_note_dropped = true
0
}
assert is_parent_dropped
assert is_child_dropped == false

View File

@ -15,7 +15,7 @@ fn test_fn_calls() {
sql db {
create table User
}
}!
first_user := User{
name: 'first'
@ -30,18 +30,18 @@ fn test_fn_calls() {
sql db {
insert first_user into User
insert second_user into User
}
}!
users_with_acceptable_age := sql db {
select from User where age >= get_acceptable_age()
}
}!
assert users_with_acceptable_age.len == 1
assert users_with_acceptable_age.first().name == 'first'
users_with_non_acceptable_age := sql db {
select from User where age < get_acceptable_age()
}
}!
assert users_with_non_acceptable_age.len == 1
assert users_with_non_acceptable_age.first().name == 'second'

View File

@ -14,20 +14,20 @@ fn test_insert_with_reserved_name() {
}
sql db {
create table Bad
}
}!
sql db {
insert bad into Bad
}
}!
sql db {
insert bad into Bad
insert bad into Bad
insert bad into Bad
}
}!
rows := sql db {
select from Bad
}
}!
assert rows.len == 4
}

View File

@ -25,10 +25,10 @@ struct Account {
id int [primary; sql: serial]
}
pub fn insert_parent(db sqlite.DB, mut parent Parent) {
pub fn insert_parent(db sqlite.DB, mut parent Parent) ! {
sql db {
insert parent into Parent
}
}!
}
fn test_insert_empty_object() {
@ -39,11 +39,11 @@ fn test_insert_empty_object() {
sql db {
create table Account
insert account into Account
}
}!
accounts := sql db {
select from Account
}
}!
assert accounts.len == 1
}
@ -55,17 +55,17 @@ fn test_orm_insert_mut_object() {
create table Parent
create table Child
create table Note
}
}!
mut parent := Parent{
name: 'test'
}
insert_parent(db, mut parent)
insert_parent(db, mut parent)!
parents := sql db {
select from Parent
}
}!
assert parents.len == 1
}
@ -77,7 +77,7 @@ fn test_orm_insert_with_multiple_child_elements() {
create table Parent
create table Child
create table Note
}
}!
new_parent := Parent{
name: 'test'
@ -104,11 +104,11 @@ fn test_orm_insert_with_multiple_child_elements() {
sql db {
insert new_parent into Parent
}
}!
parents := sql db {
select from Parent where id == 1
}
}!
parent := parents.first()
assert parent.children.len == new_parent.children.len
@ -116,12 +116,12 @@ fn test_orm_insert_with_multiple_child_elements() {
children_count := sql db {
select count from Child
}
}!
assert children_count == new_parent.children.len
note_count := sql db {
select count from Note
}
}!
assert note_count == new_parent.notes.len
assert parent.children[0].name == 'Lisa'

View File

@ -12,7 +12,7 @@ fn test_orm_interface() {
sql db {
create table User
}
}!
user := User{
name: 'test'
@ -20,11 +20,11 @@ fn test_orm_interface() {
sql db {
insert user into User
}
}!
users := sql db {
select from User
}
}!
assert users.len == 1
assert users.first().name == user.name

View File

@ -10,7 +10,7 @@ fn test_last_id() {
sql db {
create table User
}
}!
first_user := User{
name: 'first'
@ -23,7 +23,7 @@ fn test_last_id() {
sql db {
insert first_user into User
insert second_user into User
}
}!
last_id := db.last_id()

View File

@ -5,10 +5,10 @@ struct User {
name string
}
fn get_users(mut db sqlite.DB) []User {
fn get_users(mut db sqlite.DB) ![]User {
return sql db {
select from User
}
}!
}
fn test_orm_mut_db() {
@ -16,7 +16,7 @@ fn test_orm_mut_db() {
sql db {
create table User
}
}!
first_user := User{
name: 'first'
@ -28,9 +28,9 @@ fn test_orm_mut_db() {
sql db {
insert first_user into User
insert second_user into User
}
}!
users := get_users(mut db)
users := get_users(mut db)!
assert users.len == 2
}

View File

@ -0,0 +1,82 @@
import db.sqlite
struct Account {
id int [primary; sql: serial]
name string
}
struct Note {
id int [primary; sql: serial]
content string
}
fn test_catch_table_is_not_created() {
mut db := sqlite.connect(':memory:')!
mut is_inserted := true
account := Account{}
sql db {
insert account into Account
} or { is_inserted = false }
assert !is_inserted
}
fn test_catch_one_of_queries() {
mut db := sqlite.connect(':memory:')!
sql db {
create table Account
}!
account := Account{}
sql db {
insert account into Account
}!
mut are_updated := true
sql db {
update Account set name = 'test' where id == 1
update Note set content = 'test' where id == 1
} or { are_updated = false }
assert !are_updated
}
fn test_print_results() {
mut db := sqlite.connect(':memory:')!
sql db {
create table Account
}!
account := Account{}
sql db {
insert account into Account
}!
count := sql db {
select count from Account
}!
println(count)
user := sql db {
select from Account
}!.first()
println(user)
users := sql db {
select from Account
}!
println(users)
assert true
}

View File

@ -38,20 +38,26 @@ fn test_sql_or_block_for_insert() {
user := User{1, 'bilbo'}
eprintln('> inserting user 1 (first try)...')
mut is_user_inserted := true
sql db {
insert user into User
} or {
println('user should have been inserted, but could not, err: ${err}')
assert false
is_user_inserted = false
}
assert is_user_inserted
eprintln('> inserting user 1 (second try)...')
sql db {
insert user into User
} or {
assert true
println('user could not be inserted, err: ${err}')
is_user_inserted = false
}
assert !is_user_inserted
eprintln('LINE: ${@LINE}')
db.close()!
}

View File

@ -10,7 +10,7 @@ fn test_string_interpolation() {
sql db {
create table User
}
}!
user_suffix := '_user'
@ -25,11 +25,11 @@ fn test_string_interpolation() {
sql db {
insert first_user into User
insert second_user into User
}
}!
users := sql db {
select from User where name == 'first${user_suffix}'
}
}!
assert users.len == 1
assert users.first().name == 'first${user_suffix}'

View File

@ -39,7 +39,7 @@ fn test_use_struct_field_as_limit() {
sql db {
create table User
}
}!
foo := Foo{
age: 10
@ -52,11 +52,11 @@ fn test_use_struct_field_as_limit() {
sql db {
insert sam into User
}
}!
users := sql db {
select from User limit foo.age
}
}!
assert users.len == 1
}
@ -66,10 +66,10 @@ fn test_orm() {
sql db {
create table Module
}
}!
sql db {
create table User
}
}!
name := 'Peter'
@ -93,47 +93,47 @@ fn test_orm() {
insert sam into User
insert peter into User
insert k into User
}
}!
c := sql db {
select count from User where id != 1
}
}!
assert c == 2
nr_all_users := sql db {
select count from User
}
}!
assert nr_all_users == 3
nr_users1 := sql db {
select count from User where id == 1
}
}!
assert nr_users1 == 1
nr_peters := sql db {
select count from User where id == 2 && name == 'Peter'
}
}!
assert nr_peters == 1
nr_peters2 := sql db {
select count from User where id == 2 && name == name
}
}!
assert nr_peters2 == 1
nr_peters3 := sql db {
select count from User where name == name
}
}!
assert nr_peters3 == 1
peters := sql db {
select from User where name == name
}
}!
assert peters.len == 1
assert peters[0].name == 'Peter'
mut users := sql db {
select from User where name == name limit 1
}
}!
one_peter := users.first()
assert one_peter.name == 'Peter'
@ -141,7 +141,7 @@ fn test_orm() {
users = sql db {
select from User where id == 1
}
}!
user := users.first()
assert user.name == 'Sam'
@ -150,7 +150,7 @@ fn test_orm() {
users = sql db {
select from User where id > 0
}
}!
assert users.len == 3
assert users[0].name == 'Sam'
assert users[1].name == 'Peter'
@ -158,12 +158,12 @@ fn test_orm() {
users2 := sql db {
select from User where id < 0
}
}!
assert users2.len == 0
users3 := sql db {
select from User where age == 29 || age == 31
}
}!
assert users3.len == 2
assert users3[0].age == 29
@ -175,11 +175,11 @@ fn test_orm() {
}
sql db {
insert new_user into User
}
}!
users = sql db {
select from User where id == 4
}
}!
x := users.first()
assert x.age == 30
@ -188,14 +188,14 @@ fn test_orm() {
users = sql db {
select from User where id == 3
}
}!
kate := users.first()
assert kate.is_customer == true
users = sql db {
select from User where is_customer == true limit 1
}
}!
customer := users.first()
assert customer.is_customer == true
@ -203,22 +203,22 @@ fn test_orm() {
sql db {
update User set age = 31 where name == 'Kate'
}
}!
users = sql db {
select from User where id == 3
}
}!
kate2 := users.first()
assert kate2.age == 31
assert kate2.name == 'Kate'
sql db {
update User set age = 32, name = 'Kate N' where name == 'Kate'
}
}!
users = sql db {
select from User where id == 3
}
}!
mut kate3 := users.first()
assert kate3.age == 32
assert kate3.name == 'Kate N'
@ -226,11 +226,11 @@ fn test_orm() {
new_age := 33
sql db {
update User set age = new_age, name = 'Kate N' where id == 3
}
}!
users = sql db {
select from User where id == 3
}
}!
kate3 = users.first()
assert kate3.age == 33
@ -239,42 +239,42 @@ fn test_orm() {
foo := Foo{34}
sql db {
update User set age = foo.age, name = 'Kate N' where id == 3
}
}!
users = sql db {
select from User where id == 3
}
}!
kate3 = users.first()
assert kate3.age == 34
assert kate3.name == 'Kate N'
no_user := sql db {
select from User where id == 30
}
}!
assert no_user.len == 0
two_users := sql db {
select from User limit 2
}
}!
assert two_users.len == 2
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
z := sql db {
select from User order by id limit 2 offset offset_const
}
}!
assert z.len == 2
assert z[0].id == 3
users = sql db {
select from User order by age desc limit 1
}
}!
oldest := users.first()
assert oldest.age == 34
@ -282,17 +282,17 @@ fn test_orm() {
offs := 1
users = sql db {
select from User order by age desc limit 1 offset offs
}
}!
second_oldest := users.first()
assert second_oldest.age == 31
sql db {
delete from User where age == 34
}
}!
users = sql db {
select from User order by age desc limit 1
}
}!
updated_oldest := users.first()
assert updated_oldest.age == 31
@ -300,41 +300,41 @@ fn test_orm() {
// db.exec('insert into User (name, age) values (NULL, 31)')
users = sql db {
select from User where id == 5
}
}!
assert users.len == 0
users = sql db {
select from User where id == 1
}
}!
age_test := users.first()
assert age_test.age == 29
sql db {
update User set age = age + 1 where id == 1
}
}!
users = sql db {
select from User where id == 1
}
}!
mut first := users.first()
assert first.age == 30
sql db {
update User set age = age * 2 where id == 1
}
}!
users = sql db {
select from User where id == 1
}
}!
first = users.first()
assert first.age == 60
sql db {
create table TestTime
}
}!
tnow := time.now()
@ -344,11 +344,11 @@ fn test_orm() {
sql db {
insert time_test into TestTime
}
}!
data := sql db {
select from TestTime where create == tnow
}
}!
assert data.len == 1
assert tnow.unix == data[0].create.unix
@ -357,26 +357,26 @@ fn test_orm() {
sql db {
insert mod into Module
}
}!
sql db {
update Module set test_id = 11 where id == 1
}
}!
mut modules := sql db {
select from Module where id == 1
}
}!
assert modules.first().test_id == 11
t := time.now()
sql db {
update Module set created = t where id == 1
}
}!
modules = sql db {
select from Module where id == 1
}
}!
// Note: usually updated_time_mod.created != t, because t has
// its microseconds set, while the value retrieved from the DB
@ -385,12 +385,12 @@ fn test_orm() {
users = sql db {
select from User where (name == 'Sam' && is_customer == true) || id == 1
}
}!
assert users.first() == first
sql db {
drop table Module
drop table TestTime
}
}!
}