Golang 將資料庫轉換為gorm結構和RESTful api
介紹
gen工具從給定的資料庫生成golang結構,以便在.go檔案中使用。它支援gorm標籤並實現一些可用的方法。它還可以為這些結構生成RESTful api。
通過從資料庫中讀取有關列結構的詳細資訊,gen生成具有所需列名,資料型別和註釋的go相容結構型別。
生成的資料型別包括對可空列sql.NullX型別或guregu null.X型別 以及預期的基本內建go型別的支援。
gen基於Seth Shelnutt的db2struct的工作而受到啟發,而Db2Struct的基礎/靈感來自ChimeraCoder的gojson包gojson的工作。
獲取
go get github.com/smallnest/gen
使用
$ gen --connstr "root@tcp(127.0.0.1:3306)/employees?&parseTime=True" --database employees --json --gorm --guregu --rest
支援的資料庫
目前支援
- MariaDB的
- MySQL的
- PostgreSQL的
- Microsoft SQL Server
- SQLite的
計劃支援
- 神諭
MariaDB的/ MySQL的
通過查詢INFORMATION_SCHEMA.Columns表,然後格式化型別,列名和後設資料來建立結構,以建立可用的相容結構型別。
支援的資料型別
目前僅支援有限數量的資料型別。初步支援包括:
- tinyint(sql.NullInt64或null.Int)
- int(sql.NullInt64或null.Int)
- smallint(sql.NullInt64或null.Int)
- mediumint(sql.NullInt64或null.Int)
- bigint(sql.NullInt64或null.Int)
- decimal(sql.NullFloat64或null.Float)
- float(sql.NullFloat64或null.Float)
- double(sql.NullFloat64或null.Float)
- datetime(null.Time)
- 時間(null.Time)
- date(null.Time)
- 時間戳(null.Time)
- var(sql.String或null.String)
- 列舉(sql.String或null.String)
- varchar(sql.String或null.String)
- longtext(sql.String或null.String)
- mediumtext(sql.String或null.String)
- text(sql.String或null.String)
- tinytext(sql.String或null.String)
- 二進位制
- BLOB
- LONGBLOB
- MEDIUMBLOB
- VARBINARY
問題
- Postgres和SQLite驅動程式支援sql.ColumnType.Nullable()(#3)
- 無法區分表的主鍵。僅將第一個欄位設定為主鍵。所以你需要在某些情況下改變它。
gorm
package model
import (
"time"
"github.com/guregu/null"
"github.com/jinzhu/gorm"
)
type Title struct {
ToDate null.Time `gorm:"column:to_date" json:"to_date"`
EmpNo int `gorm:"column:emp_no" json:"emp_no"`
Title string `gorm:"column:title" json:"title"`
FromDate time.Time `gorm:"column:from_date" json:"from_date"`
}
// TableName sets the insert table name for this struct type
func (t *Title) TableName() string {
return "titles"
}
func (t *Title) CreateTitle(db *gorm.DB) error {
return db.Create(t).Error
}
RESTful api
package api
import (
"net/http"
"github.com/julienschmidt/httprouter"
"model"
)
func configTitlesRouter(router *httprouter.Router) {
router.GET("/titles", GetAllTitles)
router.POST("/titles", PostTitle)
router.GET("/titles/:id", GetTitle)
router.PUT("/titles/:id", PutTitle)
router.DELETE("/titles/:id", DeleteTitle)
}
func GetAllTitles(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
titles := []model.Title{}
DB.Find(&titles)
writeJSON(w, &titles)
}
func GetTitle(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
id := ps.ByName("id")
title := &model.Title{}
if DB.First(title, id).Error != nil {
http.NotFound(w, r)
return
}
writeJSON(w, title)
}
func PostTitle(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
title := &model.Title{}
if err := readJSON(r, title); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
if err := DB.Save(title).Error; err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
writeJSON(w, title)
}
func PutTitle(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
id := ps.ByName("id")
title := &model.Title{}
if DB.First(title, id).Error != nil {
http.NotFound(w, r)
return
}
updated := &model.Title{}
if err := readJSON(r, updated); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// TODO: copy necessary fields from updated to title
if err := DB.Save(title).Error; err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
writeJSON(w, title)
}
func DeleteTitle(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
id := ps.ByName("id")
title := &model.Title{}
if DB.First(title, id).Error != nil {
http.NotFound(w, r)
return
}
if err := DB.Delete(title).Error; err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
}
相關文章
- 使用Golang和MongoDB構建 RESTful APIGolangMongoDBRESTAPI
- mysql資料庫一行命令生成GIN+GORM RESTful APIs Golang應用MySql資料庫ORMRESTAPIGolang
- C++資料結構和pb資料結構的轉換C++資料結構
- openGauss資料庫將磁碟錶轉換為MOT資料庫
- 將json資料轉換為Python字典將json資料轉換為Python字典JSONPython
- Python連線資料庫將結果轉換為DataFrame(列名和表欄位一致)Python資料庫
- gin+gorm+router 快速搭建 crud restful API 介面GoORMRESTAPI
- js將有父子關係的資料轉換成樹形結構資料JS
- 使用 NocoDB 一鍵將各種資料庫轉換為智慧表格資料庫
- golang 時間轉換,不注意將引發Gorm等mysql操作儲存時間多GolangORMMySql
- 資料結構–進位制(任意)轉換資料結構
- 資料庫轉換工具,不同資料庫之前任意轉換資料庫
- RESTful API 為何成為頂流 API 架構風格?RESTAPI架構
- 如何將Rust的“struct”轉換為資料流?RustStruct
- Golang操作結構體、Map轉化為JSONGolang結構體JSON
- Golang 型別轉換庫 castGolang型別AST
- [譯] Golang 資料結構:樹Golang資料結構
- 將git倉庫從submodule轉換為subtreeGit
- SQL Server資料庫基礎之行資料轉換為列資料SQLServer資料庫
- JS 將有父子關係的陣列轉換成樹形結構資料JS陣列
- Golang學習系列第五天: Golang和PostgreSQL開發 RESTful APIGolangSQLRESTAPI
- 將表結構轉換成實體欄位
- golang學習筆記(一)——golang基礎和相關資料結構Golang筆記資料結構
- 如何將圖片轉換為向量?(透過DashScope API呼叫)API
- RESTful & “優雅的”API 響應結構設計RESTAPI
- 使用 Mux, Go, PostgreSQL, GORM 構建 APIUXGoSQLORMAPI
- [資料結構] 樹、二叉樹、森林的轉換資料結構二叉樹
- golang json字串轉結構體GolangJSON字串結構體
- SDB :純 golang 開發、資料結構豐富、持久化的 NoSQL 資料庫Golang資料結構持久化SQL資料庫
- 將List物件列表轉為樹形結構物件
- mysql資料庫-資料結構MySql資料庫資料結構
- RESTful API實踐總結RESTAPI
- 人大金倉資料庫轉換資料庫
- Golang 針對 MySQL 資料庫表結構的差異 SQL 工具GolangMySql資料庫
- Hash連結串列轉換為紅黑樹,和樹轉換為連結串列的條件
- Postgresql資料庫體系結構-程式和記憶體結構SQL資料庫記憶體
- 使用Golang建立RESTful API的最佳實踐案例GolangRESTAPI
- 結構化資料、半結構化資料和非結構化資料