go-on-rails 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +4 -2
- data/lib/generators/gor/gor_generator.rb +8 -4
- data/lib/generators/gor/templates/db.go.erb +2 -2
- data/lib/generators/gor/templates/gor_model.go.erb +217 -41
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4885ebf7ebb9df3a3c2941dd88966f28384975a1
|
4
|
+
data.tar.gz: 71d6fca3d339378f36105063de928ed2f3620d0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 86055cbc92c586e8c1764f392f2bc1ca895faee9b3b0933a3c88c87ea58199bdabfd2b24853a55a9b6b46b51f7bb316e470c9d3004cac3d29b344b4f46390154
|
7
|
+
data.tar.gz: a835298ceea075195217320032977be3530b1dad25aa1233f72ba34d33553e64ed581bdaa248f4c692b3d69b2c325730bd6edd81af92339d9afe930f79b8ae27
|
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
[](https://badge.fury.io/rb/go-on-rails)
|
2
|
+
|
1
3
|
<img align="right" width="260" height="260" src="./go-on-rails.png">
|
2
4
|
|
3
5
|
go-on-rails
|
@@ -9,7 +11,7 @@ go-on-rails is a Rails generator created for three scenarios:
|
|
9
11
|
2. Use your farmiliar Rails tools to develope and manage a Golang app project
|
10
12
|
3. Convert a *not very complicated* Rails app to Golang equivalent
|
11
13
|
|
12
|
-
Here's a simple [example(tutorial)](https://github.com/goonr/example_simple) shows the basic usage of go-on-rails generator, and
|
14
|
+
Here's a simple [example(tutorial)](https://github.com/goonr/example_simple) shows the basic usage of go-on-rails generator, and [another example](https://github.com/goonr/example_with_admin) shows how to integrate Go APIs in a Rails project. Some real-world examples are coming soon.
|
13
15
|
|
14
16
|
## Prerequisites
|
15
17
|
|
@@ -21,7 +23,7 @@ Here's a simple [example(tutorial)](https://github.com/goonr/example_simple) sho
|
|
21
23
|
Add this line to your application's Gemfile:
|
22
24
|
|
23
25
|
```ruby
|
24
|
-
gem 'go-on-rails', '~> 0.1.
|
26
|
+
gem 'go-on-rails', '~> 0.1.4'
|
25
27
|
```
|
26
28
|
|
27
29
|
And then execute:
|
@@ -29,6 +29,10 @@ class GorGenerator < Rails::Generators::Base
|
|
29
29
|
puts "Rails env: [#{rails_env}]"
|
30
30
|
puts "The models: #{@models} will be converted to a Golang App!"
|
31
31
|
|
32
|
+
# read the database configuration
|
33
|
+
@db_config = {}
|
34
|
+
create_database_config(rails_env)
|
35
|
+
|
32
36
|
@models.each do |m|
|
33
37
|
begin
|
34
38
|
klass = m.split('::').inject(Object) { |kls, part| kls.const_get(part) }
|
@@ -48,8 +52,6 @@ class GorGenerator < Rails::Generators::Base
|
|
48
52
|
copy_file "main.go", "go_app/main.go"
|
49
53
|
|
50
54
|
# generate program for database connection
|
51
|
-
@db_config = {}
|
52
|
-
create_database_config(rails_env)
|
53
55
|
template "db.go.erb", "go_app/models/db.go"
|
54
56
|
|
55
57
|
# generate the controllers and views dir
|
@@ -75,6 +77,7 @@ class GorGenerator < Rails::Generators::Base
|
|
75
77
|
|
76
78
|
def create_database_config rails_env
|
77
79
|
db_conf = Rails.configuration.database_configuration[rails_env]
|
80
|
+
db_conf["host"] = "localhost" unless db_conf["host"]
|
78
81
|
case db_conf["adapter"]
|
79
82
|
when "sqlite3"
|
80
83
|
@db_config[:driver_name] = "sqlite3"
|
@@ -82,10 +85,11 @@ class GorGenerator < Rails::Generators::Base
|
|
82
85
|
@db_config[:driver_package] = "_ \"github.com/mattn/go-sqlite3\""
|
83
86
|
when "mysql2"
|
84
87
|
@db_config[:driver_name] = "mysql"
|
88
|
+
db_conf["port"] = 3306 unless db_conf["port"]
|
85
89
|
# MySQL DSN format: username:password@protocol(address)/dbname?param=value
|
86
90
|
# See more: https://github.com/go-sql-driver/mysql
|
87
|
-
format = "%s:%s
|
88
|
-
@db_config[:dsn] = sprintf(format, *db_conf.values_at("username", "password", "host", "database", "encoding"))
|
91
|
+
format = "%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=True&loc=Local"
|
92
|
+
@db_config[:dsn] = sprintf(format, *db_conf.values_at("username", "password", "host", "port", "database", "encoding"))
|
89
93
|
@db_config[:driver_package] = "_ \"github.com/go-sql-driver/mysql\""
|
90
94
|
when "postgresql"
|
91
95
|
@db_config[:driver_name] = "postgres"
|
@@ -7,7 +7,7 @@ import (
|
|
7
7
|
"github.com/jmoiron/sqlx"
|
8
8
|
)
|
9
9
|
|
10
|
-
var
|
10
|
+
var DB *sqlx.DB
|
11
11
|
|
12
12
|
func init() {
|
13
13
|
var err error
|
@@ -19,7 +19,7 @@ func init() {
|
|
19
19
|
if dsn == "" {
|
20
20
|
log.Fatal("Invalid DSN")
|
21
21
|
}
|
22
|
-
|
22
|
+
DB, err = sqlx.Connect(driver_name, dsn)
|
23
23
|
if err != nil {
|
24
24
|
log.Fatal(err)
|
25
25
|
}
|
@@ -9,6 +9,7 @@ import (
|
|
9
9
|
"errors"
|
10
10
|
"fmt"
|
11
11
|
"log"
|
12
|
+
"math"
|
12
13
|
"strings"
|
13
14
|
<%- if @struct_info[:has_datetime_type] -%>
|
14
15
|
"time"
|
@@ -26,13 +27,187 @@ type <%= @model_name %> struct {
|
|
26
27
|
<%= @struct_info[:struct_body] -%>
|
27
28
|
}
|
28
29
|
|
29
|
-
//
|
30
|
+
// DataStruct for the pagination
|
31
|
+
type <%= @model_name %>Page struct {
|
32
|
+
WhereString string
|
33
|
+
WhereParams []interface{}
|
34
|
+
Order map[string]string
|
35
|
+
FirstId int64
|
36
|
+
LastId int64
|
37
|
+
PageNum int
|
38
|
+
PerPage int
|
39
|
+
TotalPages int
|
40
|
+
TotalItems int64
|
41
|
+
orderStr string
|
42
|
+
}
|
43
|
+
|
44
|
+
// Current get the current page of <%= @model_name %>Page object for pagination
|
45
|
+
func (_p *<%= @model_name %>Page) Current() ([]<%= @model_name %>, error) {
|
46
|
+
if _, exist := _p.Order["id"]; !exist {
|
47
|
+
return nil, errors.New("No id order specified in Order map")
|
48
|
+
}
|
49
|
+
err := _p.buildPageCount()
|
50
|
+
if err != nil {
|
51
|
+
return nil, fmt.Errorf("Calculate page count error: %v", err)
|
52
|
+
}
|
53
|
+
if _p.orderStr == "" {
|
54
|
+
_p.buildOrder()
|
55
|
+
}
|
56
|
+
idStr, idParams := _p.buildIdRestrict("current")
|
57
|
+
<% if @db_config[:driver_name] == "postgres" %>
|
58
|
+
whereStr := fmt.Sprintf("%s %s %s FETCH NEXT %v ROWS ONLY", _p.WhereString, idStr, _p.orderStr, _p.PerPage)
|
59
|
+
<% else %>
|
60
|
+
whereStr := fmt.Sprintf("%s %s %s LIMIT %v", _p.WhereString, idStr, _p.orderStr, _p.PerPage)
|
61
|
+
<% end %>
|
62
|
+
whereParams := []interface{}{}
|
63
|
+
whereParams = append(append(whereParams, _p.WhereParams...), idParams...)
|
64
|
+
<%= param_name_plural %>, err := Find<%= @model_name.pluralize %>Where(whereStr, whereParams...)
|
65
|
+
if err != nil {
|
66
|
+
return nil, err
|
67
|
+
}
|
68
|
+
if len(<%= param_name_plural %>) != 0 {
|
69
|
+
_p.FirstId, _p.LastId = <%= param_name_plural %>[0].Id, <%= param_name_plural %>[len(<%= param_name_plural %>)-1].Id
|
70
|
+
}
|
71
|
+
return <%= param_name_plural %>, nil
|
72
|
+
}
|
73
|
+
|
74
|
+
// Current get the previous page of <%= @model_name %>Page object for pagination
|
75
|
+
func (_p *<%= @model_name %>Page) Previous() ([]<%= @model_name %>, error) {
|
76
|
+
if _p.PageNum == 0 {
|
77
|
+
return nil, errors.New("This's the first page, no previous page yet")
|
78
|
+
}
|
79
|
+
if _, exist := _p.Order["id"]; !exist {
|
80
|
+
return nil, errors.New("No id order specified in Order map")
|
81
|
+
}
|
82
|
+
err := _p.buildPageCount()
|
83
|
+
if err != nil {
|
84
|
+
return nil, fmt.Errorf("Calculate page count error: %v", err)
|
85
|
+
}
|
86
|
+
if _p.orderStr == "" {
|
87
|
+
_p.buildOrder()
|
88
|
+
}
|
89
|
+
idStr, idParams := _p.buildIdRestrict("previous")
|
90
|
+
<% if @db_config[:driver_name] == "postgres" %>
|
91
|
+
whereStr := fmt.Sprintf("%s %s %s FETCH NEXT %v ROWS ONLY", _p.WhereString, idStr, _p.orderStr, _p.PerPage)
|
92
|
+
<% else %>
|
93
|
+
whereStr := fmt.Sprintf("%s %s %s LIMIT %v", _p.WhereString, idStr, _p.orderStr, _p.PerPage)
|
94
|
+
<% end %>
|
95
|
+
whereParams := []interface{}{}
|
96
|
+
whereParams = append(append(whereParams, _p.WhereParams...), idParams...)
|
97
|
+
<%= param_name_plural %>, err := Find<%= @model_name.pluralize %>Where(whereStr, whereParams...)
|
98
|
+
if err != nil {
|
99
|
+
return nil, err
|
100
|
+
}
|
101
|
+
if len(<%= param_name_plural %>) != 0 {
|
102
|
+
_p.FirstId, _p.LastId = <%= param_name_plural %>[0].Id, <%= param_name_plural %>[len(<%= param_name_plural %>)-1].Id
|
103
|
+
}
|
104
|
+
_p.PageNum -= 1
|
105
|
+
return <%= param_name_plural %>, nil
|
106
|
+
}
|
107
|
+
|
108
|
+
// Current get the next page of <%= @model_name %>Page object for pagination
|
109
|
+
func (_p *<%= @model_name %>Page) Next() ([]<%= @model_name %>, error) {
|
110
|
+
if _p.PageNum == _p.TotalPages-1 {
|
111
|
+
return nil, errors.New("This's the last page, no next page yet")
|
112
|
+
}
|
113
|
+
if _, exist := _p.Order["id"]; !exist {
|
114
|
+
return nil, errors.New("No id order specified in Order map")
|
115
|
+
}
|
116
|
+
err := _p.buildPageCount()
|
117
|
+
if err != nil {
|
118
|
+
return nil, fmt.Errorf("Calculate page count error: %v", err)
|
119
|
+
}
|
120
|
+
if _p.orderStr == "" {
|
121
|
+
_p.buildOrder()
|
122
|
+
}
|
123
|
+
idStr, idParams := _p.buildIdRestrict("next")
|
124
|
+
<% if @db_config[:driver_name] == "postgres" %>
|
125
|
+
whereStr := fmt.Sprintf("%s %s %s FETCH NEXT %v ROWS ONLY", _p.WhereString, idStr, _p.orderStr, _p.PerPage)
|
126
|
+
<% else %>
|
127
|
+
whereStr := fmt.Sprintf("%s %s %s LIMIT %v", _p.WhereString, idStr, _p.orderStr, _p.PerPage)
|
128
|
+
<% end %>
|
129
|
+
whereParams := []interface{}{}
|
130
|
+
whereParams = append(append(whereParams, _p.WhereParams...), idParams...)
|
131
|
+
<%= param_name_plural %>, err := Find<%= @model_name.pluralize %>Where(whereStr, whereParams...)
|
132
|
+
if err != nil {
|
133
|
+
return nil, err
|
134
|
+
}
|
135
|
+
if len(<%= param_name_plural %>) != 0 {
|
136
|
+
_p.FirstId, _p.LastId = <%= param_name_plural %>[0].Id, <%= param_name_plural %>[len(<%= param_name_plural %>)-1].Id
|
137
|
+
}
|
138
|
+
_p.PageNum += 1
|
139
|
+
return <%= param_name_plural %>, nil
|
140
|
+
}
|
141
|
+
|
142
|
+
// buildOrder is for <%= @model_name %>Page object to build SQL ORDER clause
|
143
|
+
func (_p *<%= @model_name %>Page) buildOrder() {
|
144
|
+
tempList := []string{}
|
145
|
+
for k, v := range _p.Order {
|
146
|
+
tempList = append(tempList, fmt.Sprintf("%v %v", k, v))
|
147
|
+
}
|
148
|
+
_p.orderStr = " ORDER BY " + strings.Join(tempList, ", ")
|
149
|
+
}
|
150
|
+
|
151
|
+
// buildIdRestrict is for <%= @model_name %>Page object to build a SQL clause for ID restriction,
|
152
|
+
// implementing a simple keyset style pagination
|
153
|
+
func (_p *<%= @model_name %>Page) buildIdRestrict(direction string) (idStr string, idParams []interface{}) {
|
154
|
+
switch direction {
|
155
|
+
case "previous":
|
156
|
+
if strings.ToLower(_p.Order["id"]) == "desc" {
|
157
|
+
idStr += "id > ? "
|
158
|
+
idParams = append(_p.WhereParams, _p.FirstId)
|
159
|
+
} else {
|
160
|
+
idStr += "id < ? "
|
161
|
+
idParams = append(_p.WhereParams, _p.FirstId)
|
162
|
+
}
|
163
|
+
case "current":
|
164
|
+
// trick to make Where function work
|
165
|
+
if _p.PageNum == 0 && _p.FirstId == 0 && _p.LastId == 0 {
|
166
|
+
idStr += "id > ? "
|
167
|
+
idParams = append(_p.WhereParams, 0)
|
168
|
+
} else {
|
169
|
+
if strings.ToLower(_p.Order["id"]) == "desc" {
|
170
|
+
idStr += "id <= ? AND id >= ? "
|
171
|
+
idParams = append(_p.WhereParams, _p.FirstId, _p.LastId)
|
172
|
+
} else {
|
173
|
+
idStr += "id >= ? AND id <= ? "
|
174
|
+
idParams = append(_p.WhereParams, _p.FirstId, _p.LastId)
|
175
|
+
}
|
176
|
+
}
|
177
|
+
case "next":
|
178
|
+
if strings.ToLower(_p.Order["id"]) == "desc" {
|
179
|
+
idStr += "id < ? "
|
180
|
+
idParams = append(_p.WhereParams, _p.LastId)
|
181
|
+
} else {
|
182
|
+
idStr += "id > ? "
|
183
|
+
idParams = append(_p.WhereParams, _p.LastId)
|
184
|
+
}
|
185
|
+
}
|
186
|
+
return
|
187
|
+
}
|
188
|
+
|
189
|
+
// buildPageCount calculate the TotalItems/TotalPages for the <%= @model_name %>Page object
|
190
|
+
func (_p *<%= @model_name %>Page) buildPageCount() error {
|
191
|
+
count, err := <%= @model_name %>CountWhere(_p.WhereString, _p.WhereParams...)
|
192
|
+
if err != nil {
|
193
|
+
return err
|
194
|
+
}
|
195
|
+
_p.TotalItems = count
|
196
|
+
if _p.PerPage == 0 {
|
197
|
+
_p.PerPage = 10
|
198
|
+
}
|
199
|
+
_p.TotalPages = int(math.Ceil(float64(_p.TotalItems) / float64(_p.PerPage)))
|
200
|
+
return nil
|
201
|
+
}
|
202
|
+
|
203
|
+
|
204
|
+
// Find<%= @model_name %> find a single <%= model_name_underscore %> by an ID
|
30
205
|
func Find<%= @model_name %>(id int64) (*<%= @model_name %>, error) {
|
31
206
|
if id == 0 {
|
32
|
-
return nil, errors.New("Invalid
|
207
|
+
return nil, errors.New("Invalid ID: it can't be zero")
|
33
208
|
}
|
34
209
|
_<%= model_name_underscore %> := <%= @model_name %>{}
|
35
|
-
err :=
|
210
|
+
err := DB.Get(&_<%= model_name_underscore %>, DB.Rebind(`SELECT * FROM <%= table_name %> WHERE id = ? LIMIT 1`), id)
|
36
211
|
if err != nil {
|
37
212
|
log.Printf("Error: %v\n", err)
|
38
213
|
return nil, err
|
@@ -40,10 +215,10 @@ func Find<%= @model_name %>(id int64) (*<%= @model_name %>, error) {
|
|
40
215
|
return &_<%= model_name_underscore %>, nil
|
41
216
|
}
|
42
217
|
|
43
|
-
// First<%= @model_name %> find the first one <%= model_name_underscore %> by
|
218
|
+
// First<%= @model_name %> find the first one <%= model_name_underscore %> by ID ASC order
|
44
219
|
func First<%= @model_name %>() (*<%= @model_name %>, error) {
|
45
220
|
_<%= model_name_underscore %> := <%= @model_name %>{}
|
46
|
-
err :=
|
221
|
+
err := DB.Get(&_<%= model_name_underscore %>, DB.Rebind(`SELECT * FROM <%= table_name %> ORDER BY id ASC LIMIT 1`))
|
47
222
|
if err != nil {
|
48
223
|
log.Printf("Error: %v\n", err)
|
49
224
|
return nil, err
|
@@ -51,11 +226,11 @@ func First<%= @model_name %>() (*<%= @model_name %>, error) {
|
|
51
226
|
return &_<%= model_name_underscore %>, nil
|
52
227
|
}
|
53
228
|
|
54
|
-
// First<%= @model_name.pluralize %> find the first N <%= model_name_underscore.pluralize %> by
|
229
|
+
// First<%= @model_name.pluralize %> find the first N <%= model_name_underscore.pluralize %> by ID ASC order
|
55
230
|
func First<%= @model_name.pluralize %>(n uint32) ([]<%= @model_name %>, error) {
|
56
231
|
_<%= param_name_plural %> := []<%= @model_name %>{}
|
57
232
|
sql := fmt.Sprintf("SELECT * FROM <%= table_name %> ORDER BY id ASC LIMIT %v", n)
|
58
|
-
err :=
|
233
|
+
err := DB.Select(&_<%= param_name_plural %>, DB.Rebind(sql))
|
59
234
|
if err != nil {
|
60
235
|
log.Printf("Error: %v\n", err)
|
61
236
|
return nil, err
|
@@ -63,10 +238,10 @@ func First<%= @model_name.pluralize %>(n uint32) ([]<%= @model_name %>, error) {
|
|
63
238
|
return _<%= param_name_plural %>, nil
|
64
239
|
}
|
65
240
|
|
66
|
-
// Last<%= @model_name %> find the last one <%= model_name_underscore %> by
|
241
|
+
// Last<%= @model_name %> find the last one <%= model_name_underscore %> by ID DESC order
|
67
242
|
func Last<%= @model_name %>() (*<%= @model_name %>, error) {
|
68
243
|
_<%= model_name_underscore %> := <%= @model_name %>{}
|
69
|
-
err :=
|
244
|
+
err := DB.Get(&_<%= model_name_underscore %>, DB.Rebind(`SELECT * FROM <%= table_name %> ORDER BY id DESC LIMIT 1`))
|
70
245
|
if err != nil {
|
71
246
|
log.Printf("Error: %v\n", err)
|
72
247
|
return nil, err
|
@@ -74,11 +249,11 @@ func Last<%= @model_name %>() (*<%= @model_name %>, error) {
|
|
74
249
|
return &_<%= model_name_underscore %>, nil
|
75
250
|
}
|
76
251
|
|
77
|
-
// Last<%= @model_name.pluralize %> find the last N <%= model_name_underscore.pluralize %> by
|
252
|
+
// Last<%= @model_name.pluralize %> find the last N <%= model_name_underscore.pluralize %> by ID DESC order
|
78
253
|
func Last<%= @model_name.pluralize %>(n uint32) ([]<%= @model_name %>, error) {
|
79
254
|
_<%= param_name_plural %> := []<%= @model_name %>{}
|
80
255
|
sql := fmt.Sprintf("SELECT * FROM <%= table_name %> ORDER BY id DESC LIMIT %v", n)
|
81
|
-
err :=
|
256
|
+
err := DB.Select(&_<%= param_name_plural %>, DB.Rebind(sql))
|
82
257
|
if err != nil {
|
83
258
|
log.Printf("Error: %v\n", err)
|
84
259
|
return nil, err
|
@@ -86,7 +261,7 @@ func Last<%= @model_name.pluralize %>(n uint32) ([]<%= @model_name %>, error) {
|
|
86
261
|
return _<%= param_name_plural %>, nil
|
87
262
|
}
|
88
263
|
|
89
|
-
// Find<%= @model_name.pluralize %> find one or more <%= model_name_underscore.pluralize %> by
|
264
|
+
// Find<%= @model_name.pluralize %> find one or more <%= model_name_underscore.pluralize %> by the given ID(s)
|
90
265
|
func Find<%= @model_name.pluralize %>(ids ...int64) ([]<%= @model_name %>, error) {
|
91
266
|
if len(ids) == 0 {
|
92
267
|
msg := "At least one or more ids needed"
|
@@ -95,12 +270,12 @@ func Find<%= @model_name.pluralize %>(ids ...int64) ([]<%= @model_name %>, error
|
|
95
270
|
}
|
96
271
|
_<%= param_name_plural %> := []<%= @model_name %>{}
|
97
272
|
idsHolder := strings.Repeat(",?", len(ids)-1)
|
98
|
-
sql :=
|
273
|
+
sql := DB.Rebind(fmt.Sprintf(`SELECT * FROM <%= table_name %> WHERE id IN (?%s)`, idsHolder))
|
99
274
|
idsT := []interface{}{}
|
100
275
|
for _,id := range ids {
|
101
276
|
idsT = append(idsT, interface{}(id))
|
102
277
|
}
|
103
|
-
err :=
|
278
|
+
err := DB.Select(&_<%= param_name_plural %>, sql, idsT...)
|
104
279
|
if err != nil {
|
105
280
|
log.Printf("Error: %v\n", err)
|
106
281
|
return nil, err
|
@@ -113,7 +288,7 @@ func Find<%= @model_name %>By(field string, val interface{}) (*<%= @model_name %
|
|
113
288
|
_<%= model_name_underscore %> := <%= @model_name %>{}
|
114
289
|
sqlFmt := `SELECT * FROM <%= table_name %> WHERE %s = ? LIMIT 1`
|
115
290
|
sqlStr := fmt.Sprintf(sqlFmt, field)
|
116
|
-
err :=
|
291
|
+
err := DB.Get(&_<%= model_name_underscore %>, DB.Rebind(sqlStr), val)
|
117
292
|
if err != nil {
|
118
293
|
log.Printf("Error: %v\n", err)
|
119
294
|
return nil, err
|
@@ -125,7 +300,7 @@ func Find<%= @model_name %>By(field string, val interface{}) (*<%= @model_name %
|
|
125
300
|
func Find<%= @model_name.pluralize %>By(field string, val interface{}) (_<%= param_name_plural %> []<%= @model_name %>, err error) {
|
126
301
|
sqlFmt := `SELECT * FROM <%= table_name %> WHERE %s = ?`
|
127
302
|
sqlStr := fmt.Sprintf(sqlFmt, field)
|
128
|
-
err =
|
303
|
+
err = DB.Select(&_<%= param_name_plural %>, DB.Rebind(sqlStr), val)
|
129
304
|
if err != nil {
|
130
305
|
log.Printf("Error: %v\n", err)
|
131
306
|
return nil, err
|
@@ -135,7 +310,7 @@ func Find<%= @model_name.pluralize %>By(field string, val interface{}) (_<%= par
|
|
135
310
|
|
136
311
|
// All<%= @model_name.pluralize %> get all the <%= @model_name %> records
|
137
312
|
func All<%= @model_name.pluralize %>() (<%= param_name_plural %> []<%= @model_name %>, err error) {
|
138
|
-
err =
|
313
|
+
err = DB.Select(&<%= param_name_plural %>, "SELECT * FROM <%= table_name %>")
|
139
314
|
if err != nil {
|
140
315
|
log.Println(err)
|
141
316
|
return nil, err
|
@@ -145,7 +320,7 @@ func All<%= @model_name.pluralize %>() (<%= param_name_plural %> []<%= @model_na
|
|
145
320
|
|
146
321
|
// <%= @model_name %>Count get the count of all the <%= @model_name %> records
|
147
322
|
func <%= @model_name %>Count() (c int64, err error) {
|
148
|
-
err =
|
323
|
+
err = DB.Get(&c, "SELECT count(*) FROM <%= table_name %>")
|
149
324
|
if err != nil {
|
150
325
|
log.Println(err)
|
151
326
|
return 0, err
|
@@ -159,7 +334,7 @@ func <%= @model_name %>CountWhere(where string, args ...interface{}) (c int64, e
|
|
159
334
|
if len(where) > 0 {
|
160
335
|
sql = sql + " WHERE " + where
|
161
336
|
}
|
162
|
-
stmt, err :=
|
337
|
+
stmt, err := DB.Preparex(DB.Rebind(sql))
|
163
338
|
if err != nil {
|
164
339
|
log.Println(err)
|
165
340
|
return 0, err
|
@@ -272,9 +447,9 @@ func <%= @model_name %>IncludesWhere(assocs []string, sql string, args ...interf
|
|
272
447
|
return _<%= param_name_plural %>, nil
|
273
448
|
}
|
274
449
|
|
275
|
-
// <%= @model_name %>Ids get all the
|
450
|
+
// <%= @model_name %>Ids get all the IDs of <%= @model_name %> records
|
276
451
|
func <%= @model_name %>Ids() (ids []int64, err error) {
|
277
|
-
err =
|
452
|
+
err = DB.Select(&ids, "SELECT id FROM <%= table_name %>")
|
278
453
|
if err != nil {
|
279
454
|
log.Println(err)
|
280
455
|
return nil, err
|
@@ -282,7 +457,7 @@ func <%= @model_name %>Ids() (ids []int64, err error) {
|
|
282
457
|
return ids, nil
|
283
458
|
}
|
284
459
|
|
285
|
-
// <%= @model_name %>IdsWhere get all the
|
460
|
+
// <%= @model_name %>IdsWhere get all the IDs of <%= @model_name %> records by where restriction
|
286
461
|
func <%= @model_name %>IdsWhere(where string, args ...interface{}) ([]int64, error) {
|
287
462
|
ids, err := <%= @model_name %>IntCol("id", where, args...)
|
288
463
|
return ids, err
|
@@ -294,7 +469,7 @@ func <%= @model_name %>IntCol(col, where string, args ...interface{}) (intColRec
|
|
294
469
|
if len(where) > 0 {
|
295
470
|
sql = sql + " WHERE " + where
|
296
471
|
}
|
297
|
-
stmt, err :=
|
472
|
+
stmt, err := DB.Preparex(DB.Rebind(sql))
|
298
473
|
if err != nil {
|
299
474
|
log.Println(err)
|
300
475
|
return nil, err
|
@@ -313,7 +488,7 @@ func <%= @model_name %>StrCol(col, where string, args ...interface{}) (strColRec
|
|
313
488
|
if len(where) > 0 {
|
314
489
|
sql = sql + " WHERE " + where
|
315
490
|
}
|
316
|
-
stmt, err :=
|
491
|
+
stmt, err := DB.Preparex(DB.Rebind(sql))
|
317
492
|
if err != nil {
|
318
493
|
log.Println(err)
|
319
494
|
return nil, err
|
@@ -334,7 +509,7 @@ func Find<%= @model_name.pluralize %>Where(where string, args ...interface{}) (<
|
|
334
509
|
if len(where) > 0 {
|
335
510
|
sql = sql + " WHERE " + where
|
336
511
|
}
|
337
|
-
stmt, err :=
|
512
|
+
stmt, err := DB.Preparex(DB.Rebind(sql))
|
338
513
|
if err != nil {
|
339
514
|
log.Println(err)
|
340
515
|
return nil, err
|
@@ -351,7 +526,7 @@ func Find<%= @model_name.pluralize %>Where(where string, args ...interface{}) (<
|
|
351
526
|
// with placeholders, eg: FindUserBySql("SELECT * FROM users WHERE first_name = ? AND age > ? ORDER BY DESC LIMIT 1", "John", 18)
|
352
527
|
// will return only One record in the table "users" whose first_name is "John" and age elder than 18
|
353
528
|
func Find<%= @model_name %>BySql(sql string, args ...interface{}) (*<%= @model_name %>, error) {
|
354
|
-
stmt, err :=
|
529
|
+
stmt, err := DB.Preparex(DB.Rebind(sql))
|
355
530
|
if err != nil {
|
356
531
|
log.Println(err)
|
357
532
|
return nil, err
|
@@ -369,7 +544,7 @@ func Find<%= @model_name %>BySql(sql string, args ...interface{}) (*<%= @model_n
|
|
369
544
|
// with placeholders, eg: FindUsersBySql("SELECT * FROM users WHERE first_name = ? AND age > ?", "John", 18)
|
370
545
|
// will return those records in the table "users" whose first_name is "John" and age elder than 18
|
371
546
|
func Find<%= @model_name.pluralize %>BySql(sql string, args ...interface{}) (<%= param_name_plural %> []<%= @model_name %>, err error) {
|
372
|
-
stmt, err :=
|
547
|
+
stmt, err := DB.Preparex(DB.Rebind(sql))
|
373
548
|
if err != nil {
|
374
549
|
log.Println(err)
|
375
550
|
return nil, err
|
@@ -404,7 +579,7 @@ func Create<%= @model_name %>(am map[string]interface{}) (int64, error) {
|
|
404
579
|
}
|
405
580
|
sqlFmt := `INSERT INTO <%= table_name %> (%s) VALUES (%s)`
|
406
581
|
sqlStr := fmt.Sprintf(sqlFmt, strings.Join(keys, ","), ":"+strings.Join(keys, ",:"))
|
407
|
-
result, err :=
|
582
|
+
result, err := DB.NamedExec(sqlStr, am)
|
408
583
|
if err != nil {
|
409
584
|
log.Println(err)
|
410
585
|
return 0, err
|
@@ -435,7 +610,7 @@ func (_<%= model_name_underscore %> *<%= @model_name %>) Create() (int64, error)
|
|
435
610
|
<%- end -%>
|
436
611
|
<%- end -%>
|
437
612
|
sql := `INSERT INTO <%= table_name %> (<%= col_names.join(",") %>) VALUES (:<%= col_names.join(",:") %>)`
|
438
|
-
result, err :=
|
613
|
+
result, err := DB.NamedExec(sql, _<%= model_name_underscore %>)
|
439
614
|
if err != nil {
|
440
615
|
log.Println(err)
|
441
616
|
return 0, err
|
@@ -517,7 +692,7 @@ func <%= @model_name %>Get<%= k.pluralize %>(id int64) ([]<%= v[:class_name] %>,
|
|
517
692
|
<%- unless @struct_info[:assoc_info][:has_one].empty? -%>
|
518
693
|
<%- has_one = @struct_info[:assoc_info][:has_one] -%>
|
519
694
|
<%- has_one.each do |k, v| -%>
|
520
|
-
// Create<%= k %> is a method
|
695
|
+
// Create<%= k %> is a method for the <%= @model_name %> model object to create an associated <%= k %> record
|
521
696
|
func (_<%= model_name_underscore %> *<%= @model_name %>) Create<%= k %>(am map[string]interface{}) error {
|
522
697
|
<%- if v[:foreign_key] -%>
|
523
698
|
am["<%= v[:foreign_key] %>"] = _<%= model_name_underscore %>.Id
|
@@ -557,14 +732,14 @@ func (_<%= model_name_underscore %> *<%= @model_name %>) Destroy() error {
|
|
557
732
|
return err
|
558
733
|
}
|
559
734
|
|
560
|
-
// Destroy<%= @model_name %> will destroy a <%= @model_name %> record specified by id parameter.
|
735
|
+
// Destroy<%= @model_name %> will destroy a <%= @model_name %> record specified by the id parameter.
|
561
736
|
func Destroy<%= @model_name %>(id int64) error {
|
562
737
|
<%- if @struct_info[:has_assoc_dependent] -%>
|
563
738
|
// Destroy association objects at first
|
564
739
|
// Not care if exec properly temporarily
|
565
740
|
destroy<%= @model_name %>Associations(id)
|
566
741
|
<%- end -%>
|
567
|
-
stmt, err :=
|
742
|
+
stmt, err := DB.Preparex(DB.Rebind(`DELETE FROM <%= table_name %> WHERE id = ?`))
|
568
743
|
_, err = stmt.Exec(id)
|
569
744
|
if err != nil {
|
570
745
|
return err
|
@@ -590,7 +765,7 @@ func Destroy<%= @model_name.pluralize %>(ids ...int64) (int64, error) {
|
|
590
765
|
for _,id := range ids {
|
591
766
|
idsT = append(idsT, interface{}(id))
|
592
767
|
}
|
593
|
-
stmt, err :=
|
768
|
+
stmt, err := DB.Preparex(DB.Rebind(sql))
|
594
769
|
result, err := stmt.Exec(idsT...)
|
595
770
|
if err != nil {
|
596
771
|
return 0, err
|
@@ -602,8 +777,8 @@ func Destroy<%= @model_name.pluralize %>(ids ...int64) (int64, error) {
|
|
602
777
|
return cnt, nil
|
603
778
|
}
|
604
779
|
|
605
|
-
// Destroy<%= @model_name.pluralize %>Where delete records by a where clause
|
606
|
-
//
|
780
|
+
// Destroy<%= @model_name.pluralize %>Where delete records by a where clause restriction.
|
781
|
+
// e.g. Destroy<%= @model_name.pluralize %>Where("name = ?", "John")
|
607
782
|
// And this func will not call the association dependent action
|
608
783
|
func Destroy<%= @model_name.pluralize %>Where(where string, args ...interface{}) (int64, error) {
|
609
784
|
sql := `DELETE FROM <%= table_name %> WHERE `
|
@@ -620,7 +795,7 @@ func Destroy<%= @model_name.pluralize %>Where(where string, args ...interface{})
|
|
620
795
|
destroy<%= @model_name %>Associations(ids...)
|
621
796
|
}
|
622
797
|
<%- end -%>
|
623
|
-
stmt, err :=
|
798
|
+
stmt, err := DB.Preparex(DB.Rebind(sql))
|
624
799
|
result, err := stmt.Exec(args...)
|
625
800
|
if err != nil {
|
626
801
|
return 0, err
|
@@ -731,7 +906,7 @@ func (_<%= model_name_underscore %> *<%= @model_name %>) Save() error {
|
|
731
906
|
sqlFmt := `UPDATE <%= table_name %> SET %s WHERE id = %v`
|
732
907
|
<%- save_col_names = col_names - ["created_at"] -%>
|
733
908
|
sqlStr := fmt.Sprintf(sqlFmt, "<%= save_col_names.zip(save_col_names).map{|c| c.join(" = :")}.join(", ") %>", _<%= model_name_underscore %>.Id)
|
734
|
-
_, err =
|
909
|
+
_, err = DB.NamedExec(sqlStr, _<%= model_name_underscore %>)
|
735
910
|
return err
|
736
911
|
}
|
737
912
|
|
@@ -756,7 +931,7 @@ func Update<%= @model_name %>(id int64, am map[string]interface{}) error {
|
|
756
931
|
setKeysArr = append(setKeysArr, s)
|
757
932
|
}
|
758
933
|
sqlStr := fmt.Sprintf(sqlFmt, strings.Join(setKeysArr, ", "), id)
|
759
|
-
_, err :=
|
934
|
+
_, err := DB.NamedExec(sqlStr, am)
|
760
935
|
if err != nil {
|
761
936
|
log.Println(err)
|
762
937
|
return err
|
@@ -773,6 +948,7 @@ func (_<%= model_name_underscore %> *<%= @model_name %>) Update(am map[string]in
|
|
773
948
|
return err
|
774
949
|
}
|
775
950
|
|
951
|
+
// UpdateAttributes method is supposed to be used to update <%= @model_name %> records as corresponding update_attributes in Ruby on Rails.
|
776
952
|
func (_<%= model_name_underscore %> *<%= @model_name %>) UpdateAttributes(am map[string]interface{}) error {
|
777
953
|
if _<%= model_name_underscore %>.Id == 0 {
|
778
954
|
return errors.New("Invalid Id field: it can't be a zero value")
|
@@ -781,7 +957,7 @@ func (_<%= model_name_underscore %> *<%= @model_name %>) UpdateAttributes(am map
|
|
781
957
|
return err
|
782
958
|
}
|
783
959
|
|
784
|
-
// UpdateColumns method is supposed to be used to update <%= @model_name %> records as corresponding update_columns in Rails
|
960
|
+
// UpdateColumns method is supposed to be used to update <%= @model_name %> records as corresponding update_columns in Ruby on Rails.
|
785
961
|
func (_<%= model_name_underscore %> *<%= @model_name %>) UpdateColumns(am map[string]interface{}) error {
|
786
962
|
if _<%= model_name_underscore %>.Id == 0 {
|
787
963
|
return errors.New("Invalid Id field: it can't be a zero value")
|
@@ -791,7 +967,7 @@ func (_<%= model_name_underscore %> *<%= @model_name %>) UpdateColumns(am map[st
|
|
791
967
|
}
|
792
968
|
|
793
969
|
// Update<%= @model_name.pluralize %>BySql is used to update <%= @model_name %> records by a SQL clause
|
794
|
-
//
|
970
|
+
// using the '?' binding syntax.
|
795
971
|
func Update<%= @model_name.pluralize %>BySql(sql string, args ...interface{}) (int64, error) {
|
796
972
|
if sql == "" {
|
797
973
|
return 0, errors.New("A blank SQL clause")
|
@@ -800,7 +976,7 @@ func Update<%= @model_name.pluralize %>BySql(sql string, args ...interface{}) (i
|
|
800
976
|
sql = strings.Replace(strings.ToLower(sql), "set", "set updated_at = ?, ", 1)
|
801
977
|
args = append([]interface{}{time.Now()}, args...)
|
802
978
|
<%- end -%>
|
803
|
-
stmt, err :=
|
979
|
+
stmt, err := DB.Preparex(DB.Rebind(sql))
|
804
980
|
result, err := stmt.Exec(args...)
|
805
981
|
if err != nil {
|
806
982
|
return 0, err
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: go-on-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- B1nj0y
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-05 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Modeling, developing and testing your Golang app with your familiar Rails
|
14
14
|
tools like rails generate, db migration, console etc. It is more meant to help integrating
|