orm #
ORM
Attributes
Structs
[table: 'name']sets a custom table name
Fields
[primary]sets the field as the primary key[unique]sets the field as unique[unique: 'foo']adds the field to a unique group[nonull]set the field as not null[skip]field will be skipped[sql: type]wheretypeis a V type such asintorf64, or special typeserial[sql: 'name']sets a custom column name for the field[sql_type: 'SQL TYPE']sets the sql type which is used in sql[default: 'sql defaults']sets the default value or function when create a new table[fkey: 'parent_id']sets foreign key for an field which holds an array
Usage
struct Foo {
id int [primary; sql: serial]
name string [nonull]
created_at time.Time [sql_type: 'DATETIME']
updated_at string [sql_type: 'DATETIME']
deleted_at time.Time
children []Child [fkey: 'parent_id']
}
struct Child {
id int [primary; sql: serial]
parent_id int
name string
}
Create
sql db {
create table Foo
}
Drop
sql db {
drop table Foo
}
Insert
var := Foo{
name: 'abc'
created_at: time.now()
updated_at: time.now().str()
deleted_at: time.now()
children: [
Child{
name: 'abc'
},
Child{
name: 'def'
},
]
}
sql db {
insert var into Foo
}
Update
sql db {
update Foo set name = 'cde', updated_at = time.now() where name == 'abc'
}
Delete
sql db {
delete from Foo where id > 10
}
Select
result := sql db {
select from Foo where id == 1
}
result := sql db {
select from Foo where id > 1 && name != 'lasanha' limit 5
}
result := sql db {
select from Foo where id > 1 order by id
}
Example
import pg
struct Member {
id string [default: 'gen_random_uuid()'; primary; sql_type: 'uuid']
name string
created_at string [default: 'CURRENT_TIMESTAMP'; sql_type: 'TIMESTAMP']
}
fn main() {
db := pg.connect(pg.Config{
host: 'localhost'
port: 5432
user: 'user'
password: 'password'
dbname: 'dbname'
}) or {
println(err)
return
}
defer {
db.close()
}
sql db {
create table Member
}
new_member := Member{
name: 'John Doe'
}
sql db {
insert new_member into Member
}
selected_member := sql db {
select from Member where name == 'John Doe' limit 1
}
sql db {
update Member set name = 'Hitalo' where id == selected_member.id
}
}
Constants #
const (
num64 = [ast.i64_type_idx, ast.u64_type_idx]
nums = [
ast.i8_type_idx,
ast.i16_type_idx,
ast.int_type_idx,
ast.u8_type_idx,
ast.u16_type_idx,
ast.u32_type_idx,
ast.bool_type_idx,
]
float = [
ast.f32_type_idx,
ast.f64_type_idx,
]
string = ast.string_type_idx
time = -2
serial = -1
type_idx = {
'i8': ast.i8_type_idx
'i16': ast.i16_type_idx
'int': ast.int_type_idx
'i64': ast.i64_type_idx
'u8': ast.u8_type_idx
'u16': ast.u16_type_idx
'u32': ast.u32_type_idx
'u64': ast.u64_type_idx
'f32': ast.f32_type_idx
'f64': ast.f64_type_idx
'bool': ast.bool_type_idx
'string': ast.string_type_idx
}
string_max_len = 2048
)
fn bool_to_primitive #
fn bool_to_primitive(b bool) Primitive
needed for backend functions
fn f32_to_primitive #
fn f32_to_primitive(b f32) Primitive
fn f64_to_primitive #
fn f64_to_primitive(b f64) Primitive
fn i16_to_primitive #
fn i16_to_primitive(b i16) Primitive
fn i64_to_primitive #
fn i64_to_primitive(b i64) Primitive
fn i8_to_primitive #
fn i8_to_primitive(b i8) Primitive
fn infix_to_primitive #
fn infix_to_primitive(b InfixType) Primitive
fn int_to_primitive #
fn int_to_primitive(b int) Primitive
fn orm_select_gen #
fn orm_select_gen(orm SelectConfig, q string, num bool, qm string, start_pos int, where QueryData) string
Generates an sql select stmt, from universal parameter orm - See SelectConfig q, num, qm, start_pos - see orm_stmt_gen where - See QueryData
fn orm_stmt_gen #
fn orm_stmt_gen(table string, q string, kind StmtKind, num bool, qm string, start_pos int, data QueryData, where QueryData) (string, QueryData)
Generates an sql stmt, from universal parameter q - The quotes character, which can be different in every type, so it's variable num - Stmt uses nums at prepared statements (? or ?1) qm - Character for prepared statment, qm because of quotation mark like in sqlite start_pos - When num is true, it's the start position of the counter
fn orm_table_gen #
fn orm_table_gen(table string, q string, defaults bool, def_unique_len int, fields []TableField, sql_from_v fn (int) ?string, alternative bool) ?string
Generates an sql table stmt, from universal parameter table - Table name q - see orm_stmt_gen defaults - enables default values in stmt def_unique_len - sets default unique length for texts fields - See TableField sql_from_v - Function which maps type indices to sql type names alternative - Needed for msdb
fn string_to_primitive #
fn string_to_primitive(b string) Primitive
fn time_to_primitive #
fn time_to_primitive(b time.Time) Primitive
fn u16_to_primitive #
fn u16_to_primitive(b u16) Primitive
fn u32_to_primitive #
fn u32_to_primitive(b u32) Primitive
fn u64_to_primitive #
fn u64_to_primitive(b u64) Primitive
fn u8_to_primitive #
fn u8_to_primitive(b u8) Primitive
interface Connection #
interface Connection {
@select(config SelectConfig, data QueryData, where QueryData) ?[][]Primitive
insert(table string, data QueryData) ?
update(table string, data QueryData, where QueryData) ?
delete(table string, where QueryData) ?
create(table string, fields []TableField) ?
drop(table string) ?
last_id() Primitive
}
Interfaces gets called from the backend and can be implemented
Since the orm supports arrays aswell, they have to be returned too.
A row is represented as []Primitive, where the data is connected to the fields of the struct by their
index. The indices are mapped with the SelectConfig.field array. This is the mapping for a struct.
To have an array, there has to be an array of structs, basically [][]Primitive
Every function without last_id() returns an optional, which returns an error if present last_id returns the last inserted id of the db
type Primitive #
type Primitive = InfixType
| bool
| f32
| f64
| i16
| i64
| i8
| int
| string
| time.Time
| u16
| u32
| u64
| u8
enum MathOperationKind #
enum MathOperationKind {
add // +
sub // -
mul // *
div // /
}
enum OperationKind #
enum OperationKind {
neq // !=
eq // ==
gt // >
lt // <
ge // >=
le // <=
}
enum OrderType #
enum OrderType {
asc
desc
}
enum StmtKind #
enum StmtKind {
insert
update
delete
}
struct InfixType #
struct InfixType {
pub:
name string
operator MathOperationKind
right Primitive
}
struct QueryData #
struct QueryData {
pub:
fields []string
data []Primitive
types []int
parentheses [][]int
kinds []OperationKind
is_and []bool
}
Examples for QueryData in SQL: abc == 3 && b == 'test' => fields[abc, b]; data[3, 'test']; types[index of int, index of string]; kinds[.eq, .eq]; is_and[true]; Every field, data, type & kind of operation in the expr share the same index in the arrays is_and defines how they're addicted to each other either and or or parentheses defines which fields will be inside ()
struct SelectConfig #
struct SelectConfig {
pub:
table string
is_count bool
has_where bool
has_order bool
order string
order_type OrderType
has_limit bool
primary string = 'id' // should be set if primary is different than 'id' and 'has_limit' is false
has_offset bool
fields []string
types []int
}
table - Table name is_count - Either the data will be returned or an integer with the count has_where - Select all or use a where expr has_order - Order the results order - Name of the column which will be ordered order_type - Type of order (asc, desc) has_limit - Limits the output data primary - Name of the primary field has_offset - Add an offset to the result fields - Fields to select types - Types to select
struct TableField #
struct TableField {
pub:
name string
typ int
is_time bool
default_val string
is_arr bool
attrs []StructAttribute
}
- README
- Constants
- fn bool_to_primitive
- fn f32_to_primitive
- fn f64_to_primitive
- fn i16_to_primitive
- fn i64_to_primitive
- fn i8_to_primitive
- fn infix_to_primitive
- fn int_to_primitive
- fn orm_select_gen
- fn orm_stmt_gen
- fn orm_table_gen
- fn string_to_primitive
- fn time_to_primitive
- fn u16_to_primitive
- fn u32_to_primitive
- fn u64_to_primitive
- fn u8_to_primitive
- interface Connection
- type Primitive
- enum MathOperationKind
- enum OperationKind
- enum OrderType
- enum StmtKind
- struct InfixType
- struct QueryData
- struct SelectConfig
- struct TableField