浅尝一下原生sql

文章讨论了使用原生SQL进行数据库操作的效率与便利性,指出虽然SQL直接操作高效,但处理结果集较繁琐。ORM框架如Go的GORM简化了这一过程,但在处理复杂SQL时可能变得复杂。作者认为,掌握SQL是后端开发者的必备技能,而ORM可用于简化简单查询。建议结合使用SQL和ORM,根据查询复杂度灵活选择。
摘要由CSDN通过智能技术生成

创建数据库

create database test_db;

use test_db;

create table stu (
id int primary key,
name varchar(20),
);

通过sql.open()连接数据库

sql.open(驱动名,数据源dsn)(*DB,err)
数据源语法:"用户名:密码@[连接方式](主机名:端口号)/数据库名"

操作代码

package main

import (
	"database/sql"
	"fmt"

	_  "github.com/go-sql-driver/mysql" //sql操作时不需要,只是连接的时候需要,所以加下划线忽略
	//它时驱动mysql的
)

func main() {
    // 数据源语法:"用户名:密码@[连接方式](主机名:端口号)/数据库名"
	db, _ := sql.Open("mysql", "root:xxxx@tcp(127.0.0.1:3306)/test_db")
	//设置连接数据库的参数 1.驱动名固定写法,2 数据源名称@符号后边如果是tcp协议,那么可以省略不写
	//返回db和一个错误
	defer db.Close() //关闭数据库
	//上边只是设置参数,并未真正连接

	//真正连接
	err := db.Ping() //连接数据库

	if err != nil { //判断成功失败
		fmt.Println("数据库连接失败")
		//如果连接失败 先检查数据库服务是否已经启动 net start mysql启动数据库
		return
	}

	//在数据库中创建表
	//use test1
	// mysql> create table stu(
	//     -> id int primary key,
	//     -> name varchar(10)
	//     -> );

	//1 插入数据

	//操作一:执行数据操作语句
	// sql := "insert into stu values(2,'beery')"
	// result, _ := db.Exec(sql)     //返回执行结果  //执行sql语句
	// n, _ := result.RowsAffected() //获取受影响的记录数
	// fmt.Println("受影响的记录数是", n);//这个分号加上也不错,标准没有
	//举一反三  更新删除同理

	//操作二:执行预处理
	// stu := [3][2]string{{"3", "ketty"}, {"4", "rose"}, {"5", "mike"}} //三行两列
	// //准备一下 ?是占位符  返回*Stmt 和 err
	// stmt, _ := db.Prepare("insert into stu values(?,?)") //获取预处理语句对象

	// for _, s := range stu { //返回下标和值
	// 	stmt.Exec(s[0], s[1]) //调用预处理语句传参数  对应id name
	// 	//运行一下,都进去了
	// }

	// //增删改用操作一就行

	// //操作三:单行查询

	// var id, name string

	// //获取一行数据
	// rows := db.QueryRow(" select * from stu where id= 4 ") //返回当前行的 一条记录  可以写where 条件
	// rows.Scan(&id, &name)                                  //将rows中的数据存放到id 和 name 中
	// fmt.Println("id:", id, "\tname:", name)

	// //操作四:多行查询
	rows, _ := db.Query(" select * from stu") //获取所有数据,返回所有的行
	//取数据库中的数据的时候有个指针,取完以后下移,没有记录时,不取了
	//刚开始的时候,指向第一条记录前的数据
	var id, name string
	for rows.Next() { //返回的bool型  循环显示所有的数据

		//有数据就获取当前行的数据
		rows.Scan(&id, &name)
		fmt.Println("id: ", id, "\tname: ", name)
	}
}

思考

使用原生的sql进行数据库操作,行得通,且效率高,但麻烦的就是对结果集的处理。使用ORM框架,可以简化结果集的处理流程,同时简化一些简单增删改查的过程。但是一旦遇到复杂的sql,用ORM描述起来会让人头疼。
面向后端开发的程序员如果不会写sql,那就称不上是合格的程序员。使用ORM框架应对一些复杂的sql时,用ORM描述其语句反倒成为了程序员的负担。可能有人想要下定决心去精通一个ORM框架,但在我看来,这似乎不是必要的。
我的一些想法是:可以写sql,也可以用ORM。不过用ORM来做结果集映射,会是一个不错的选择。对于简单sql我们直接使用orm,对于复杂sql,我们直接通过执行器+结果映射,而不是去用复杂的ORM表现形式去描述sql。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

metabit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值