Go的ORM也太拉跨了吧,赶紧给他封装一下

背景

去年慢慢开始接触了Go语言,也在公司写了几个Go的生产项目。我是从Java转过来的。(其实也不算转,公司用啥,我用啥)在这个过程中,老是想用Java的思维写Go,在开始的一两个月,那是边写边吐槽。

丑陋的错误处理,没有流式处理,还竟然没有泛型,框架生态链不成熟,没有一家独大的类似Spring的框架。(其实现在写了快一年的Go,Go还是挺香的,哈哈)

今天,我来聊一下,我在我在写Go过程中用的最多orm框架gorm。

Java的orm

写过Java的基本都知道Mybatis,Mybatis-plus。

在Mybatis-plus中操作单表非常方便,通过QueryWrapper,对于单表的操作非常的丝滑,没有任何的思维负担。

类似下面这样:

        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(User::getUsername,"zhangsan").eq(User::getAge,18);
        userMapper.selectList(queryWrapper);
复制代码

Go的orm

这里的条件查询都需要开发手动来拼接字符串,如果项目比较大的话,就会看到漫天飞的SQL字段,维护起来非常麻烦。

  var users []*User
  sqlResult := db.Where("username = ? and age = ?", "zhangsan", 18).Find(&users)
复制代码

解决方式

写了一段时间的Go之后,实在不想每次都写这些字符串拼接了,于是我给gorm封装了一个gorm-plus。

这里我使用到了go 1.18的泛型。泛型出了这么久,也该使用上了。

其实就是把Mybatis-plus的那套语法借鉴了一下。(好吧,就是抄他的)

Mybatis-plus对于单表操作提供了非常多的CRUD操作。

我给gorm-plus 也提供了类似的操作

下面是具体用法

下载:

go get github.com/acmestack/gorm-plus
复制代码

初始化sql

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users`  (
                          `id` int(0) NOT NULL AUTO_INCREMENT,
                          `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
                          `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
                          `age` int(0) NULL DEFAULT NULL,
                          `phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
                          `score` int(0) NULL DEFAULT NULL,
                          `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
                          `dept` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
                          `created_at` datetime(0) NULL DEFAULT NULL,
                          `updated_at` datetime(0) NULL DEFAULT NULL,
                          PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;
复制代码

连接数据库

var GormDb *gorm.DB

func init() {
  dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
  var err error
  GormDb, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
    Logger: logger.Default.LogMode(logger.Info),
  })
  if err != nil {
    log.Fatalln(err)
  }
  gplus.Init(GormDb)
}
复制代码

插入语句

  user := &User{Username: "zhangsan", Password: "123456", Age: 18, Score: 100, Dept: "A部门"}
  result := gplus.Insert(user)
  fmt.Println(result.RowsAffected)
复制代码

查询语句

根据id查询:

注意这里需要传入泛型User

  user, resultDb := gplus.SelectById[User](1)
  fmt.Println(user, resultDb.RowsAffected)
复制代码

根据ids查询:

  var ids = []int{1,2}
  users, resultDb := gplus.SelectByIds[User](ids)
  fmt.Println(users, resultDb.RowsAffected)
复制代码

条件查询:

  q := gplus.NewQuery[User]()
  q.Eq("username", "zhangsan").Eq("age",18)
  users, resultDb := gplus.SelectList(q)
  fmt.Println(users,resultDb.RowsAffected)
复制代码

对比一下Mybatis-plus写法基本一致了。

        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(User::getUsername,"zhangsan").eq(User::getAge,18);
        userMapper.selectList(queryWrapper);
复制代码

更多操作请查看:

github.com/acmestack/g…

gplus工具

其实上面的写法还是需要写数据库的字段名,如果数据库的字段名很多,我们很容易写错,导致不必要的bug产生。

一旦名称长,非常容易误写,而且如果有字段名称修改的话,还需要全局搜索一个个地修改,比较麻烦。

Go没有提供类似Java的lambad表达式或者C#中 nameof 方式直接获取某个对象的字段名称的操作,但是我们可以通过生成代码的方式生成字段名。

所有就有了gplus,它作用就是自动识别结构体,把结构体的字段名生成出来。

下载使用:

go install github.com/acmestack/gorm-plus/cmd/gplus@latest
复制代码

通过 gplus gen paths=路径,gplus 会自动识别带有// +gplus:column=true注释的结构体,给这个结构体生成字段。

gplus 会在输入的路径下面生成 zz_gen.column.go文件。

例如:

在example目录下创建了了一个users.go 目录,执行 gplus gen paths=./eample

users.go

// +gplus:column=true

type User struct {
  ID        int64
  Username  string `gorm:"column:username"`
  Password  string
  Address   string
  Age       int
  Phone     string
  Score     int
  Dept      string
  CreatedAt time.Time
  UpdatedAt time.Time
}
复制代码

zz_gen.column.go (自动生成的)

var UserColumn = struct {
  ID        string
  Username  string
  Password  string
  Address   string
  Age       string
  Phone     string
  Score     string
  Dept      string
  CreatedAt string
  UpdatedAt string
}{
  ID:        "id",
  Username:  "username",
  Password:  "password",
  Address:   "address",
  Age:       "age",
  Phone:     "phone",
  Score:     "score",
  Dept:      "dept",
  CreatedAt: "created_at",
  UpdatedAt: "updated_at",
}
复制代码

其实你自己也可以手写这个文件,只不过通过工具生成更加方便而已。

有了这个文件,我们的查询就变成这样:

  q := gplus.NewQuery[User]()
  q.Eq(UserColumn.Username, "zhangsan").Eq(UserColumn.Age,18)
  users, resultDb := gplus.SelectList(q)
  fmt.Println(users,resultDb.RowsAffected)
复制代码

这样维护起来就非常方便了。

本文转载于网络 如有侵权请联系删除

相关文章

  • 网鼎杯青龙组 2020 Crypto部分wp

    Crypto_youraisemeup附件(提取码:cvbl)此题考察离散对数,c=m^flag%n 经大佬指点,去百度bsgs 看懂之后就可以写脚本了 先用sage求个值最终得到底下的X值 接着python运行一波就可以得到flag 附上python脚本:#!/usr/bin/envpython -*-coding:utf-8-*- fromCrypto.Util.numberimport* importrandom x=56006392793405651552924479293096841126763872290794186417054288110043102953612574215902230811593957757 y=long_to_bytes(x) print(y)复制如果在kali中即可直接运行得flag,否则需要依靠sage(提取码:cbgy)Crypto_boom附件(提取码:cacg)这题就是需要通关(一共三关),需要在IDA打开 第一关(md5):在线解得:en5oy第二关:解得:x=74;y=68;z=31第三关:解得:x=89127561最后通关得到flag这

  • 【Unity技能】做一个简单的NPC

    大家好,又见面了,我是全栈君1.写在前面前几天我看到cgcookie一个教程。学习了下怎么依据已有人物模型制作一个仿版的NPC人物。感觉挺好玩的,整理一下放到博客里!先看一下教程里面的终于效果。是不是非常像个幽灵~以下是我在自己的project中实验的结果。中间是游戏角色。两遍两个就是NPC啦。这样的技术得到的效果和贴图关系非常大。所以假设效果不好再画一张贴图吧2.实现实现非常easy,一共包括三个部分:改变Mesh材质,给Mesh加入Particle,最后加入闪烁的脚本2.1改变Mesh材质首先新建一个空白对象。能够命名为holo_character,给它加入MeshFilter和MeshRender组件。 将原模型的Mesh赋值给上述MeshFilter组件。 然后新建一个材质,并赋值给MeshRender组件来替换原来的模型材质。 新的材质使用Particles/Additive的Shader,贴图属性中使用这个NPC的贴图,也也能够直接使用原模型的材质贴图。材质颜色能够依据喜好自行调节。面板设置例如以下: 假设你的模型包括多个Mesh,比如头和身体是分开的,那么对每一个部分都做

  • python-004_pandas.read_csv函数读取文件

    参考链接:Python|使用pandas.read_csv()读取csv1、pandas简介  pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。  通过带有标签的列和索引,Pandas使我们可以以一种所有人都能理解的方式来处理数据。从诸如csv类型的文件中导入数据。我们可以用它快速地对数据进行复杂的转换和过滤等操作。  它和Numpy、Matplotlib一起构成了一个Python数据探索和分析的强大基础。 2、Pandas中的数据类型  Pandas基于两种数据类型,series和dataframe。  series是一种一维的数据类型,其中的每个元素都有各自的标签。如果你之前看过这个系列关于Numpy的推文,你可以把它当作一个由带标签的元素组成的numpy数组。标签可以是数字或者字符。  dataframe是一个二维的、表格型的数据

  • 单细胞测序R包PAGODA使用

    PAGODA全称pathwayandgenesetoverdispersionanalysis,pagoda是2016年在naturemethods发表的一个分析单细胞测序的方法,主要特点是在已知的重要信号通路基础上对细胞进行分类,以提高统计效力并揭示可能的功能性解释。同时RNA速率推断细胞演化velocyto是基于pagoda,因此有必要学一下pagoda。安装#下载pagoda依赖的软件 sudoapt-getupdate sudoapt-get-yinstallbuild-essentialcmakegsl-binlibgsl0-devlibeigen3-devlibboost-all-devlibssl-devlibcurl4-openssl-devlibssl-devlibcairo2-devlibxt-devlibgtk2.0-devlibcairo2-devxvfbxauthxfonts-base #R中安装 source("http://bioconductor.org/biocLite.R") biocLite(c("GO.db"

  • 动手学深度学习(一)——逻辑回归(gluon)

    版权声明:博客文章都是作者辛苦整理的,转载请注明出处,谢谢!https://blog.csdn.net/Quincuntial/article/details/79348854文章作者:Tyan 博客:noahsnail.com|CSDN|简书注:本文为李沐大神的《动手学深度学习》的课程笔记!#导入mxnet importmxnetasmx #设置随机种子 mx.random.seed(2) frommxnetimportgluon frommxnetimportndarrayasnd frommxnetimportautograd frommxnetimportimage复制辅助函数fromutilsimportload_data_fashion_mnist,accuracy,evaluate_accuracy复制获取和读取数据#批数据大小 batch_size=256 #获取训练数据和测试数据 train_data,test_data=load_data_fashion_mnist(batch_size)复制定义和初始化模型#定义一个空的模型 net=gluon.nn.Seq

  • 骥智智能2018目标:F1赛车全视觉无人驾驶; ver0.01效果show

    2018年目标:F1赛车全视觉无人驾驶:需要的软件(自动驾驶框架等)、硬件(底盘控制、芯片、传感器训练用)、算法(模仿学习-强化学习-生成模型)、模拟、可视化、组织、场地、车辆等方面。期待您的支持与合作或加入。公司地址:上海张江金科路站长泰广场,后续:浦西同济、北京中关村进展:1真车在传感器安装好后就ok了。2仿真环境搭建测试中;2.1普通游戏仿真测试中;2.2各种硬件传感器仿真进行中;3模仿学习、生成模型训练中。视频内容招聘性格要求:主动,能够自我驱动!能跑深度学习模型。一句话:能看深度学习论文,能跑深度学习模型。详细要求:学习方法技能要求:提问的智慧HowToAskQuestionsTheSmartWay脑图和文章联盟:互联网时代的人才变革 YC创业课(CS183B)学习笔记:http://zhibimo.com/read/xiaolai/growth/find-people-who-build-stuffs.html《最重要的事只有一件》先把这个代码开源-自主GAN视频学习记忆70帧效果代码搞清楚就可以来面试。 https://github.com/createamind/vid

  • ODL应用案例之云和网络功能虚拟化应用案例

    概述近年来,大公司和中小企业已经认识到云计算技术是提高自己的竞争力的核心技术。混合云和公共云虽然具备了提高业务灵活性并降低总成本的潜力,但它们对于传统网络的需求依旧非常显著。云计算需要极其高水平的动态计算和自动化技术来解决快速变化的需求,当云计算在自动化计算和存储方向已经取得了重大进展的同时,网络自动化仍然因为更复杂而难以实现,从而阻碍了大多数云服务的部署。 通信服务提供商(CSP)也正利用云技术来增强其庞大的网络基础设施的可管理性和成本效益,同时提高了服务灵活性。许多世界领先的电信和有线电视运营商在网络功能虚拟化(NFV)方向展开合作,目的就是促进一个开放的体系架构和生态系统,从而支持广泛的应用案例。NFV开启了现有网络架构的一个全新的观点:面对市场上极速提升的性能需求和多元化的服务要求,NFV必须比传统的网络更加的灵活。软件定义网络(SDN)是一个高速发展的动态网络架构,主要用于解决云计算和NFV的网络需求。SDN体系结构的核心是SDN控制器,其主要优点为:开放API便于实现多样化的应用;支持各大厂商的不同设备;通过可编程网络提供了智能的控制和管理系统。网络运营商正在努力在支持最终

  • 什么是“探索性数据分析"?

    在大数据时代,混乱的、无结构的、多媒体的海量数据,通过各种渠道源源不断地积累和记载着人类活动的各种痕迹。探索性数据分析可以成为了一个有效的工具。美国约翰·怀尔德杜克(JohnWilderTukey)1977年在《探索性数据分析》(ExploratoryDataAnalysis)一书中第一次系统地论述了探索性数据分析。他的主要观点是:探索性数据分析(EDA)与验证性数据分析(ConfirmatoryDataAnalysis)有所不同:前者注重于对数据进行概括性的描述,不受数据模型和科研假设的限制,而后者只注重对数据模型和研究假设的验证。他认为统计分析不应该只重视模型和假设的验证,而应该充分发挥探索性数据分析的长处,在描述中发现新的理论假设和数据模型。探索性数据分析有别于初始性数据分析(initialdataanalysis-IDA)。初始性数据分析的聚焦点是分析鉴别统计模型和科研假设测试所需的条件是否达到,以保证验证性分析的可靠性。在这个分析过程中对不符合条件的数据进行缺值填补、数据转换、异常值舍弃等处理以增强分析的准确性。探索性数据分析包含初始性数据分析,但它的出发点不仅是确定数据质量

  • 内存管理

    1.内存管理 虚拟内存 虚拟内存时一种计算机系统内存管理的技术,目的是为了防止不同的进程同一时刻对物理内存的抢夺。这种技术让每个进程认为它拥有连续可用的内存(一个连续完整的地址空间),互相不会干扰到对方。实际上,它通常被分隔成多个物理内存碎片,还有部分暂存在外部磁盘存储器上,需要时进行数据交换。这种技术使得大型程序的编写更容易,对真正的物理内存使用也更有效率。 对虚拟内存的定义是基于对地址空间的重定义,把地址空间定义为连续的虚拟内存地址,借以欺骗程序,让它认为自己正在使用一大块连续的地址。 虚拟内存管理 1、分页式存储管理:现代操作系统中,虚拟内存和物理内存都是按照页来进行管理的,一个内存页式一段固定大小的连续内存地址的总称,因此内存地址可以通过页号和页内偏移来进行表示。 在这种系统中,允许进程去把每一页离散的存储在内存的任一物理块中,为了在内存中找到每个页面的物理块,系统给进程建立一个一张页表,用来记录进程逻辑页面和内存物理页面之间的对应关系。 页表就是为了实现从页号到物理块号的映射。地址空间有多少页,该页表里就登记多少行,且按逻辑页的顺序排列。 2、分段式存储管理 段时按照程序的自

  • OAuth

    OAuthOAuth为用户资源的授权提供了一个安全、开放的标准,将会是以后开发平台普遍遵守的,目前Twitter、Sina微博、豆瓣、Google等都提供对它的支持。它分为几个交互过程:1)应用用APPKEY和APPSECRET换取OAuth_token;2)应用将用户引导到服务商的页面对该OAuth_token进行授权(可能需要输入用户名和密码);3)服务商的页面跳转回应用,应用再根据参数去服务商获得AccessToken;4)使用这个AccessToken就可以访问API了。上述过程如下图所示:OAuth认证过程OAuth的优点:u安全性高,用户的账户和密码只需要提供一次,而且是在服务商的页面上提供,防止了BasicAuth反复传输密码带来的安全隐患;uAccessToken访问权限仅限于应用,被窃取不会影响用户在该服务商的其他服务;uAccessToken即使被监听丢失了随时可以撤销,不像密码丢失可能就被别人篡改了;u用户修改了密码也不会影响该应用的正常使用。   OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的

  • 开始写了

      之前定的计划,每个月写两篇,太高估自己了,实在是懒。写技术类的太麻烦,不写技术类的自己又不会。   以上都是借口,每天写一点是一点,写啥无所谓了。   从今天开始写了,对于我自己来讲,有学到什么新东西就总结下,输出出来,不在乎类容的长短。

  • 湖南省 自学考试 [转籍] [管理系统]

    湖南省自考转籍史 2020年11月份电话咨询的情况 1.这个系统,使用了十几年了,还是这个破系统,没有更新和大的变化。 转籍功能,做的很垃圾,还收费!!!收费也就算了,还是现场缴费,50元/人/次!!!还要本人到现场!!! 【湖南省自学考试管理系统,给人的印象:1.转籍不方便。2.不免费也就算了。3.还让人劳车废马。】 【缴费窗口是:湖南的政务大厅,湖南省的政务都成吸血体了。】   2022年9月份的了解。 广东省的自学考试系统又一次重大更新,申请转籍后生成订单二维码,考生用微信扫码进行人脸身份认证。通过自行确认即可。 应该学习广东省的自学考试管理系统,转籍都是在线办理。【一来疫情原因,二来方便考生,三来免费。此三点足以领先湖南省省自考办的这群废物几条街坊】   2022年11月又进行了电话咨询 让考生按网站特别提醒的7条来,提示第3条不用管,已经免费,跳过。其它的操作不变。 还是要本人去现场,来回一次,车费,工时,让我找人代办,让我促进长沙市的消费吗? 这个省的自考办的人才一个个都在想什么,真正为考生着想了么,怎么就不能想想网上确认呢?

  • mysql与系统优化

    1.系统优化工具 1.1top 实时监控当前操作系统的负载情况的,每秒刷新一次状态,通常会关注三大指标(CPU、MEM、IO) 1.1.1各项指标说明 loadaverage:0.00,0.00,0.00:整体的负载情况,判断标准,如果值非常高,只能告诉我们操作系统很繁忙 CPU使用情况:Cpu(s):0.2%us,0.2%sy,99.7%id,0.0%wa %id:CPU空闲的百分比 %us:用户程序,占用的CPU时间片的百分比。我们认为us%高是好事,但要在cpu正常能力范围内。 %sy:系统程序(和内核工作有关),资源调配,资源管理,内核其他功能的管理(systemcall)对于比较成熟的操作系统,对sy%应该是占比很少的。我们认为越少越好。如果飙升,可能说明两件事情,1,系统bug;2,中病毒了 %wa这个参数越少越好。如果wait高说明了,1,IO很慢(速度慢,全表扫描)2、内存满了OOM(内存小,全表扫描) Mem:内存使用情况 total:总的内存量 used:已经被使用的内存量 free:空闲的内存空间 buffer:专门负责操作系统当中,与文件修改类操作有关

  • 项目冲刺第七天

    昨天通过看书学习mysql数据库的创建及使用 今天上网查资料来连接数据库。 遇到的问题:在手机端连接数据库出现问题,SQLite无法连接到tomcat 站立会议:时间:早上7点      地点:八零广场(由于有队员临时受伤,不方便下楼,故会议地点改在了宿舍。)

  • django orm 读写分离,分库分app

    1,读写分离 第一步:在settings下面配置 DATABASES={    'default':{    'ENGINE':'django.db.backends.mysql',    'NAME':'blog',    'USER':'root',    'PASSWORD':'123456',    'HOST':'127.0.0.1',    'PORT':'3306', },    'appinfo':{    'ENGINE':'django.db.backends.mysql',    'NAME':'db2',    'USER':'root',    'PASSWORD':'123456',  &nb

  • 禅道导出用例模板乱码问题

    1.导出csv格式的文件后,选择用记事本打开 2.记事本另存为.csv,编码选择合适的编码格式(如:带有BOM的UTF-8) 就可以正常打开了。

  • [NFS]如何使用vdbench对同一个NFS共享同时通过4个端口下发IO

    parameter: fsd=fsd1,anchor=/mnt/mnt1/1,depth=1,width=1,files=512,size=20M fsd=fsd2,anchor=/mnt/mnt2/2,depth=1,width=1,files=512,size=20M fsd=fsd3,anchor=/mnt/mnt3/3,depth=1,width=1,files=512,size=20M fsd=fsd4,anchor=/mnt/mnt4/4,depth=1,width=1,files=512,size=20M fwd=fwd1,fsd=fsd*,rdpct=70,xfersize=4k,fileio=random,fileselect=random,threads=8 rd=rd1,fwd=fwd1,fwdrate=max,format=yes,elapsed=120,interval=1复制   把每个fsd隔离在自己的目录里vdbench就不会冲突了。

  • Ansys Maxwell4——二维稳态磁场应用

    静态磁场是指所有的磁场量均不随时间改变而改变。涡流磁场则是指激励随时间按正弦或者余弦规律变化,但从统计意义上来讲,它又是时间平稳的,我们通常将这样的磁场看成是准静态的电磁场,称之为谐性磁场或似稳场。 4.1概述 所谓静态磁场是指不随时间变化的磁场,他通常包括下面几种情况:永磁体的磁场;稳恒电流产生的磁场;外加静磁场产生的磁场;匀速运动的导体(如线性感应电动机)。 对于激励源(电压或者电流)服从正弦或者余弦规律变化所产生的电磁场问题为涡流问题或者谐性问题。 4.2永磁同步电机静磁场分析实例 三相永磁同步电动机,由定子铁心、定子绕组、永磁体磁极、转子铁心组成。电机定子内径、外径分别为74mm和120mm,极数4,定子槽数24,电机为对称结构可以建立四分之一模型,为了更加清晰地展示整个电机模型的建立情况,本例采用整域求解。问题为求解电机的平均电磁转矩及场图分布。 get到的知识点: 通过Modeler/Boolean/Unite操作,将线段合成一体; 通过Modeler/Surface/Coverlines由闭合曲线创建面域; 在Modeler/Boolean/Substrac

  • 装载问题

    #include<stdio.h> #include<stdlib.h> intMaxLoading(intw[],intc,intn,intbestx[])//迭代回溯法,返回最优载重量及其相应解,初始化根结点 { inti=1,j;//当前层,x[1:i-1]为当前路径 int*x=newint[n+1]; intbestw=0;//当前最优载重量 intcw=0;//当前载重量 intr=0;//剩余集装箱重量 for(j=1;j<=n;j++) { r+=w[j]; } while(true)//搜索子树 { while(i<=n&&cw+w[i]<=c)//进入左子树 { r-=w[i]; cw+=w[i]; x[i]=1; i++; } if(i>n)//到达叶结点 { for(intj=1;j<=n;j++) { bestx[j]=x[j]; } bestw=cw; } else//进入右子树 { r-=w[i]; x[i]=0;i++; } while(cw+r<=bestw) {//剪

  • 关于mysql 出现锁等待mysql Lock wait timeout exceeded; try restarting transaction的问题

    在做修改语句的时候,数据库抛出Lockwaittimeoutexceeded;tryrestartingtransaction这样的异常,提示错误的意思很明显,是因为这条语句被锁住了,所以释放这个锁。   解决方案: 1.通过sql:  SELECT*FROMinformation_schema.INNODB_TRX 来查看当前所运行的所有事务,通过查询表,发现有一条事务记录一直处于RUNNING的状态   2.再次通过sql:SELECT*FROMinformation_schema.`PROCESSLIST`WHEREid="trx_mysql_thread_id",”trx_mysql_thread_id“为INNODB_TRX表中的字段,通过PROCESSLIST来查找被锁的语句,PROCESSLIST这张表保存了MySql服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。   3.排查出问题所在后,即可在数据库控制台通过 KILLID  命令杀死这条事务线程,应

  • strace命令跟踪ping调用函数整理

    execve函数:execve(执行文件)在父进程中fork一个子进程,在子进程中调用exec函数启动新的程序。exec函数一共有六个,其中execve为内核级系统调用,其他(execl,execle,execlp,execv,execvp)都是调用execve的库函数。用来调用shell命令brk函数:是将数据段(.data)的最高地址指针_edata往高地址推。malloc小于128k的内存,使用brk分配内存mmap函数:是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0)access函数:用来判断指定的文件或目录是否存在(F_OK),已存在的文件或目录是否有可读(R_OK)、可写(W_OK)、可执行(X_OK)权限。F_OK、R_OK、W_OK、X_OK这四种方式通过access函数中的第二个参数mode指定。如果指定的方式有效,则此函数返回0,否则返回-1。open函数:打开和创建文件(建立一个文件描述符,其他的函数可以通过文件描

相关推荐

推荐阅读