go-on-rails 0.0.9 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +19 -3
- data/lib/generators/gor/templates/gor_model.go.erb +44 -5
- 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: 98efb6c9f89545a36de83af4b3a972af42dcdab3
|
4
|
+
data.tar.gz: 15f4301f4f7030325d8e9e29140b31308118e75d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f3827a7e075ce518bfc57a595174d8b2d6a68372c5f8b093d45b67fae06ad7ab46b20a8e6aa2f10a2a4879da1d62b2fe4312d20dc507060c2bef5c28807770a7
|
7
|
+
data.tar.gz: 65b16cacd2909f45a721903be8e51676043c365840db2c82c6a1e44dd18ed85a991827c8fcb1fdf9a31810ca99746ff0068c5037e7f8df9e535b15fa0cbef3b4
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@ go-on-rails aims at three scenarios:
|
|
9
9
|
2. Use your farmiliar Rails tools to develope and manage a Golang app project
|
10
10
|
3. Convert a *not very complicated* Rails app to Golang equivalent
|
11
11
|
|
12
|
-
|
12
|
+
Here's a simple [example(tutorial)](https://github.com/goonr/example_simple) shows the basic usage of go-on-rails generator, and some real-world examples are coming soon.
|
13
13
|
|
14
14
|
## Prerequisites
|
15
15
|
|
@@ -21,7 +21,7 @@ One or more examples will be given later on.
|
|
21
21
|
Add this line to your application's Gemfile:
|
22
22
|
|
23
23
|
```ruby
|
24
|
-
gem 'go-on-rails', '~> 0.0
|
24
|
+
gem 'go-on-rails', '~> 0.1.0'
|
25
25
|
```
|
26
26
|
|
27
27
|
And then execute:
|
@@ -51,7 +51,7 @@ Install the dependent Golang packages:
|
|
51
51
|
rails gor:deps
|
52
52
|
```
|
53
53
|
|
54
|
-
Then change to the
|
54
|
+
Then change to the `go_app` directory and run:
|
55
55
|
|
56
56
|
```bash
|
57
57
|
go run main.go
|
@@ -65,6 +65,13 @@ More command details about go-on-rails generator:
|
|
65
65
|
rails g gor --help
|
66
66
|
```
|
67
67
|
|
68
|
+
## What will be generated?
|
69
|
+
|
70
|
+
* Go project directory layout (all under the `go_app` directory, like `views`, `controllers`, `public`)
|
71
|
+
* A Go data struct corresponding to each activerecord model
|
72
|
+
* And each struct related CRUD functions/methods like FindModel, UpdateModel, DestroyModle etc. All these models related program files under the `go_app/models` directory
|
73
|
+
* We use [Gin](https://github.com/gin-gonic/gin) as the default web framework, but you can change it to anyone that you favor in `main.go` and `controllers` programs
|
74
|
+
|
68
75
|
And the gem is still under development, so there're a lot of known issues.
|
69
76
|
|
70
77
|
## Known issues and TODOs
|
@@ -79,6 +86,15 @@ And the gem is still under development, so there're a lot of known issues.
|
|
79
86
|
|
80
87
|
Really a lot...
|
81
88
|
|
89
|
+
## Golang dependencies by default
|
90
|
+
|
91
|
+
* `github.com/jmoiron/sqlx`: an extension on the standard `database/sql` database API library
|
92
|
+
* `github.com/mattn/go-sqlite3`: a SQLite driver
|
93
|
+
* `github.com/go-sql-driver/mysql`: a MySQL driver
|
94
|
+
* `github.com/lib/pq`: a PostgreSQL driver
|
95
|
+
* `github.com/asaskevich/govalidator`: for the struct validation
|
96
|
+
* `gopkg.in/gin-gonic/gin.v1`: a HTTP web framework
|
97
|
+
|
82
98
|
## Acknowledgement
|
83
99
|
|
84
100
|
When I had the idea to convert Rails app or build Golang app with Rails tools, I searched github and found the project: https://github.com/t-k/ar2gostruct. And from ar2gostruct I copied some codes on handling data structure convertion and models association, it make my idea come true faster than I imagined.
|
@@ -133,7 +133,7 @@ func Find<%= @model_name.pluralize %>By(field string, val interface{}) (var_<%=
|
|
133
133
|
|
134
134
|
// All<%= @model_name.pluralize %> get all the <%= @model_name %> records
|
135
135
|
func All<%= @model_name.pluralize %>() (<%= param_name_plural %> []<%= @model_name %>, err error) {
|
136
|
-
err = db.Select(&<%=
|
136
|
+
err = db.Select(&<%= param_name_plural %>, "SELECT * FROM <%= table_name %>")
|
137
137
|
if err != nil {
|
138
138
|
log.Println(err)
|
139
139
|
return nil, err
|
@@ -141,6 +141,36 @@ func All<%= @model_name.pluralize %>() (<%= param_name_plural %> []<%= @model_na
|
|
141
141
|
return <%= param_name_plural %>, nil
|
142
142
|
}
|
143
143
|
|
144
|
+
// <%= @model_name %>Count get the count of all the <%= @model_name %> records
|
145
|
+
func <%= @model_name %>Count() (c int64, err error) {
|
146
|
+
err = db.Get(&c, "SELECT count(*) FROM <%= table_name %>")
|
147
|
+
if err != nil {
|
148
|
+
log.Println(err)
|
149
|
+
return 0, err
|
150
|
+
}
|
151
|
+
return c, nil
|
152
|
+
}
|
153
|
+
|
154
|
+
// <%= @model_name %>CountWhere get the count of all the <%= @model_name %> records with a where clause
|
155
|
+
func <%= @model_name %>CountWhere(where string, args ...interface{}) (c int64, err error) {
|
156
|
+
sql := "SELECT count(*) FROM <%= table_name %>"
|
157
|
+
if len(where) > 0 {
|
158
|
+
sql = sql + " WHERE " + where
|
159
|
+
}
|
160
|
+
stmt, err := db.Preparex(db.Rebind(sql))
|
161
|
+
if err != nil {
|
162
|
+
log.Println(err)
|
163
|
+
return 0, err
|
164
|
+
}
|
165
|
+
err = stmt.Get(&c, args...)
|
166
|
+
if err != nil {
|
167
|
+
log.Println(err)
|
168
|
+
return 0, err
|
169
|
+
}
|
170
|
+
return c, nil
|
171
|
+
}
|
172
|
+
|
173
|
+
// <%= @model_name %>IncludesWhere get the <%= @model_name %> associated models records, it's just the eager_load function
|
144
174
|
func <%= @model_name %>IncludesWhere(assocs []string, sql string, args ...interface{}) (var_<%= param_name_plural %> []<%= @model_name %>, err error) {
|
145
175
|
var_<%= param_name_plural %>, err = Find<%= @model_name.pluralize %>Where(sql, args...)
|
146
176
|
if err != nil {
|
@@ -365,7 +395,7 @@ func Create<%= @model_name %>(am map[string]interface{}) (int64, error) {
|
|
365
395
|
return lastId, nil
|
366
396
|
}
|
367
397
|
|
368
|
-
func (var_<%= model_name_underscore %> *<%= @model_name %>) Create() error {
|
398
|
+
func (var_<%= model_name_underscore %> *<%= @model_name %>) Create() (int64, error) {
|
369
399
|
ok, err := govalidator.ValidateStruct(var_<%= model_name_underscore %>)
|
370
400
|
if !ok {
|
371
401
|
errMsg := "Validate <%= @model_name %> struct error: Unknown error"
|
@@ -373,7 +403,7 @@ func (var_<%= model_name_underscore %> *<%= @model_name %>) Create() error {
|
|
373
403
|
errMsg = "Validate <%= @model_name %> struct error: " + err.Error()
|
374
404
|
}
|
375
405
|
log.Println(errMsg)
|
376
|
-
return errors.New(errMsg)
|
406
|
+
return 0, errors.New(errMsg)
|
377
407
|
}
|
378
408
|
<%- unless @struct_info[:timestamp_cols].empty? -%>
|
379
409
|
t := time.Now()
|
@@ -382,8 +412,17 @@ func (var_<%= model_name_underscore %> *<%= @model_name %>) Create() error {
|
|
382
412
|
<%- end -%>
|
383
413
|
<%- end -%>
|
384
414
|
sql := `INSERT INTO <%= table_name %> (<%= col_names.join(",") %>) VALUES (:<%= col_names.join(",:") %>)`
|
385
|
-
|
386
|
-
|
415
|
+
result, err := db.NamedExec(sql, var_<%= model_name_underscore %>)
|
416
|
+
if err != nil {
|
417
|
+
log.Println(err)
|
418
|
+
return 0, err
|
419
|
+
}
|
420
|
+
lastId, err := result.LastInsertId()
|
421
|
+
if err != nil {
|
422
|
+
log.Println(err)
|
423
|
+
return 0, err
|
424
|
+
}
|
425
|
+
return lastId, nil
|
387
426
|
}
|
388
427
|
|
389
428
|
<%- unless @struct_info[:assoc_info][:has_many].empty? -%>
|
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.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- B1nj0y
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-21 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
|