ShardingSphere-Proxy 连接实战:从 Golang 原生 SQL 到 GORM 的应用

在这篇文章《ShardingSphereProxy:快速入门》中,我们介绍了如何通过 Navicat 连接 ShardingSphere-Proxy。

实际上,ShardingSphere-Proxy 兼容标准的 SQL 和原生数据库协议,因此你可以使用任何 MySQL 客户端与其进行连接,包括 Golang 的原生 SQL 库和流行的 ORM 框架 GORM。

接下来,我们将展示如何使用 Golang 原生 SQL 和 GORM 连接并操作 ShardingSphere-Proxy。 

使用 Golang 原生 SQL 连接 ShardingSphere-Proxy

话不多少,我们直接上示例。

基于我们的测试实例。

由于 Proxy 运行在 Docker 容器上,并且暴露了端口 13308,使用以下连接信息:

主机:localhost 或 Docker 容器的 IP 地址
端口:13308
用户名:root 或 sharding(根据我们在 global.yaml 中的配置)
密码:对应的密码

以下是使用 Golang 原生 SQL 连接 ShardingSphere-Proxy 的示例代码:

package mainimport ("database/sql""fmt""log"_ "github.com/go-sql-driver/mysql"
)func main() {// ShardingSphere Proxy的连接字符串dsn := "sharding:sharding@tcp(localhost:13308)/sharding"// 打开数据库连接db, err := sql.Open("mysql", dsn)if err != nil {log.Fatal(err)}defer db.Close()// 验证连接err = db.Ping()if err != nil {log.Fatal(err)}fmt.Println("Successfully connected to ShardingSphere Proxy!")// 执行查询(示例)rows, err := db.Query("SELECT * FROM orders LIMIT 10")if err != nil {log.Fatal(err)}defer rows.Close()// 处理查询结果for rows.Next() {var column1 int64var column2 stringvar column3 intvar column4 intvar column5 string// 根据你的表结构调整字段类型和数量err := rows.Scan(&column1, &column2, &column3, &column4, &column5)if err != nil {log.Fatal(err)}fmt.Printf("Column1: %s, Column2: %d\n", column1, column2)}// 检查是否有错误发生if err = rows.Err(); err != nil {log.Fatal(err)}
}

 使用 GORM 连接并操作 ShardingSphere-Proxy

GORM 是一个流行的 Golang ORM 框架,它使得数据库操作更加简洁和高效。以下是如何使用 GORM 连接 ShardingSphere-Proxy 并进行基本操作的示例:

package mainimport ("fmt""math/rand""time""github.com/bwmarrin/snowflake""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/logger"
)var globalDB *gorm.DBtype Order struct {ID        int64  `gorm:"primaryKey"`OrderId   string `gorm:"sharding:order_id"` // 指明 OrderId 是分片键UserID    int64  `gorm:"sharding:user_id"`ProductID int64OrderDate int64
}type Product struct {ID   int64  `gorm:"primaryKey"`Name string `gorm:"name"`
}// 定义结构体,用于接收查询结果
type OrderGroup struct {ID         int64  `gorm:"primaryKey"`OrderId    string `gorm:"sharding:order_id"` // 指明 OrderId 是分片键UserID     int64  `gorm:"sharding:user_id"`ProductID  int64OrderDate  int64SumProduct int64MaxProduct int64
}type OrderProduct struct {OrderProduct
}type User struct {ID   int64  `gorm:"primaryKey"`Name string `gorm:"name"`
}type OrderUser struct {OrderUser
}func main() {InitDb()// 示例:插入订单数据InsertRandomOrders()// 场景1:全表查询,不含分表键FindAllOrders()
}
// 随机生成一些订单数据插入
func InsertRandomOrders() {node, err := snowflake.NewNode(1)if err != nil {fmt.Println("Error creating snowflake node:", err)return}now := time.Now()for i := 0; i < 10; i++ {// 雪花id生成// 生成一个IDid := node.Generate()order := Order{ID:        id.Int64(),OrderId:   fmt.Sprintf("20240101ORDER%04d", rand.Int31n(10000)),UserID:    int64(rand.Int31n(10000)),ProductID: int64(rand.Int31n(1000)),OrderDate: now.Unix(),}InsertOrder(order)}// orderDate 用2025年,拼接当前月,日,时,分秒orderDate := time.Date(2025, now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.UTC)for i := 0; i < 10; i++ {id := node.Generate()order := Order{ID:        id.Int64(),OrderId:   fmt.Sprintf("20250101ORDER%04d", rand.Int31n(10000)),UserID:    int64(rand.Int31n(10000)),ProductID: int64(rand.Int31n(1000)),OrderDate: orderDate.Unix(),}InsertOrder(order)}
}// 插入订单数据
func InsertOrder(order Order) error {err := globalDB.Create(&order).Errorif err != nil {fmt.Println("Error creating order:", err)}return nil
}// 场景1:全表查询,不含分表键
func FindAllOrders() ([]Order, error) {var orders []Ordererr := globalDB.Table("orders").Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景1:全表查询,不含分表键 orders:", orders)return orders, err
}
// InitDb 初始化数据库连接
func InitDb() *gorm.DB {log := logger.Default.LogMode(logger.Info)// 连接到 MySQL 数据库dsn := "sharding:sharding@tcp(localhost:13308)/sharding"db, err := gorm.Open(mysql.New(mysql.Config{DSN: dsn,}), &gorm.Config{Logger: log,})if err != nil {panic("failed to connect database")}globalDB = dbreturn db
}

通过这两个示例,你可以看到使用 Golang 原生 SQL 和 GORM 连接并操作 ShardingSphere-Proxy 是非常简单和直观的。ShardingSphere-Proxy 的透明分片特性使得你可以像操作单个数据库一样操作分布式数据库集群,从而大大简化了分库分表带来的复杂性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/494244.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接口测试Day-02-安装postman项目推送Gitee仓库

postman安装 下载 Postman&#xff08;已提供安装包&#xff0c;此步可以跳过&#xff09; https://www.postman.com/downloads/安装 Postman 安装Postman插件newman 要想给 postman 安装 newman 插件&#xff0c;必须 先 安装 node.js。 这是前提&#xff01; 安装node.js 可能…

《PCI密码卡技术规范》题目

单选1 在《PCI密码卡技术规范》中,下列哪项不属于PCI密码卡的功能()。 A.密码运算功能 B.密钥管理功能 C.物理随机数产生功能 D.随主计算机可信检测功能 正确答案:D. <font style="color:#DF2A3F;">解析:</font> 单选 2 在《PCI密码卡技术规…

vscode 快速切换cangjie版本

前言 目前阶段cangjie经常更新&#xff0c;这就导致我们可能会需要经常在不同的版本之间切换。 在参加训练营时从张老师那学到了如何使用 vscode 的配置文件来快速进行cangjie版本的切换。 推荐一下张老师的兴趣组 SIGCANGJIE / 仓颉兴趣组 这里以 windows 下&#xff0c;配置…

PromptGIP:Unifying lmage Processing as Visual Prompting Question Answering

“Unifying Image Processing as Visual Prompting Question Answering” 文章提出了一种名为 PromptGIP 的通用模型&#xff0c;将图像处理任务统一为视觉提示问答范式&#xff0c;在多个图像处理任务上展现出良好性能&#xff0c;为通用图像处理提供了新的思路和方法。 confe…

深入理解 Linux wc 命令

文章目录 深入理解 Linux wc 命令1. 基本功能2. 常用选项3. 示例3.1 统计文件的行、单词和字符数3.2 仅统计行数3.3 统计多个文件的总和3.4 使用管道统计命令输出的行数 4. 实用案例4.1 日志分析4.2 快速统计代码行数4.3 统计单词频率 5. 注意事项6. 总结 深入理解 Linux wc 命…

Spring常见问题

Spring常见问题 1.什么是Spring,对Spring的理解? Spring是一个轻量级的,IOC和AOP的一站式框架,为简化企业级开发而生的. Spring会管理对象,需要使用的时候直接注入即可,还可以对对象的功能进行增强,使得耦合度降低. 2.解释IOC和AOP IOC (控制反转)将生成对象控制权反转给…

JAVA:组合模式(Composite Pattern)的技术指南

1、简述 组合模式(Composite Pattern)是一种结构型设计模式,旨在将对象组合成树形结构以表示“部分-整体”的层次结构。它使客户端对单个对象和组合对象的使用具有一致性。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什么是组合模式 组合模式…

使用FakeSMTP创建本地SMTP服务器接收邮件具体实现。

以下代码来自Let’s Go further节选。具体说明均为作者本人理解。 编辑邮件模版 主要包含三个template: subject&#xff1a;主题plainBody&#xff1a; 纯文本正文htmlBody&#xff1a;超文本语言正文 {{define "subject"}}Welcome to Greenlight!{{end}} {{def…

基于深度学习多图像融合的屏幕缺陷检测方案

公司项目&#xff0c;已申请专利。 深度学习作为新兴技术在图像领域蓬勃发展&#xff0c;因其自主学习图像数据特征的性能避免了人工设计算法的繁琐&#xff0c;精准的检测性能、高效的检测效率以及对各种不同类型的图像任务都有比较好的泛化性能&#xff0c;使得深度学习技术在…

【数据库】Redis—Java 客户端

一、常见的几种 Java 客户端 Jedis&#xff1a;以 Redis 命令作为方法的名称&#xff0c;便于学习&#xff0c;简单实用&#xff0c;但其实例是线程不安全的&#xff0c;多线程下需要基于连接池来使用。lettce&#xff1a;基于 Netty 实现&#xff0c;支持同步、异步和响应式编…

重拾设计模式--观察者模式

文章目录 观察者模式&#xff08;Observer Pattern&#xff09;概述观察者模式UML图作用&#xff1a;实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题&#xff08;Subject&#xff09;&#xff1a;具体主题&#xff08;Concrete Subject&#xf…

贪心算法 part01

class Solution { public:int maxSubArray(vector<int>& nums) {int result INT32_MIN;int count 0;for (int i 0; i < nums.size(); i) {count nums[i];if (count > result) { // 取区间累计的最大值&#xff08;相当于不断确定最大子序终止位置&#xff…

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集NI-FGSM介绍背景算法流程 NI-FGSM代码实现NI-FGSM算法实现攻击效果 代码汇总nifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR10进行…

SAP抓取外部https报错SSL handshake处理方法

一、问题描述 SAP执行报表抓取https第三方数据,数据获取失败。 报错消息: SSL handshake with XXX.COM:449 failed: SSSLERR_SSL_READ (-58)#SAPCRYPTO:SSL_read() failed##SapSSLSessionStartNB()==SSSLERR_SSL_READ# SSL:SSL_read() failed (536875120/0x20001070)# …

AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python

支持向量机是AI开发中最常见的一种算法。之前我们已经一起初步了解了它的概念和应用&#xff0c;今天我们用它来进行一次文本情感分析训练。 一、概念温习 支持向量机&#xff08;SVM&#xff09;是一种监督学习算法&#xff0c;广泛用于分类和回归问题。 它的核心思想是通过…

信奥赛四种算法描述

#include <iostream> #include <iomanip> using namespace std;// 使用unsigned long long类型来尽量容纳较大的结果&#xff0c;不过实际上这个数值极其巨大&#xff0c;可能最终仍会溢出 // 更好的方式可以考虑使用高精度计算库&#xff08;如GMP等&#xff09;来…

Ajax中的axios

既然提到Ajax&#xff0c;那就先来说一说什么是Ajax吧 关于Ajax Ajax的定义 Asynchronous JavaScript And XML&#xff1a;异步的JavaScript和XML。 反正就是一句话总结&#xff1a; 使用XML HttpRequest 对象与服务器进行通讯。 AJAX 是一种在无需重新加载整个网页的情况下&…

vscode 使用说明

文章目录 1、文档2、技巧显示与搜索宏定义和包含头文件 3、插件4、智能编写5、VSCode 与 C&#xff08;1&#xff09;安装&#xff08;2&#xff09;调试&#xff08;a&#xff09;使用 CMake 进行跨平台编译与调试&#xff08;b&#xff09;launch.json&#xff08;c&#xff…

多功能护照阅读器港澳通行证阅读机RS232串口主动输出协议,支持和单片机/Linux对接使用

此护照阅读器支持护照、电子芯片护照、港澳通行证、台湾通行证&#xff0c;和串口的被动的方式不一样。此护照阅读器通电后&#xff0c;自动读卡&#xff0c;串口输出&#xff0c;软件只需要去串口监听数据即可&#xff0c;例如用串口助手就可以收到读卡信息。 非常适用于单片…

petalinux-adi ---移植adi内核(一)

1. 设备树生成 将 前 面 生 成 的 设 备 树 文 件 ( 笔 者 这 里 生 成 的 设 备 树 文 件 在Petalinux 工 程 的components/plnx_workspace/device-tree/device-tree/ 目 录 下 ) pcw.dtsi 、 pl.dtsi 、system-top.dts 以 及 zynq-7000.dtsi 四 个 文 件 直 接 拷 贝 到 内 …