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:
79
vlib/orm/orm_create_and_drop_test.v
Normal file
79
vlib/orm/orm_create_and_drop_test.v
Normal 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
|
||||
}
|
87
vlib/orm/orm_insert_test.v
Normal file
87
vlib/orm/orm_insert_test.v
Normal 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'
|
||||
}
|
@ -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
|
||||
|
Reference in New Issue
Block a user