当前位置: 首页 > 编程日记 > 正文

go语言服务器连接mysql_go语言原生连接数据库

go操作mysql

database/sql

原生支持连接池,是并发安全的

这个标准库没有具体实现,只是列出了一些需要第三方库实现的具体内容

下载驱动

go get -u github.com/go-sql-driver/mysql

连接数据库package main

import (

"database/sql"

"fmt"

_ "github.com/go-sql-driver/mysql" //导入并且没有使用,所以默认调用init方法,在底层会注册一个叫mysql的驱动

)

func main() {

//连接数据库

dsn := "root:123123@tcp(127.0.0.1:3306)/godb"

//Open不会校验用户名密码是否正确,只能校验数据格式对不对

db, err := sql.Open("mysql", dsn)

if err != nil {

fmt.Println("连接错误", nil)

return

}

err = db.Ping() //尝试连接数据库

if err != nil {

fmt.Println("打开数据库失败", dsn, err)

return

}

fmt.Println("连接数据库成功")

}

查询单条记录package main

import (

"database/sql"

"fmt"

_ "github.com/go-sql-driver/mysql" //导入并且没有使用,所以默认调用init方法,在底层会注册一个叫mysql的驱动

)

var db *sql.DB

//数据库三个字段 主键id,name,age

func initDB() (err error) {

//连接数据库 账号root 密码123123 数据库名 godb

dsn := "root:123123@tcp(127.0.0.1:3306)/godb"

//Open不会校验用户名密码是否正确,只能校验数据格式对不对

db, err = sql.Open("mysql", dsn)

if err != nil {

return

}

err = db.Ping() //尝试连接数据库

if err != nil {

return

}

//设置数据库连接池的最大连接数

db.SetMaxIdleConns(10)

return

}

type user struct {

id int

name string

age int

}

//删

func delete(id int) {

sqlStr := `delete from user where id=?`

ret, err := db.Exec(sqlStr, id)

if err != nil {

fmt.Println("删除失败", err)

return

}

n, err := ret.RowsAffected()

if err != nil {

fmt.Println("获取删除记录错误", err)

return

}

fmt.Println("更新了", n, "条数据")

}

//查询单条

func queryOne(id int) {

var u1 user

//sql语句编写

sqlStr := `select id,name,age from user where id=?`

rowObj := db.QueryRow(sqlStr, id) //从连接池那里连接查询出一个单挑记录

//拿到结果,

rowObj.Scan(&u1.id, &u1.name, &u1.age) //必须对rowObj对象调用Scan方法,因为该方法会释放数据库连接

fmt.Printf("u1:%#v\n", u1)

}

func insert() {

//sql

sqlStr := `insert into user(name,age) values("名字",20)`

ret, err := db.Exec(sqlStr)

if err != nil {

fmt.Println("执行sql错误", err)

return

}

//如果是插入数据的操作,能够拿到插入数据的id值

id, err := ret.LastInsertId()

if err != nil {

fmt.Println("获取id错误", err)

return

}

fmt.Println("id:", id)

}

//查询多条

func queryMore(n int) {

//sql

sqlStr := `select id,name,age from user where id > ?;`

rows, err := db.Query(sqlStr, n)

if err != nil {

fmt.Println("查询错误", err)

return

}

//关闭rows

defer rows.Close()

//循环取值

for rows.Next() {

var u1 user

err := rows.Scan(&u1.id, &u1.name, &u1.age)

if err != nil {

fmt.Println("解析错误", err)

}

fmt.Println(u1) //取一条打印一条

}

}

//改

func updateRow(newAge int, id int) {

sqlStr := `update user set age=? where id=?`

ret, err := db.Exec(sqlStr, newAge, id)

if err != nil {

fmt.Println("更新错误", err)

return

}

n, err := ret.RowsAffected()

if err != nil {

fmt.Println("a", err)

return

}

fmt.Println("更新了", n, "行数据")

}

func main() {

err := initDB()

if err != nil {

fmt.Println("连接失败", err)

return

}

fmt.Println("连接数据库成功")

// queryOne(2)

// queryMore(0)

// insert()

// updateRow(99, 2)

delete(5)

}

相关文章:

2017《面向对象程序设计》寒假作业一

1、你有什么技能比大多人(超过70%以上)更好? 我看电影比一般人多一点点;我听英文歌比一般人多一点点;我有一把尤克里里和一个滑板。我有很多爱好,但都没能发展成我的特长,它们给我的生活增添了情…

gis中的加权求和工具在哪里_ArcGIS教程:加权总和的工作原理

使用加权总和工具可以对多个输入进行加权及组合,以创建整合式分析。它可以轻松地将多个栅格输入(代表多种因素)与组合权重或相对重要性相结合,在这一方面它与加权叠加工具很相似。这两种工具有两个主要区别:加权总和工具不能将重分类值重设为…

flask执行python程序_Flask app后如何执行代码(应用程序运行)开始

但我想使用一种方法,它还可以保存相机中的所有相框(我已经有功能了)。在问题是,一旦我启动了Flask应用程序,我最多只能存储在localhost中打开web页面时捕获的帧。我希望能够在应用程序运行时执行其他代码(保存图片),以便保存所有图…

异常处理与MiniDump详解(3) SEH(Structured Exception Handling)

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 一、 综述 SEH--Structured Exception Handling,是Windows操作系统使用的异常处理方式。 对于SEH,有点需要说明的是,SEH是属于操作系统的特性,不为特定…

电热水器技术性能指标

1、即热式和贮水式的选择 有使用安全、卫生、不受水压限制,随时可供热水,水温易调节等优点,在发达的西方国家已广泛地使用,即热式热水器体积小,不须预热,但功率大,通常在4-6kw以上&#xff0…

java相关网络协议无响应_java网络协议有哪些

上网的途径有很多,java是最普遍的,那么卑java网络协议有哪些?了解网络安全常识,首先就要了解计算机网络安全有哪些基本注意事项,下面佰佰安全网小编就带您认识一下吧。概念协议是指计算机通信网络中两台计算机之间进行通信所必须…

es日期format_elasticsearch存储日期格式字段

elasticsearch创建index之后,可以设置mapping,如果mapping中没有设置date的format,那么默认为两种格式:date_optional_time 此格式为ISO8601标准 示例:2018-08-31T14:56:18.00008:00epoch_millis 也就是时间戳 示例151…

arraylist 后往前遍历_面试官:谈谈常用的Arraylist和Linkedlist的区别

Arraylist:底层是基于动态数组,根据下表随机访问数组元素的效率高,向数组尾部添加元素的效率高;但是,删除数组中的数据以及向数组中间添加数据效率低,因为需要移动数组。例如最坏的情况是删除第一个数组元素…

linux mipi驱动分析_寒武纪社招内推数字IC设计、DSI驱动、软件架构、产品经理、芯片架构、工具链开发、深度学习、FAE工程师...

点击上方蓝字关注我吧!为什么内推更靠谱?内推是基于人脉关系链的推荐,其背后有一定的信用背书,靠谱的人推荐的人相对也会比较靠谱,所以企业一般职位都是从内部开始分享的,相较于自己海投简历,内…

关于鼠标、键盘的几个例子

1 1. 鼠标的哪个按键被点击&#xff1f;2 <html>3 <head>4 <script type"text/javascript">5 function whichButton(event)6 {7 if (event.button2)8 {9 alert("你点击了鼠标右键!")10 }11 else12 {13 alert("你点击了鼠标左键!&qu…

mysql性能优化1

当我们去设计数据库表结构&#xff0c;对操作数据库时&#xff08;尤其是查表时的SQL语句&#xff09;&#xff0c;我们都需要注意数据操作的性能。这里&#xff0c;我们不会讲过多的SQL语句的优化&#xff0c;而只是针对MySQL这一Web应用最多的数据库。希望下面的这些优化技巧…

java获取date的时分秒_Java 之 Date 获取 年月日时分秒

package com.util;import java.text.DateFormat;import java.util.Calendar;import java.util.Date;public class Test {public void getTimeByDate(){Date date new Date();DateFormat df1 DateFormat.getDateInstance();//日期格式&#xff0c;精确到日System.out.println(…

python中字典的value可以为任意对象_Python对象作为字典值

所以我有以下代码,其中字典的值是一个对象,该对象的关键是对象中的一个项目&#xff1a;class MyObject():def getName(self):return self.namedef getValue(self):return self.valuedef __init__(self,name, value):self.name nameself.value valuedict {}object MyObject…

Android Java使用JavaMail API发送和接收邮件的代码示例

JavaMail是Oracle甲骨文开发的Java邮件类API,支持多种邮件协议,这里我们就来看一下Java使用JavaMail API发送和接收邮件的代码示例 使用Javamail发送邮件&#xff0c;必需的jar包&#xff08;请下载javamail的源文件&#xff0c;官方下载页&#xff1a;http://www.oracle.com/t…

python 包用法_Python 基础教程之包和类的用法

Python 基础教程之包和类的用法这篇文章主要介绍了 Python 基础教程之包和类的用法的相关资料, 需要的朋友可以参考下Python 是一种面向对象、解释型计算机程序设计语言&#xff0c;由 Guido van Rossum 于 1989 年底发明&#xff0c;第一个公开发行版发行于 1991 年。Python 语…

[bzoj2259][Oibh]新型计算机_Dijkstra

新型计算机 bzoj-2259 Oibh 题目大意&#xff1a;给定一个n个数的数列&#xff0c;第i个数为a[i]&#xff0c;更改第i个数至x的代价为|x-a[i]|。求最小代价&#xff0c;使得&#xff1a;读入一个数s1后&#xff0c;向后连着读s1个数&#xff0c;然后如s2&#xff0c;再向后读s2…

arcengine 加载地图不显示_地图建筑建模制作与输出

导读阅读完此文&#xff0c;你会了解&#xff1a;1、地图建筑模型通常如何制作的2、地图建筑模型替换策略地图上往往会有一些定制建筑的需求&#xff0c;例如将下面的水立方做成气泡感的。 加入定制模型之前加入定制模型之后这种需求就需要建模师对建筑做定制化建模。模型制作首…

用easyx画电子钟_Canvas入门-利用Canvas绘制好玩的电子时钟

在这之前你需要了解一下方法的使用&#xff1a;beginPath()closePath()moveTo()lineTo()fill()stroke()fillRect()clearRect()这些我在前面的文章介绍过&#xff0c;可以看&#xff1a;画个圆arc()方法arc(x, y, radius, startAngle, endAngle, anticlockwise) > 画一个以(x…

前端开发工程师面试题之综合篇

温馨提示&#xff1a;以下系列的面试题是通过整合网上各位大牛的文章而成&#xff0c;站在巨人的肩膀上&#xff0c;能够让我们更进一步。 1、页面从输入URL到页面加载显示完成&#xff0c;这个过程中都发生了什么&#xff1f; 输入域名地址发送域名地址至DNS服务器并获得对应W…

C语言基础(12)-输入和输出

1. int scanf(const char *format, ...) 说明&#xff1a;scanf用于通过控制台输入字符串。 注意&#xff1a; (1).通过scanf()函数输入的字符串&#xff0c;系统会自动在其后面补一个0,scanf默认回车和空格都是代表输入完成&#xff0c;这样会导致无法输入一个完整的字符串。 …

java static 可见性_Java多线程 synchronized与可见性的关系以及可见性问题总结

作者&#xff1a;七里香的编程之路出自&#xff1a;OSCHINA原文&#xff1a;my.oschina.net/u/4098550/blog/4548274能保证可见性的措施除了volatile 可以让变量保证可见性外.happens-before九大规则. 都是能够保证可见性的. 其中就包含了锁操作(synchronized 和 lock) 和 vola…

表达式树 java_表达树—构建表达式树、获取表达式(二)

public classExprTree {//最后访问头结点public BinaryTreeNode buildExprTree(char postfixExpr[],intsize){LinkedList stacknewLinkedList();BinaryTreeNode nodenull;for(int i0;inodenewBinaryTreeNode();node.setLeft(null);node.setRight(null);node.setData(postfixExp…

python 客户端 如何获取手机_Python学习---Django的request扩展[获取用户设备信息]

关于Django的request扩展【获取用户设备信息】settings.pyINSTALLED_APPS [...app01, # 注册app]STATICFILES_DIRS (os.path.join(BASE_DIR, "statics"),) # 现添加的配置,这里是元组&#xff0c;注意逗号TEMPLATES [...DIRS: [os.path.join(BASE_DIR, templates)…

: error c2062: 意外的类型“int”_Go 命令行解析 flag 包之扩展新类型

上篇文章 说到&#xff0c;除布尔类型 Flag&#xff0c;flag 支持的还有整型&#xff08;int、int64、uint、uint64&#xff09;、浮点型&#xff08;float64&#xff09;、字符串&#xff08;string&#xff09;和时长&#xff08;duration&#xff09;。flag 内置支持能满足大…

java英文字符串大小写转换 必须使用_【Java基础】之字符串大小写转换不利用API....

public class UpStr{static String str "AbcDeFdDSfgdsadeADFSAFCfdsa";public String transformUpperOrLower(String str, String type){//将字符串转换为char数组char[] ch str.toCharArray();if (type null || type.length() 0 || type.equals(""))…

.net core 17

转载于:https://www.cnblogs.com/qingwengang/p/6297486.html

vue中子组件和子组件之间怎么通信_vue.js组件之间如何通信?

vue.js组件之间如何通信&#xff1f;下面本篇文章就来给大家介绍一下Vue.js组件间通信方式。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。平时在使用Vue框架的业务开发中&#xff0c;组件不仅仅要把模板的内容进行复用&#xff0c;更…

以太坊RLP机制分析

目录 1 RLP 定义 2 RLP 编码规则 3 RLP 编码实例 4 RLP 分析 1 RLP 定义 RLP&#xff0c;即 Recursive Length Prefix, 递归长度前缀编码&#xff0c;是以太坊数据序列化的主要方法&#xff0c; 具有较好的数据处理效率&#xff0c;尤其是将长度和类型统一作为前缀&#xff0c;…

Android Studio导入Eclipse项目的两种方法

Android Studio导入Eclipse项目有两种方法&#xff0c;一种是直接把Eclipse项目导入Android Studio&#xff0c;另一种是在Eclipse项目里面进行转换&#xff0c;然后再导入Android Studio。 1. 直接导入 打开Android Studio&#xff0c;如果里面已经打开了项目&#xff0c;选择…

mediawiki java api_维基百科 MediaWiki API 解析

使用开放的 API 做一个自己的小项目&#xff0c;是一个很好的学习方法。但好像开放的 API 选择并不多。这里给大家多一个选择&#xff0c;简单介绍一下维基百科使用的 MediaWiki API。简介先简单介绍几个容易混淆的概念。WikiWiki 是一种在网络上开放且可供多人协同创作的超文本…