登录
首页 >  Golang >  Go问答

如何实现动态生成数据库表并修改字段

来源:SegmentFault

时间:2023-01-09 16:41:36 189浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《如何实现动态生成数据库表并修改字段》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

场景描述:
需要实现一个CMS的管理系统,其中有个模型管理。 可以根据用户设置动态生产数据表,并添加修改和删除表里的字段。由于ORM都是采用结构体的方式提前定义好字段, 如何实现这个需求?

正确答案

原理:反射StructOf动态创建一个结构体,然后gorm.AutoMigrate动态创建表。

StructOf以前随便写的,DataType就动态创建的结构体类型,你自己参考一下,这个是数据库查询的类型创建struct,你换成表单输入创建struct再AutoMigrate。

type Table struct {
        TableName    string
        SelectFields string
        FieldNames   []string
        FieldTypes   []string
        FieldDefault []string
        FieldIsNull  []bool
        DataType     reflect.Type
    }
    
func newTable(db *sql.DB, object interface{}, name string) Table {
    // get fields
    rows, err := db.Query("SELECT COLUMN_NAME, data_type,column_default,is_nullable FROM information_schema.COLUMNS WHERE TABLE_NAME = '" + name + "' ORDER BY ordinal_position;")
    if err != nil {
        panic(err)
    }
    tb := Table{TableName: name}
    var field, typ, coldf, isnil string
    for rows.Next() {
        rows.Scan(&field, &typ, &coldf, &isnil)
        tb.FieldNames = append(tb.FieldNames, field)
        tb.FieldTypes = append(tb.FieldTypes, tabletypes[typ])
        tb.FieldDefault = append(tb.FieldDefault, coldf)
        tb.FieldIsNull = append(tb.FieldIsNull, isnil == "YES")
    }
    tb.SelectFields = `"` + strings.Join(tb.FieldNames, `","`) + `"`

    // get struct type
    iValue := reflect.ValueOf(object)
    for iValue.Kind() == reflect.Ptr || iValue.Kind() == reflect.Interface {
        iValue = iValue.Elem()
    }
    if iValue.Kind() == reflect.Struct || iValue.Kind() == reflect.Map {
        tb.DataType = iValue.Type()
    } else {
        var sf []reflect.StructField = make([]reflect.StructField, len(tb.FieldNames))
        for i := 0; i 

今天带大家了解了go、Gin、goframe的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表