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:
@ -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
|
||||
|
@ -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'
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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'
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
82
vlib/orm/orm_result_test.v
Normal file
82
vlib/orm/orm_result_test.v
Normal 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
|
||||
}
|
@ -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()!
|
||||
}
|
||||
|
@ -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}'
|
||||
|
@ -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
|
||||
}
|
||||
}!
|
||||
}
|
||||
|
Reference in New Issue
Block a user