golang 生成對應的資料表struct定義操作

2022-09-27 09:00:16 字數 3111 閱讀 2370

在開發過程中,常常需要將資料庫表對應到golang的乙個struct,特別是使用一些orm工具,sqlx庫等,我是個懶人,即使資料表的字段不多,我也懶得去乙個個對應的敲入**,更別提資料表字段比較多的情況了,碼農的www.cppcns.com時間,不能浪費在這啊,對吧?所以我在想,是不是有辦法可以自動生成。

我在工作時,用得最多的是mysql了,因此

mysql有個自帶的資料庫information_schema,裡面的資訊量比較多,朋友們可以去百度下,我這裡用到了表columns,它的字段包含資料庫名、表名、欄位名、字段型別等,利用這個表的資料,把對應的表的字段資訊讀取出來,然後再根據golang的語法規則,生成檔案就可以了。

大致思路確定了,開始動手。

我採用sqlx進行資料庫的訪問,首先定義乙個struct來表示columns的資料,這裡我只需要幾個字段,因此,沒有把錶columns的所有欄位都對應到struct:

type fieldinfo struct

需要指定生成的struct對應的是哪個庫、哪個表,最終的golang檔案儲存位址

var dbname= flag.string("db", "", "the database name")

var tblname = flag.string("tbl", "", "the ta name to export")

var s**epath = flag.string("path", "./", "the path to s**e file")

另外,我們專案習慣使用下劃線「_」來分割單詞,比如info_user,表示user表,而生成的struct名稱為infouser,欄位名也是類似規則

func fmtfielddefine(src string) string else

} }

return str

}即把下劃線去掉,且將單詞的首字母改為大寫。

有些字段,在設計資料庫時,是可空的,information_schema->columns中有個字段is_nullable專門表示,而golang的sql有幾個型別對應:sql.nullstring、sql.nullbool、sql.nullfloat64、sql.nullint64,基本上是可以滿足使用要求的了。

有人可能會有疑問,假如字段型別為date、timestamp等,該對應哪種呢?通常第三方的類庫會轉為string型別,那麼就對應sql.nullstring好了。不過我這裡沒有進行這方面的處理。

func main()

if len(fs) > 0 else

case "bigint":

if v.isnullable == "yes" else

case "char", "varchar", "lonwww.cppcns.comgtext", "text", "tinytext":

if v.isnullable == "yes" else

case "date", "datetime", "timestamp":

buffer.writestring("time.time ")

case "double", "float":

if v.isnullable == "yes" else

default:

// 其他型別當成string處理

if v.isnullable == "yes" else

}buffer.writestring(fmt.sprintf("`db:\"%s\" json:\"%s\"`\n", v.colname, v.colname))

}buffer.writestring(`}`)

fmt.println(buffer.string())

filename := *s**epath + "\\" + *tblname + ".go"

f, _ := os.create(filename)

f.write(byte(buffer.string()))

f.close()

cmd := exec.command("goimports", "-w", filename)

cmd.run()

} else

}我把每個欄位的tag,包括db和json的都加了了,在**最後,使用goimport工具新增需要import的package,它連format的工作都做了,實在不錯。

package models

import (

"database/sql"

"time")

type infousershoppingsummary struct

補充:golang之方法(自定義型別,struct)

//golang的方法定義

//golang中的方法是作用在特定型別的變數上,因此自定義型別,都可以有方法,不僅僅是struct

//定義:func (recevier type) methodname(引數列表)(返回值列表){}

//方法和函式的區別

/*1,函式呼叫:function(variable,引數列表)

2, 方法,variable.function(引數列表)

方法的控制,通過大小寫空格控制

*/package main

//golang的方法定義

//golang中的方法是作用在特定型別的變數上,因此自定義型別,都可以有方法,不僅僅是struct

//定義:func (recevier type) methodname(引數列表)(返回值列表){}

import "fmt"

type integer int

func (p integer) print()

//這裡傳遞的是副本,想改變p的值,需要傳遞指標

func (p *integer) set(b integer)

type student struct

//這裡需要接受指標 *student(接收者),否則修改不了值

func (p *student) init(name string, age int, score int)

func (p student) get() student

func main()

本文標題: golang 生成對應的資料表struct定義操作

本文位址:

xorm根據資料庫表生成對應的結構體

使用 golang 運算元據庫的同學都會遇到乙個問題 根據資料表結構建立對應的 struct 模型。因為 golang 的使用首字母控制可見範圍,我們經常要設計 struct 欄位名和資料庫欄位名的對應關係。久而久之,這是乙個非常繁瑣的過程。事情變得繁瑣了,我們都會想,有沒有好的辦法自動生成 mod...

東軟軟體動態生成對資料表更新操作的方法

1 public string creatupdate 2 32 構建賦值語句 34 3536 37 去掉最後的逗號 38 strclass.dellastcomma 40 構建where條件 4243 建立命令物件 4647 49 向資料庫提交sql語句並返回執行結果 51 判斷結果並返回相應提示...

Django資料表生成,Class Mate解釋

abstract 抽象類 class human models.model name models.charfield max length 100 gender choice u m u male u f u female gender models.charfield max length 2,...