Skip to content

Commit 580dbc3

Browse files
author
walking devel
authored
orm: allow inserting empty objects with db.sqlite (SQLite uses a slightly different SQL dialect) (#17334)
1 parent 289993a commit 580dbc3

File tree

9 files changed

+72
-34
lines changed

9 files changed

+72
-34
lines changed

vlib/db/mysql/orm.v

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,20 +134,20 @@ pub fn (db Connection) insert(table string, data orm.QueryData) ! {
134134
is_and: []
135135
}
136136

137-
query, converted_data := orm.orm_stmt_gen(table, '`', .insert, false, '?', 1, converted_primitive_data,
138-
orm.QueryData{})
137+
query, converted_data := orm.orm_stmt_gen(.default, table, '`', .insert, false, '?',
138+
1, converted_primitive_data, orm.QueryData{})
139139
mysql_stmt_worker(db, query, converted_data, orm.QueryData{})!
140140
}
141141

142142
// update is used internally by V's ORM for processing `UPDATE ` queries
143143
pub fn (db Connection) update(table string, data orm.QueryData, where orm.QueryData) ! {
144-
query, _ := orm.orm_stmt_gen(table, '`', .update, false, '?', 1, data, where)
144+
query, _ := orm.orm_stmt_gen(.default, table, '`', .update, false, '?', 1, data, where)
145145
mysql_stmt_worker(db, query, data, where)!
146146
}
147147

148148
// delete is used internally by V's ORM for processing `DELETE ` queries
149149
pub fn (db Connection) delete(table string, where orm.QueryData) ! {
150-
query, _ := orm.orm_stmt_gen(table, '`', .delete, false, '?', 1, orm.QueryData{},
150+
query, _ := orm.orm_stmt_gen(.default, table, '`', .delete, false, '?', 1, orm.QueryData{},
151151
where)
152152
mysql_stmt_worker(db, query, orm.QueryData{}, where)!
153153
}

vlib/db/pg/orm.v

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,21 @@ pub fn (db DB) @select(config orm.SelectConfig, data orm.QueryData, where orm.Qu
3333

3434
// insert is used internally by V's ORM for processing `INSERT ` queries
3535
pub fn (db DB) insert(table string, data orm.QueryData) ! {
36-
query, converted_data := orm.orm_stmt_gen(table, '"', .insert, true, '$', 1, data,
37-
orm.QueryData{})
36+
query, converted_data := orm.orm_stmt_gen(.default, table, '"', .insert, true, '$',
37+
1, data, orm.QueryData{})
3838
pg_stmt_worker(db, query, converted_data, orm.QueryData{})!
3939
}
4040

4141
// update is used internally by V's ORM for processing `UPDATE ` queries
4242
pub fn (db DB) update(table string, data orm.QueryData, where orm.QueryData) ! {
43-
query, _ := orm.orm_stmt_gen(table, '"', .update, true, '$', 1, data, where)
43+
query, _ := orm.orm_stmt_gen(.default, table, '"', .update, true, '$', 1, data, where)
4444
pg_stmt_worker(db, query, data, where)!
4545
}
4646

4747
// delete is used internally by V's ORM for processing `DELETE ` queries
4848
pub fn (db DB) delete(table string, where orm.QueryData) ! {
49-
query, _ := orm.orm_stmt_gen(table, '"', .delete, true, '$', 1, orm.QueryData{}, where)
49+
query, _ := orm.orm_stmt_gen(.default, table, '"', .delete, true, '$', 1, orm.QueryData{},
50+
where)
5051
pg_stmt_worker(db, query, orm.QueryData{}, where)!
5152
}
5253

vlib/db/sqlite/orm.v

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,20 +53,21 @@ pub fn (db DB) @select(config orm.SelectConfig, data orm.QueryData, where orm.Qu
5353

5454
// insert is used internally by V's ORM for processing `INSERT ` queries
5555
pub fn (db DB) insert(table string, data orm.QueryData) ! {
56-
query, converted_data := orm.orm_stmt_gen(table, '`', .insert, true, '?', 1, data,
57-
orm.QueryData{})
56+
query, converted_data := orm.orm_stmt_gen(.sqlite, table, '`', .insert, true, '?',
57+
1, data, orm.QueryData{})
5858
sqlite_stmt_worker(db, query, converted_data, orm.QueryData{})!
5959
}
6060

6161
// update is used internally by V's ORM for processing `UPDATE ` queries
6262
pub fn (db DB) update(table string, data orm.QueryData, where orm.QueryData) ! {
63-
query, _ := orm.orm_stmt_gen(table, '`', .update, true, '?', 1, data, where)
63+
query, _ := orm.orm_stmt_gen(.sqlite, table, '`', .update, true, '?', 1, data, where)
6464
sqlite_stmt_worker(db, query, data, where)!
6565
}
6666

6767
// delete is used internally by V's ORM for processing `DELETE ` queries
6868
pub fn (db DB) delete(table string, where orm.QueryData) ! {
69-
query, _ := orm.orm_stmt_gen(table, '`', .delete, true, '?', 1, orm.QueryData{}, where)
69+
query, _ := orm.orm_stmt_gen(.sqlite, table, '`', .delete, true, '?', 1, orm.QueryData{},
70+
where)
7071
sqlite_stmt_worker(db, query, orm.QueryData{}, where)!
7172
}
7273

vlib/mysql/orm.v

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,18 +132,18 @@ pub fn (db Connection) insert(table string, data orm.QueryData) ! {
132132
is_and: []
133133
}
134134

135-
query, converted_data := orm.orm_stmt_gen(table, '`', .insert, false, '?', 1, converted_primitive_data,
136-
orm.QueryData{})
135+
query, converted_data := orm.orm_stmt_gen(.default, table, '`', .insert, false, '?',
136+
1, converted_primitive_data, orm.QueryData{})
137137
mysql_stmt_worker(db, query, converted_data, orm.QueryData{})!
138138
}
139139

140140
pub fn (db Connection) update(table string, data orm.QueryData, where orm.QueryData) ! {
141-
query, _ := orm.orm_stmt_gen(table, '`', .update, false, '?', 1, data, where)
141+
query, _ := orm.orm_stmt_gen(.default, table, '`', .update, false, '?', 1, data, where)
142142
mysql_stmt_worker(db, query, data, where)!
143143
}
144144

145145
pub fn (db Connection) delete(table string, where orm.QueryData) ! {
146-
query, _ := orm.orm_stmt_gen(table, '`', .delete, false, '?', 1, orm.QueryData{},
146+
query, _ := orm.orm_stmt_gen(.default, table, '`', .delete, false, '?', 1, orm.QueryData{},
147147
where)
148148
mysql_stmt_worker(db, query, orm.QueryData{}, where)!
149149
}

vlib/orm/orm.v

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@ pub enum OrderType {
7979
desc
8080
}
8181

82+
pub enum SQLDialect {
83+
default
84+
sqlite
85+
}
86+
8287
fn (kind OperationKind) to_str() string {
8388
str := match kind {
8489
.neq { '!=' }
@@ -181,9 +186,9 @@ pub interface Connection {
181186
// Generates an sql stmt, from universal parameter
182187
// q - The quotes character, which can be different in every type, so it's variable
183188
// num - Stmt uses nums at prepared statements (? or ?1)
184-
// qm - Character for prepared statment, qm because of quotation mark like in sqlite
189+
// qm - Character for prepared statement, qm because of quotation mark like in sqlite
185190
// start_pos - When num is true, it's the start position of the counter
186-
pub fn orm_stmt_gen(table string, q string, kind StmtKind, num bool, qm string, start_pos int, data QueryData, where QueryData) (string, QueryData) {
191+
pub fn orm_stmt_gen(sql_dialect SQLDialect, table string, q string, kind StmtKind, num bool, qm string, start_pos int, data QueryData, where QueryData) (string, QueryData) {
187192
mut str := ''
188193
mut c := start_pos
189194
mut data_fields := []string{}
@@ -217,11 +222,19 @@ pub fn orm_stmt_gen(table string, q string, kind StmtKind, num bool, qm string,
217222
c++
218223
}
219224

220-
str += 'INSERT INTO ${q}${table}${q} ('
221-
str += select_fields.join(', ')
222-
str += ') VALUES ('
223-
str += values.join(', ')
224-
str += ')'
225+
str += 'INSERT INTO ${q}${table}${q} '
226+
227+
are_values_empty := values.len == 0
228+
229+
if sql_dialect == .sqlite && are_values_empty {
230+
str += 'DEFAULT VALUES'
231+
} else {
232+
str += '('
233+
str += select_fields.join(', ')
234+
str += ') VALUES ('
235+
str += values.join(', ')
236+
str += ')'
237+
}
225238
}
226239
.update {
227240
str += 'UPDATE ${q}${table}${q} SET '

vlib/orm/orm_fn_test.v

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import orm
22

33
fn test_orm_stmt_gen_update() {
4-
query, _ := orm.orm_stmt_gen('Test', "'", .update, true, '?', 0, orm.QueryData{
4+
query, _ := orm.orm_stmt_gen(.default, 'Test', "'", .update, true, '?', 0, orm.QueryData{
55
fields: ['test', 'a']
66
data: []
77
types: []
@@ -16,7 +16,7 @@ fn test_orm_stmt_gen_update() {
1616
}
1717

1818
fn test_orm_stmt_gen_insert() {
19-
query, _ := orm.orm_stmt_gen('Test', "'", .insert, true, '?', 0, orm.QueryData{
19+
query, _ := orm.orm_stmt_gen(.default, 'Test', "'", .insert, true, '?', 0, orm.QueryData{
2020
fields: ['test', 'a']
2121
data: []
2222
types: []
@@ -26,7 +26,7 @@ fn test_orm_stmt_gen_insert() {
2626
}
2727

2828
fn test_orm_stmt_gen_delete() {
29-
query, _ := orm.orm_stmt_gen('Test', "'", .delete, true, '?', 0, orm.QueryData{
29+
query, _ := orm.orm_stmt_gen(.default, 'Test', "'", .delete, true, '?', 0, orm.QueryData{
3030
fields: ['test', 'a']
3131
data: []
3232
types: []

vlib/orm/orm_insert_test.v

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,33 @@ mut:
2121
text string
2222
}
2323

24+
struct Account {
25+
id int [primary; sql: serial]
26+
}
27+
2428
pub fn insert_parent(db sqlite.DB, mut parent Parent) {
2529
sql db {
2630
insert parent into Parent
2731
}
2832
}
2933

34+
fn test_insert_empty_object() {
35+
db := sqlite.connect(':memory:') or { panic(err) }
36+
37+
account := Account{}
38+
39+
sql db {
40+
create table Account
41+
insert account into Account
42+
}
43+
44+
accounts := sql db {
45+
select from Account
46+
}
47+
48+
assert accounts.len == 1
49+
}
50+
3051
fn test_orm_insert_mut_object() {
3152
db := sqlite.connect(':memory:') or { panic(err) }
3253

vlib/pg/orm.v

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,19 @@ pub fn (db DB) @select(config orm.SelectConfig, data orm.QueryData, where orm.Qu
3131
// sql stmt
3232

3333
pub fn (db DB) insert(table string, data orm.QueryData) ! {
34-
query, converted_data := orm.orm_stmt_gen(table, '"', .insert, true, '$', 1, data,
35-
orm.QueryData{})
34+
query, converted_data := orm.orm_stmt_gen(.default, table, '"', .insert, true, '$',
35+
1, data, orm.QueryData{})
3636
pg_stmt_worker(db, query, converted_data, orm.QueryData{})!
3737
}
3838

3939
pub fn (db DB) update(table string, data orm.QueryData, where orm.QueryData) ! {
40-
query, _ := orm.orm_stmt_gen(table, '"', .update, true, '$', 1, data, where)
40+
query, _ := orm.orm_stmt_gen(.default, table, '"', .update, true, '$', 1, data, where)
4141
pg_stmt_worker(db, query, data, where)!
4242
}
4343

4444
pub fn (db DB) delete(table string, where orm.QueryData) ! {
45-
query, _ := orm.orm_stmt_gen(table, '"', .delete, true, '$', 1, orm.QueryData{}, where)
45+
query, _ := orm.orm_stmt_gen(.default, table, '"', .delete, true, '$', 1, orm.QueryData{},
46+
where)
4647
pg_stmt_worker(db, query, orm.QueryData{}, where)!
4748
}
4849

vlib/sqlite/orm.v

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,19 @@ pub fn (db DB) @select(config orm.SelectConfig, data orm.QueryData, where orm.Qu
5353
// sql stmt
5454

5555
pub fn (db DB) insert(table string, data orm.QueryData) ! {
56-
query, converted_data := orm.orm_stmt_gen(table, '`', .insert, true, '?', 1, data,
57-
orm.QueryData{})
56+
query, converted_data := orm.orm_stmt_gen(.sqlite, table, '`', .insert, true, '?',
57+
1, data, orm.QueryData{})
5858
sqlite_stmt_worker(db, query, converted_data, orm.QueryData{})!
5959
}
6060

6161
pub fn (db DB) update(table string, data orm.QueryData, where orm.QueryData) ! {
62-
query, _ := orm.orm_stmt_gen(table, '`', .update, true, '?', 1, data, where)
62+
query, _ := orm.orm_stmt_gen(.sqlite, table, '`', .update, true, '?', 1, data, where)
6363
sqlite_stmt_worker(db, query, data, where)!
6464
}
6565

6666
pub fn (db DB) delete(table string, where orm.QueryData) ! {
67-
query, _ := orm.orm_stmt_gen(table, '`', .delete, true, '?', 1, orm.QueryData{}, where)
67+
query, _ := orm.orm_stmt_gen(.sqlite, table, '`', .delete, true, '?', 1, orm.QueryData{},
68+
where)
6869
sqlite_stmt_worker(db, query, orm.QueryData{}, where)!
6970
}
7071

0 commit comments

Comments
 (0)