mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
ORM fixes
This commit is contained in:
parent
79b26b1654
commit
71c0c4803f
@ -1,5 +1,3 @@
|
||||
/*
|
||||
|
||||
module main
|
||||
|
||||
import pg
|
||||
@ -12,52 +10,52 @@ struct Customer {
|
||||
}
|
||||
|
||||
fn main() {
|
||||
db := pg.connect(pg.Config{host: '127.0.0.1' user: 'myuser' dbname: 'mydb'})
|
||||
|
||||
db := pg.connect(pg.Config{
|
||||
host: 'localhost' //'127.0.0.1'
|
||||
user: 'postgres'
|
||||
dbname: 'customerdb'
|
||||
}) or {
|
||||
println('failed to connect')
|
||||
println(err)
|
||||
return
|
||||
}
|
||||
|
||||
nr_customers := db.select count from Customer
|
||||
println('Total customers: $nr_customers')
|
||||
|
||||
|
||||
// V syntax can be used to build queries
|
||||
println('------------------------------------------------------------------------')
|
||||
println('----------------------------------------------------------------')
|
||||
bg_customers := db.select from Customer where country == 'Bulgaria' && id != 2
|
||||
for customer in bg_customers {
|
||||
println('$customer.country | $customer.id - $customer.name')
|
||||
}
|
||||
|
||||
println('------------------------------------------------------------------------')
|
||||
|
||||
println('----------------------------------------------------------------')
|
||||
ru_customers := db.select from Customer where country == 'Russia'
|
||||
for customer in ru_customers {
|
||||
println('$customer.country | $customer.id - $customer.name')
|
||||
}
|
||||
|
||||
|
||||
// by adding `limit 1` we tell V that there will be only one object
|
||||
println('------------------------------------------------------------------------')
|
||||
existing := db.select from Customer where id == 1 limit 1 or { panic(err) }
|
||||
println('----------------------------------------------------------------')
|
||||
existing := db.select from Customer where id == 1 limit 1 or { panic(err) }
|
||||
println('Existing customer name: $existing.name')
|
||||
println('Existing customer full information:')
|
||||
println(existing)
|
||||
|
||||
|
||||
println('------------------------------------------------------------------------')
|
||||
q := Customer{}
|
||||
for {
|
||||
anon := db.select from Customer where id == 12345 && name == q.name && nr_orders > q.nr_orders limit 1 or { eprintln('No such customer. Error: $err') break }
|
||||
q := Customer{}
|
||||
// It's easy to handle queries that don't return any data
|
||||
if anon := db.select from Customer where id == 12345 && name == q.name &&
|
||||
nr_orders > q.nr_orders limit 1 {
|
||||
println('Non existing customer name: $anon.name')
|
||||
break
|
||||
}
|
||||
|
||||
// TODO: insert a new customer
|
||||
/*
|
||||
// Insert a new customer
|
||||
nc := Customer{
|
||||
name: 'John Doe'
|
||||
nr_orders: 10
|
||||
}
|
||||
db.insert(nc)
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
fn main() {
|
||||
|
||||
}
|
||||
|
@ -41,7 +41,6 @@ fn (p mut Parser) select_query(fn_ph int) string {
|
||||
p.sql_params = []
|
||||
if false {}
|
||||
p.sql_types = []
|
||||
|
||||
mut q := 'select '
|
||||
p.check(.key_select)
|
||||
n := p.check_name()
|
||||
@ -91,8 +90,8 @@ fn (p mut Parser) select_query(fn_ph int) string {
|
||||
// `where` statement
|
||||
if p.tok == .name && p.lit == 'where' {
|
||||
p.next()
|
||||
_, expr := p.tmp_expr()
|
||||
p.is_sql = true
|
||||
_, expr := p.tmp_expr()
|
||||
p.is_sql = false
|
||||
q += ' where ' + expr
|
||||
}
|
||||
@ -100,8 +99,8 @@ fn (p mut Parser) select_query(fn_ph int) string {
|
||||
mut query_one := false
|
||||
if p.tok == .name && p.lit == 'limit' {
|
||||
p.next()
|
||||
_, limit := p.tmp_expr()
|
||||
p.is_sql = true
|
||||
_, limit := p.tmp_expr()
|
||||
p.is_sql = false
|
||||
q += ' limit ' + limit
|
||||
// `limit 1` means we are getting `?User`, not `[]User`
|
||||
@ -111,7 +110,7 @@ fn (p mut Parser) select_query(fn_ph int) string {
|
||||
}
|
||||
println('sql query="$q"')
|
||||
p.cgen.insert_before('// DEBUG_SQL prefix: $qprefix | fn_ph: $fn_ph | query: "$q" ')
|
||||
|
||||
|
||||
if n == 'count' {
|
||||
p.cgen.set_placeholder(fn_ph, 'pg__DB_q_int(')
|
||||
p.gen(', tos2("$q"))')
|
||||
@ -171,12 +170,12 @@ for (int i = 0; i < ${qprefix}rows.len; i++) {
|
||||
')
|
||||
p.cgen.resetln('${qprefix}arr_$tmp')
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
if n == 'count' {
|
||||
return 'int'
|
||||
} else if query_one {
|
||||
opt_type := 'Option_$table_name'
|
||||
} else if query_one {
|
||||
opt_type := 'Option_$table_name'
|
||||
p.cgen.typedefs << 'typedef Option $opt_type;'
|
||||
p.table.register_builtin( opt_type )
|
||||
return opt_type
|
||||
|
20
vlib/pg/pg.v
20
vlib/pg/pg.v
@ -19,10 +19,10 @@ struct C.PGResult { }
|
||||
|
||||
pub struct Config {
|
||||
pub:
|
||||
host string
|
||||
user string
|
||||
password string
|
||||
dbname string
|
||||
host string
|
||||
user string
|
||||
password string
|
||||
dbname string
|
||||
}
|
||||
|
||||
fn C.PQconnectdb(a byteptr) &C.PGconn
|
||||
@ -31,17 +31,17 @@ fn C.PQgetvalue(voidptr, int, int) byteptr
|
||||
fn C.PQstatus(voidptr) int
|
||||
fn C.PQntuples(voidptr) int
|
||||
fn C.PQnfields(voidptr) int
|
||||
fn C.PQexec(voidptr) int
|
||||
fn C.PQexecParams(voidptr) int
|
||||
fn C.PQexec(voidptr) voidptr
|
||||
fn C.PQexecParams(voidptr) voidptr
|
||||
|
||||
pub fn connect(config pg.Config) DB {
|
||||
pub fn connect(config pg.Config) ?DB {
|
||||
conninfo := 'host=$config.host user=$config.user dbname=$config.dbname'
|
||||
conn:=C.PQconnectdb(conninfo.str)
|
||||
conn := C.PQconnectdb(conninfo.str)
|
||||
status := C.PQstatus(conn)
|
||||
println("status=$status")
|
||||
if status != C.CONNECTION_OK {
|
||||
error_msg := C.PQerrorMessage(conn)
|
||||
eprintln('Connection to a PG database failed: ' + string(error_msg))
|
||||
exit(1)
|
||||
return error ('Connection to a PG database failed: ' + string(error_msg))
|
||||
}
|
||||
return DB {conn: conn}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user