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

cgen, checker: add panic in ORM for invalid queries, when there are no or {} blocks, add type checking for the fkey attribute, add tests (#16977)

This commit is contained in:
walking devel
2023-01-17 18:21:10 +00:00
committed by GitHub
parent 93ee6d107a
commit 2fb9bdce9a
14 changed files with 370 additions and 61 deletions

View File

@ -0,0 +1,79 @@
import db.sqlite
struct Parent {
id int [primary; sql: serial]
children []Child [fkey: 'parent_id']
notes []Note [fkey: 'owner_id']
}
struct Child {
mut:
id int [primary; sql: serial]
parent_id int
}
struct Note {
mut:
id int [primary; sql: serial]
owner_id int
}
fn test_create_only_one_table() {
mut db := sqlite.connect(':memory:') or { panic(err) }
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 }
_ := sql db {
select count from Note
} or { is_note_created = false }
assert is_child_created == false
assert is_note_created == false
}
fn test_drop_only_one_table() {
mut db := sqlite.connect(':memory:') or { panic(err) }
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
mut is_note_dropped := false
sql db {
drop table Parent
}
_ := sql db {
select count from Parent
} or { is_parent_dropped = true }
_ := sql db {
select count from Child
} or { is_child_dropped = true }
_ := sql db {
select count from Note
} or { is_note_dropped = true }
assert is_parent_dropped
assert is_child_dropped == false
assert is_note_dropped == false
}

View File

@ -0,0 +1,87 @@
import db.sqlite
struct Parent {
id int [primary; sql: serial]
name string
children []Child [fkey: 'parent_id']
notes []Note [fkey: 'owner_id']
}
struct Child {
mut:
id int [primary; sql: serial]
parent_id int
name string
}
struct Note {
mut:
id int [primary; sql: serial]
owner_id int
text string
}
fn test_orm_insert_with_multiple_child_elements() {
mut db := sqlite.connect(':memory:') or { panic(err) }
sql db {
create table Parent
}
sql db {
create table Child
}
sql db {
create table Note
}
new_parent := Parent{
name: 'test'
children: [
Child{
name: 'Lisa'
},
Child{
name: 'Steve'
},
]
notes: [
Note{
text: 'First note'
},
Note{
text: 'Second note'
},
Note{
text: 'Third note'
},
]
}
sql db {
insert new_parent into Parent
}
parent := sql db {
select from Parent where id == 1
}
assert parent.children.len == new_parent.children.len
assert parent.notes.len == new_parent.notes.len
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'
assert parent.children[1].name == 'Steve'
assert parent.notes[0].text == 'First note'
assert parent.notes[1].text == 'Second note'
assert parent.notes[2].text == 'Third note'
}

View File

@ -1,5 +1,3 @@
// import os
// import term
// import db.mysql
// import db.pg
import time
@ -34,21 +32,13 @@ struct TestTime {
fn test_orm() {
db := sqlite.connect(':memory:') or { panic(err) }
db.exec('drop table if exists User')
// db := pg.connect(host: 'localhost', port: 5432, user: 'louis', password: 'abc', dbname: 'orm') or { panic(err) }
/*
mut db := mysql.Connection{
host: '127.0.0.1'
username: 'root'
password: 'pw'
dbname: 'v'
}
db.connect() or { panic(err) }*/
sql db {
create table Module
}
sql db {
create table User
}
name := 'Peter'
@ -84,38 +74,41 @@ fn test_orm() {
}
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}')
//
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'
one_peter := sql db {
select from User where name == name limit 1
}
assert one_peter.name == 'Peter'
assert one_peter.id == 2
//
user := sql db {
select from User where id == 1
}
@ -123,7 +116,7 @@ fn test_orm() {
assert user.name == 'Sam'
assert user.id == 1
assert user.age == 29
//
users := sql db {
select from User where id > 0
}
@ -132,13 +125,13 @@ fn test_orm() {
assert users[0].name == 'Sam'
assert users[1].name == 'Peter'
assert users[1].age == 31
//
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
}
@ -146,13 +139,13 @@ fn test_orm() {
assert users3.len == 2
assert users3[0].age == 29
assert users3[1].age == 31
//
missing_user := sql db {
select from User where id == 8777
}
println('missing_user:')
println(missing_user) // zero struct
//
new_user := User{
name: 'New user'
age: 30
@ -161,7 +154,6 @@ fn test_orm() {
insert new_user into User
}
// db.insert<User>(user2)
x := sql db {
select from User where id == 4
}
@ -169,18 +161,18 @@ fn test_orm() {
assert x.age == 30
assert x.id == 4
assert x.name == 'New user'
//
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'
//
sql db {
update User set age = 31 where name == 'Kate'
}
@ -190,7 +182,7 @@ fn test_orm() {
}
assert kate2.age == 31
assert kate2.name == 'Kate'
//
sql db {
update User set age = 32, name = 'Kate N' where name == 'Kate'
}
@ -200,18 +192,7 @@ fn test_orm() {
}
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 {
select from User where id == 3
}
println(kate3)
assert kate3.age == 32
assert kate3.name == 'Kate N'
*/
new_age := 33
sql db {
update User set age = new_age, name = 'Kate N' where id == 3
@ -222,7 +203,7 @@ fn test_orm() {
}
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
@ -233,25 +214,25 @@ fn test_orm() {
}
assert kate3.age == 34
assert kate3.name == 'Kate N'
//
no_user := sql db {
select from User where id == 30
}
assert no_user.name == '' // TODO optional
assert no_user.age == 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
//
offset_const := 2
z := sql db {
select from User order by id limit 2 offset offset_const