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要保持和上下文一致就可以
相关文章:
gorm多租户插件的使用
一、关于gorm多租户插件的使用 1、安装依赖 go get -u github.com/kuangshp/gorm-tenant2、创建一个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 名称,ten…...

Playwright 测试框架 - Java
🚀【Playwright + Java 实战教程】从零到一掌握自动化测试利器! 🔧 本文专为 Java 开发者量身打造,通过详尽示例带你快速掌握 Playwright 自动化测试。涵盖基础操作、表单交互、测试框架集成、高阶功能及常见实战技巧,适用于企业 UI 测试与 CI/CD 场景。 🛠️ 一、环境…...

力扣100题之128. 最长连续序列
方法1 使用了hash 方法思路 使用哈希集合:首先将数组中的所有数字存入一个哈希集合中,这样可以在 O(1) 时间内检查某个数字是否存在。 寻找连续序列:遍历数组中的每一个数字,对于每一个数字, 检查它是否是某个连续序列…...

算法打卡12天
19.链表相交 (力扣面试题 02.07. 链表相交) 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 图示两个链表在节点 c1 开始相交**:** 题目数据…...
OpenCV C++ 学习笔记(四):图像/视频的输入输出(highgui模块 高层GUI和媒体I/O)
文章目录 图片读取创建窗口图片显示图片保存视频输入输出 图片读取 cv::Mat imread( const String& filename, int flags IMREAD_COLOR );enum ImreadModes {IMREAD_UNCHANGED -1, //!< If set, return the loaded image as is (with alpha channel, othe…...
我的创作纪念日——聊聊我想成为一个创作者的动机
2025年6月4日,是我在CSDN写下第一篇技术博客的第1024天。 1024,这个数字对于程序员来说意义非凡,它不仅是内存单位的基础,更是我们这群“码农”的节日符号。而对我来说,它更像是一段旅程的里程碑:从一个曾想…...

蓝桥杯国赛训练 day1 Java大学B组
目录 k倍区间 舞狮 交换瓶子 k倍区间 取模后算组合数就行 import java.util.HashMap; import java.util.Map; import java.util.Scanner;public class Main {static Scanner sc new Scanner(System.in);public static void main(String[] args) {solve();}public static vo…...

PyTorch——非线性激活(5)
非线性激活函数的作用是让神经网络能够理解更复杂的模式和规律。如果没有非线性激活函数,神经网络就只能进行简单的加法和乘法运算,没法处理复杂的问题。 非线性变化的目的就是给我们的网络当中引入一些非线性特征 Relu 激活函数 Relu处理图像 # 导入必…...

OPenCV CUDA模块目标检测----- HOG 特征提取和目标检测类cv::cuda::HOG
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::HOG 是 OpenCV 的 CUDA 模块中对 HOG 特征提取和目标检测 提供的 GPU 实现。它与 CPU 版本的 cv::HOGDescriptor 类似,但利…...

MATLAB读取文件内容:Excel、CSV和TXT文件解析
MATLAB读取文件内容:Excel、CSV和TXT文件解析 MATLAB 是一款强大的数学与工程计算工具,广泛应用于数据分析、模型构建和图像处理等领域。在处理实际问题时,我们常常需要从文件中读取数据进行分析。本文将介绍如何使用 MATLAB 读取常见的文件…...

Spring MVC 之 异常处理
使用Spring MVC可以很灵活地完成数据的绑定和响应,极大的简化了Java Web的开发。但Spring MVC提供的便利不仅仅如此,使用Spring MVC还可以很便捷地完成项目中的异常处理、自定义拦截器以及文件上传和下载等高级功能。本章将对Spring MVC提供的这些高级功…...
缓存控制HTTP标头设置为“无缓存、无存储、必须重新验证”
文章目录 说明示例核心响应头设置实现原理代码实现1. 原生 Node.js (使用 http 模块)2. Express 框架3. 针对特定路由设置 (Express) 验证方法(使用 cURL)关键注意事项 说明 日期:2025年6月4日。 对于安全内容,请确保缓存控制HT…...

ubuntu24.04 使用apt指令只下载不安装软件
比如我想下载net-tools工具包及其依赖包可以如下指令 apt --download-only install net-tools 自动下载的软件包在/var/cache/apt/archives/目录下...
macOS 上使用 Homebrew 安装redis-cli
在 macOS 上使用 Homebrew 安装 redis-cli(Redis 命令行工具)非常简单,以下是详细步骤: 1. 安装 Redis(包含 redis-cli) 运行以下命令安装 Redis: brew install redis这会安装完整的 Redis 服…...

计算机网络安全问答数据集(1788条) ,AI智能体知识库收集! AI大模型训练数据!
继续收集数据集,话不多说,见下文! 今天分享一个计算机网络安全问答数据集(1788条),适用于AI大模型训练、智能体知识库构建、安全教育系统开发等多种场景! 一、数据特点 结构清晰:共计1788条&…...

WinCC学习系列-高阶应用(WinCC REST通信)
WinCC作为一个经典SCADA系统,它是OT与IT数据无缝集成桥梁,自WinCC7.5版本开始,可以直接提供Rest服务用于其它系统数据访问和操作。 WinCC REST 服务允许外部应用程序访问 WinCC 数据。 外部应用程序可以通过 REST 接口读取和写入 WinCC 组态…...
八、Python模块、包
目录 1. 模块 1.1 什么是模块? 1.2 创建模块 1.3 导入模块 1.4 模块的命名空间 1.5 模块的搜索路径 1.6 模块的重新加载 2. 包 2.1 什么是包? 2.2 创建包 2.3 导入包中的模块 2.4 包的层次结构 3. 模块和包的管理 3.1 安装模块 3.2 卸载模…...

使用交叉编译工具提示stubs-32.h:7:11: fatal error: gnu/stubs-soft.h: 没有那个文件或目录的解决办法
0 前言 使用ST官方SDK提供的交叉编译工具、cmake生成Makefile,使用make命令生成可执行文件提示fatal error: gnu/stubs-soft.h: 没有那个文件或目录的解决办法,如下所示: 根据这一错误提示,按照网上的解决方案逐一尝试均以失败告…...

macOS 连接 Docker 运行 postgres,使用navicat添加并关联数据库
下载 docker注册一个账号,登录 Docker创建 docke r文件 mkdir -p ~/.docker && touch ~/.docker/daemon.json写入配置(全量替换) {"builder": {"gc": {"defaultKeepStorage": "20GB",&quo…...

指针的使用——基本数据类型、数组、结构体
1 引言 对于学习指针要弄清楚如下问题基本可以应付大部分的场景: ① 指针是什么? ② 指针的类型是什么? ③ 指针指向的类型是什么? ④ 指针指向了哪里? 2 如何使用指针 任何东西的学习最好可以总结成一种通用化的…...

TK海外抢单源码/指定卡单
抢单源码,有指定派单,打针,这套二改过充值跳转客服 前端vue 后端php 两端分离 可二开 可以指定卡第几单,金额多少, 前后端开源 PHP7.2 MySQL5.6 前端要www.域名,后端要admin.域名 前端直接静态 伪静…...
Docker MCP 目录和工具包简介:使用 MCP 为 AI 代理提供支持的简单安全方法
目录 Model Context Protocol 势头强劲 — 还需要改进哪些?发现正确的、官方的和/或值得信赖的工具是很困难的复杂的安装和分发身份验证和权限不足Docker 如何帮助解决这些挑战在安全、隔离的容器中轻松发现和运行 MCP 服务器一键式 MCP 客户端集成,内置安全认证企业就绪的 M…...

【Linux】Linux 环境变量
参考博客:https://blog.csdn.net/sjsjnsjnn/article/details/125533127 一、环境变量 1.1 基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如:我们在编写C/C代码的时候,在链接的时候&am…...

OpenCV在图像上绘制文字示例
OpenCV计算机视觉开发实践:基于Qt C - 商品搜索 - 京东 OpenCV中除了提供绘制各种图形的函数外,还提供了一个特殊的绘制函数,用于在图像上绘制文字。这个函数是putText(),它是命名空间cv中的函数,其声明如下ÿ…...
Java 抗量子算法:构建后量子时代的安全基石
一、量子计算带来的加密挑战 在传统加密体系中,RSA、ECC 等公钥算法依赖大数分解和离散对数问题的难解性。然而,量子计算机的 Shor 算法可在多项式时间内破解这些算法,使现有加密体系面临颠覆性威胁。例如,2048 位 RSA 密钥的破解…...
Kubernetes 集群到 Jumpserver
以下是使用 ServiceAccount Token(令牌) 连接 Kubernetes 集群到 Jumpserver 的 详细分步指南,包括权限配置、Token 获取和常见问题排查。 1. 创建 ServiceAccount 并分配权限 1.1 创建 ServiceAccount 在 Kubernetes 集群中创建一个专用于…...
Android7 Input(十)View 处理Input事件pipeline
概述: 本文主要描述View对InputEvent事件pipeline处理过程。 本文涉及的源码路径 frameworks/base/core/java/android/view/ViewRootImpl.java InputEvent事件处理 View处理input事件是调用doProcessInputEvents方法,如下所示: void doProcessInputEvents() {//…...
图像数据如何表示为概率单纯形
目录 图像数据灰度图像彩色图像概率单纯形条件应用场景 图像数据 图像数据通常由像素值组成,这些像素值可以是灰度值(对于黑白图像)或RGB值(对于彩色图像)。每个像素的值通常在0到255之间。为了将图像数据表示为概率单…...
(11)Service Mesh架构下Java应用实现零信任安全模型
Service Mesh架构下Java应用实现零信任安全模型 📌 TL;DR: 本文详细介绍如何在Service Mesh架构中实现零信任安全模型,包括身份认证、授权控制、加密通信和持续监控四大核心技术,以及与Istio、Envoy等组件的集成方案。 目录 零信任安全模型概述关键技术实现最佳实践Service…...
什么是内网映射?如何将内网ip映射到外网访问?
随着互联网科技和信息技术的快速发展,很多原理及技术开始被应用到互联网信息科技领域,其中内网iP映射就成为非常普通常见的一个操作。那么什么是内网ip映射?如何将内网ip映射到外网? 一、什么是内网ip映射? 简单理解…...