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[skip]
field will be skipped[sql: type]
sets the type which is used in sql (special typeserial
)[sql: 'name']
sets a custom column name for the field
Usage
struct Foo {
id int [primary; sql: serial]
name string [nonull]
}
Create
sql db {
create table Foo
}
Drop
sql db {
drop table Foo
}
Insert
var := Foo{
name: 'abc'
}
sql db {
insert var into Foo
}
Update
sql db {
update Foo set name = 'cde' 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 limit 5
}
result := sql db {
select from Foo where id > 1 order by 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.byte_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
'byte': ast.byte_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
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
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
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