Revel is one of many Go Web Application Framework that uses
Go programming language. After installing Archlinux, first of all you'll need to install
yaourt, the easiest way to install AUR packages. After that you'll need to run this command:
yaourt -Sy --noconfirm go postgresql postgresql-libs liteide chromium google-chrome-stable
Then setup your GOPATH and GOROOT environment variables on your .bashrc
export GOROOT=/usr/lib/go
export GOPATH=$HOME/Dropbox/go
export PATH="$PATH:$GOPATH/bin"
Change the permission of this folder:
sudo chmod -Rv a+rwx /usr/share/liteide/liteenv
Then open LiteIDE, select menu
View > Edit Environment, then add this line and save:
GOROOT=/usr/lib/go
Add also a GOPATH directory on menu
View > Manage GOPATH...
That is
~/Dropbox/go on my computer.
To test if your Go and LiteIDE working correctly, create a new
.go file and press
Build > FileRun to run, for example:
package main
import "fmt"
func main() {
fmt.Println("Hello my PC <3")
}
The code above should give an output on Build output window.
To install revel, type this on shell:
go get -u -v github.com/revel/cmd/revel
go get -u -v github.com/revel/revel
To create a new project (for example, the name would be "puis"), type:
cd $GOPATH
revel new puis
Then you could start the app using this command:
revel run puis
And visit
http://localhost:9000 to view your app.
Next, we should install PostgreSQL driver and GORM, type:
go get -u -v github.com/lib/pq
go get -u -v github.com/jinzhu/gorm
Then initialize and start your database server:
sudo su - postgres
initdb --locale en_US.UTF-8 -E UTF8 -D '/var/lib/postgres/data'
exit
sudo systemctl enable postgresql
sudo systemctl start postgresql
sudo su - postgres
createuser puis
createdb puis
psql
GRANT ALL PRIVILEGES ON DATABASE puis TO puis;
\q
exit
Then create a model, for example in
app/models/user.go
package models
import "time"
type User struct {
Id int64
Name string
Gmail string
PuMail string
Password string
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt time.Time
LastLoginAt time.Time
PasswordUpdatedAt time.Time
}
And create a controller for GORM in
app/controllers/gorm.go
package controllers
import (
"database/sql"
"github.com/jinzhu/gorm"
_ "github.com/lib/pq"
"github.com/revel/revel"
"puis/app/models"
)
type GormController struct {
*revel.Controller
Tx *gorm.DB
}
var Db gorm.DB
func InitDB() {
var err error
Db, err = gorm.Open("postgres", "user=puis sslmode=disable")
if err != nil {
revel.ERROR.Println("FATAL", err)
panic(err)
}
tab := &models.User{}
Db.AutoMigrate(tab)
Db.Model(tab).AddUniqueIndex("idx_user__gmail", "gmail")
Db.Model(tab).AddUniqueIndex("idx_user__pu_mail", "pu_mail")
}
func (c *GormController) Begin() revel.Result {
txn := Db.Begin()
if txn.Error != nil {
panic(txn.Error)
}
c.Tx = txn
revel.INFO.Println("c.Tx init", c.Tx)
return nil
}
func (c *GormController) Commit() revel.Result {
if c.Tx == nil {
return nil
}
c.Tx.Commit()
if err := c.Tx.Error; err != nil && err != sql.ErrTxDone {
panic(err)
}
c.Tx = nil
revel.INFO.Println("c.Tx commited (nil)")
return nil
}
func (c *GormController) Rollback() revel.Result {
if c.Tx == nil {
return nil
}
c.Tx.Rollback()
if err := c.Tx.Error; err != nil && err != sql.ErrTxDone {
panic(err)
}
c.Tx = nil
return nil
}
Also call those functions when application starts also before and after controller calling, add these lines in
app/init.go on
func init()
revel.OnAppStart(controllers.InitDB)
revel.InterceptMethod((*controllers.GormController).Begin, revel.BEFORE)
revel.InterceptMethod((*controllers.GormController).Commit, revel.AFTER)
revel.InterceptMethod((*controllers.GormController).Rollback, revel.FINALLY)
Two more things, add a testing code, for example in
app/controllers/app.go on
func Index()
user := &models.User{Name: "Kiswono Prayogo"}
c.Tx.NewRecord(user)
c.Tx.Create(user)
return c.Render(user)
Last thing, just add one more line anywhere on Index.html
{{.user.Name}}
That's it, this is how to connect Revel to PostgreSQL using GORM. This tutorial adapted from
Ivan Black's stackoverflow
answer.
To solve slow Revel hot-reload or Go build/install, just use this command:
go get -u -v github.com/mattn/go-sqlite3