当前位置: 首页 > news >正文

gorm多租户插件的使用

一、关于gorm多租户插件的使用

  • 1、安装依赖

    go get -u github.com/kuangshp/gorm-tenant
    
  • 2、创建一个mysql数据表

    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT primary key COMMENT '主键id',`name` varchar(50) not null  comment '名称',`tenant_id` int(11) default 0 comment '租户id',`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',`deleted_at` datetime NULL DEFAULT NULL COMMENT '软删除时间'
    )   ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
    
  • 3、将数据库文件同步生成go的数据模型

    type UserEntity struct {ID        int64          `gorm:"column:id;type:int;primaryKey;autoIncrement:true;comment:主键id" json:"id"` // 主键idName      string         `gorm:"column:name;type:varchar(50);not null;comment:名称" json:"name"`            // 名称TenantID  int64          `gorm:"column:tenant_id;type:int;comment:租户id" json:"tenantId"`                  // 租户idCreatedAt time.Time      `gorm:"column:created_at;comment:创建时间" json:"createdAt"`                         // 创建时间UpdatedAt time.Time      `gorm:"column:updated_at;comment:更新时间" json:"updatedAt"`                         // 更新时间DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:datetime;comment:软删除时间" json:"-"`                  // 软删除时间
    }
    
  • 4、在创建数据库连接的时候使用插件

    func NewMysqlDB(username, password, host, port, database, charset, loc string) *gorm.DB {// 字符串拼接dataSource := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=true&loc=%s",username,password,host,port,database,charset,url.QueryEscape(loc),)fmt.Println(dataSource, "数据库连接")db, err := gorm.Open(mysql.Open(dataSource), &gorm.Config{Logger:                                   logger.Default.LogMode(logger.Info),DisableForeignKeyConstraintWhenMigrating: true, // 自动创建表的时候不创建外键SkipDefaultTransaction:                   false,NamingStrategy: schema.NamingStrategy{ // 自动创建表时候表名的配置SingularTable: true,},})if err != nil {panic("连接数据库失败")}dao.SetDefault(db)// 多租户插件db.Use(&gormTenant.TenantPlugin{)fmt.Println("mysql启动成功...")return db
    }
    
  • 5、在操作的时候使用自己的上下文就可以,本案例使用的是go-zero来实现

    func NewGetUserListApiLogic(ctx context.Context, svcCtx *svc.ServiceContext, request *http.Request) *GetUserListApiLogic {hostname, _ := os.Hostname()return &GetUserListApiLogic{Logger: logx.WithContext(ctx).WithCallerSkip(0).WithFields(logx.Field("Log_UUID", uuid.New().String()),logx.Field("hostname", hostname)),ctx:     gormTenant.NewContext(ctx), // 这个替换官方生成的svcCtx:  svcCtx,Request: request,}
    }
    
  • 6、查询和不使用租户的查询方式(关于租户传值的后面会介绍)

    // 使用了租户字段
    dao.UserEntity.WithContext(l.ctx).Where(dao.UserEntity.Name.Eq("你好")).Find()
    // SELECT * FROM `user` WHERE `user`.`name` = '你好' AND `user`.`tenant_id` = 455 AND `user`.`deleted_at` IS NULL
    // 不使用租户
    dao.UserEntity.WithContext(tenant.SkipTenantContext(l.ctx)).Find()
    // SELECT * FROM `user` WHERE `user`.`deleted_at` IS NULL
    

二、关于tenant_id传递值

  • 1、在go-zero中将租户信息在中间件中写入到上下文中

    
    func (m *AuthMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {...ctx = context.WithValue(ctx, "tenant_id", "455")next(w, r.WithContext(ctx))}
    }
    

三、关于数据库字段不是叫tenant_id

  • 1、比如现在数据库模型租户字段叫TenantNo,直接在使用的时候传递数据库字段

    db.Use(&tenant.TenantPlugin{TenantField: "TenantNo"})
    

四、如果上下文件中定义租户字段不是叫tenant_id

  • 1、在重写ctx的时候可以传递你上下文中定义的字段

    gormTenant.NewContext(ctx,"test1") // 注意test1要保持和上下文一致就可以
    
http://www.lqws.cn/news/143299.html

相关文章:

  • Linux下使用Transformers,模型和数据集的位置
  • 把握时代脉搏,铸就行业标杆:珠江电缆未来发展战略展望
  • 【C++ Qt】窗口(Qt窗口框架、菜单栏QMenuBar)
  • OGG-01635 OGG-15149 centos服务器远程抽取AIX oracle11.2.0.4版本
  • Day13
  • PPT转图片拼贴工具 v1.0
  • SQL知识合集(一):函数篇
  • 神经网络-Day45
  • 装备制造项目管理具备什么特征?如何选择适配的项目管理软件系统进行项目管控?
  • 高效集成AI能力:使用开放API打造问答系统,不用训练模型,也能做出懂知识的AI
  • 面向开发者的提示词工程③——文本总结(Summarizing)
  • 多层PCB技术解析:从材料选型到制造工艺的深度实践
  • centos升级内核
  • 基于 TensorFlow 2 的 WGAN来生成表格数据、数值数据和序列数据。 WGAN生成对抗网络。代码仅供参考
  • Linux信号捕捉技术深度解析
  • Excel数据分析:基础
  • BLE中心与外围设备MTU协商过程详解
  • Win10停更,Win11不好用?现在Mac电脑比Win11电脑更便宜
  • element-plus 单选组件 el-radio,选不上,又没报错,直接复制官网也不行解决方案
  • [Git] 文件删除
  • Selenium 和playwright 使用场景优缺点对比
  • 【图像处理3D】:点云图是怎么生成的
  • Spring中@Primary注解的作用与使用
  • python打卡训练营打卡记录day45
  • PlantUML 使用示例
  • 斐波那契数列------矩阵幂法
  • Ruoyi多主键表的增删改查
  • 仓库拉下ssm项目配置启动
  • 定时任务的 cron 表达式
  • A*算法实现原理以及实现步骤(C++)