SQLite 数据库入门教程(GO)

news2024/11/24 17:45:27

文章目录

  • SQLite数据库入门教程
    • 一、SQLite 简介
      • 1、什么是 SQLite?
      • 2、为什么要用 SQLite?
    • 二、SQLite 安装
      • 1、在 Windows 上安装 SQLite
      • 2、在 Linux 、Mac OS上安装 SQLite
    • 三、SQLite 命令
    • 四、SQLite 使用
      • 1、SQLite 数据类型
      • 2、SQLite 语法
      • 3、SQLite 可视化管理工具
    • 五、Go 语言使用 SQLite 数据库
      • 1、安装 go-sqlite3
      • 2、安装 mingw64
      • 3、连接数据库
      • 4、创建数据表
      • 5、插入数据
      • 6、查询数据
    • 六、实践(运费清单计算和测试程序)

SQLite数据库入门教程

一、SQLite 简介

1、什么是 SQLite?

  SQLite是一个轻量级、嵌入式、跨平台的关系型数据库,是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。

2、为什么要用 SQLite?

  • 不需要一个单独的服务器进程或操作的系统(无服务器的)。它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。

  • SQLite 不需要配置,这意味着不需要安装或管理。

  • 一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。使用 sqlite 打开或创建一个数据库文件,操作该文件实现对数据库的操作。

  • SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB。

  • SQLite 是自给自足的,它的核心引擎本身不依赖第三方的软件。

  • SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。

  • SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。

  • SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API。

  • SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中运行。

二、SQLite 安装

1、在 Windows 上安装 SQLite

   请访问 SQLite 下载页面,从 Windows 区下载预编译的二进制文件,你需要下载 sqlite-dll-win64-x64-3420000.zip 和 sqlite-tools-win32-x86-3420000.zip 压缩文件。

在这里插入图片描述

   新建文件夹 D:\SQLite,并在此文件夹中解压上面两个压缩文件,将得到以下文件。

在这里插入图片描述

   添加 D:\SQLite 到 PATH 环境变量,最后在命令提示符下,使用 sqlite3 命令,将显示如下结果。

在这里插入图片描述

2、在 Linux 、Mac OS上安装 SQLite

   Linux 操作系统、Mac OS 系统都附带 SQLite,使用 sqlite3 命令来检查你的机器上是否已经安装了 SQLite。如果没有可用的安装,请访问 SQLite 下载页面,从源代码区下载 sqlite-autoconf-3420000.tar.gz。

在这里插入图片描述

使用如下步骤安装:

$ tar xvzf sqlite-autoconf-3420000.tar.gz
$ cd sqlite-autoconf-3420000
$ ./configure --prefix=/usr/local
$ make
$ make install

三、SQLite 命令

  在 sqlite> 提示符后可以输入命令,这些命令被称为 SQLite 的点命令。确保 sqlite> 提示符与点命令之间没有空格,否则将无法正常工作。SQLite 是不区分大小写的,但也有一些命令是大小写敏感的,比如 GLOB 和 glob 在 SQLite 的语句中有不同的含义。

命令描述
.help获取可用的点命令的清单
.exit退出 SQLite 提示符
.show显示各种设置的当前值
.quit退出 SQLite 提示符
.databases列出数据库的名称及其所依附的文件
.schema查看所有表结构
.schema 表名查看指定表结构
.tables查看所有表
.tables 表名查看指定表,表存在返回表名,表不存在什么都不返回
.header(s) ON/OFF开启或关闭头部显示
.mode MODE设置输出模式,MODE 可以是下列之一:column 左对齐的列
.timer ON/OFF开启或关闭 CPU 定时器

在这里插入图片描述

在这里插入图片描述

四、SQLite 使用

1、SQLite 数据类型

  SQLite 数据类型是一个用来指定任何对象的数据类型的属性。SQLite 中的每一列,每个变量和表达式都有相关的数据类型。您可以在创建表的同时使用这些数据类型。SQLite 使用一个更普遍的动态类型系统。在 SQLite 中,值的数据类型与值本身是相关的,而不是与它的容器相关。

存储类描述
NULL值是一个 NULL 值
INTEGER值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中
REAL值是一个浮点值,存储为 8 字节的 IEEE 浮点数字
TEXT值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储
BLOB值是一个 blob 数据,完全根据它的输入存储

2、SQLite 语法

  所有的 SQLite 语句可以以任何关键字开始,如 SELECT、INSERT、UPDATE、DELETE、ALTER、DROP 等,所有的语句以分号 ; 结束。

  • 创建数据库:sqlite3 DatabaseName.db
C:\Users\lenovo>sqlite3 C:\Users\lenovo\Desktop\test.db // 创建数据库
sqlite> .databases // 显示数据库信息
sqlite> .quit // 退出sqlite3的shell程序环境
sqlite> .open test.db // 创建数据库

在这里插入图片描述

  新手注意,这里有一个坑,是在cmd(在命令行)中输入,而不是打开sqlite3后在shell中输入。输入 .databases 就会显示刚创建的数据库信息(能看到创建的数据库文件及地址路径信息);输入.quit 就会退出sqlite3的shell程序环境。进入SQLite后,输入 .open 数据库名.db 方式,也可以创建数据库,如果数据库文件已经建立,则打开。这种方式不支持自定义路径。

  • 创建表:CREATE TABLE database_name.table_name(column1 datatype PRIMARY KEY(one or more columns),column2 datatype,…);
sqlite> CREATE TABLE express_orders (id INTEGER PRIMARY KEY NOT NULL,uid INTEGER NOT NULL,weight DOUBLE NOT NULL,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP); // 创建表
sqlite> .schema // 查看所有表结构
sqlite> .tables // 查看所有表

在这里插入图片描述

  • 插入数据(insert):
    INSERT INTO TABLE_NAME (column1, column2, column3,…columnN) VALUES (value1, value2, value3,…valueN);
    INSERT INTO TABLE_NAME VALUES (value1,value2,value3,…valueN);
sqlite> INSERT INTO express_orders (uid,weight) VALUES (1685040228039,0.9);
sqlite> INSERT INTO express_orders (uid,weight) VALUES (1685040500698,67.9942); 
sqlite> INSERT INTO express_orders (uid,weight) VALUES (1685040524994,99.99);
sqlite> INSERT INTO express_orders (uid,weight) VALUES (1685040559781,100);

在这里插入图片描述

  • 查询数据(select):
    SELECT * FROM table_name;(查询所有字段)
    SELECT column1, column2, columnN FROM table_name;(查询指定字段)
    SELECT * FROM table_name where column1 = 指定信息;(在限制条件下查询指定信息)
sqlite> SELECT * FROM express_orders;
sqlite> SELECT uid,weight FROM express_orders;
sqlite> SELECT * FROM express_orders where id > 1;
sqlite> .header on // 开启头部显示
sqlite> .mode column // 设置输出模式,左对齐的列
sqlite> SELECT * FROM express_orders;
sqlite> .timer on // 开启 CPU 定时器
sqlite> SELECT * FROM express_orders;

在这里插入图片描述
在这里插入图片描述

  • 创建索引(Index):CREATE INDEX index_name ON table_name (column_name);
sqlite> CREATE INDEX index_uid ON express_orders (uid); // 创建索引
sqlite> .schema // 查看所有表结构

在这里插入图片描述

3、SQLite 可视化管理工具

  SQLiteStudio是一个开源、跨平台的 SQLite 可视化管理工具。免费,多语言界面,支持 Linux,Mac 和 Windows。官方网址SQLiteStudio。

在这里插入图片描述
在这里插入图片描述

五、Go 语言使用 SQLite 数据库

1、安装 go-sqlite3

  在安装go-sqlite3之前,需要先安装SQLite数据库,在Golang中通过 go get 命令安装 go-sqlite3:

go get github.com/mattn/go-sqlite3

2、安装 mingw64

  在实践中我们发现,只安装 go-sqlite3 是不可以的,无法和数据库建立连接,会报以下错误:

# github.com/mattn/go-sqlite3
cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in %PATH%

  报错意思是缺少 gcc 环境,我们需要装一个 gcc 环境。因为 go里面使用sqlite,实际上是要下载sqlite的源代码编译的,当然,使用的时候不用手动编译,在linux中,gcc 如果已经安装了,是不用担心的,但是在windows中,为了支持编译,必须使用 mingw64。下载后缀为 posix-seh 的,mingw64下载地址。

在这里插入图片描述

  解压下载好的文件放置任一目录,随后将 bin 目录添加进 path 环境变量中,打开 cmd ,输入 gcc -v ,如正确显示版本号则安装成功,然后重启 goland 即可。

  如果你发现在 cmd 中已经能够找到 gcc 命令,但是goland 中执行程序还是找不到的话,那么多半就是 goland 的环境变量还未刷新,重启电脑、或者清空goland全部缓存并重启,即可解决。

在这里插入图片描述

3、连接数据库

package main

import (
	"database/sql"
	"fmt"
	// 导入包,导入前缀为下划线,则init函数被执行,然后注册驱动。
	_ "github.com/mattn/go-sqlite3"
	"log"
)

var db *sql.DB
var err error

func main() {
	// Open() 函数指定驱动名称和数据源名称
	db, err = sql.Open("sqlite3", "data.db")
	if err != nil {
		fmt.Printf("Database creation failed: %v\n", err)
		return
	}
	// 调用db.Close() 函数,确保关闭数据库并阻止启动新的查询
	defer db.Close()

	var version string
	// QueryRow() 执行查询,返回版本号
	err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version)
	if err != nil {
		fmt.Printf("Database creation failed: %v\n", err)
		return
	}
	// 连接成功,打印出"database connected:版本号"
	fmt.Printf("Database creation successful: %v\n", version)
}

在这里插入图片描述

4、创建数据表

package main

import (
	"database/sql"
	"fmt"
	// 导入包,导入前缀为下划线,则init函数被执行,然后注册驱动。
	_ "github.com/mattn/go-sqlite3"
)

func main() {
	// Open() 函数指定驱动名称和数据源名称
	db, err = sql.Open("sqlite3", "data.db")
	if err != nil {
		fmt.Printf("Database creation failed: %v\n", err)
		return
	}
	// 调用db.Close() 函数,确保关闭数据库并阻止启动新的查询
	defer db.Close()

	connectDB()
	createTable()
}

var db *sql.DB
var err error

// 连接数据库
func connectDB() {
	var version string
	// QueryRow() 执行查询,返回版本号
	err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version)
	if err != nil {
		fmt.Printf("Database creation failed: %v\n", err)
		return
	}
	// 连接成功,打印出"database connected:版本号"
	fmt.Printf("Database creation successful: %v\n", version)
}

// 创建数据库表
func createTable() {
	// 建表语句
	sts := `
    CREATE TABLE express_orders (
        id INTEGER PRIMARY KEY NOT NULL,
        uid INTEGER NOT NULL,
        weight DOUBLE NOT NULL,
        created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
    );`

	// 使用db.Exec() 函数来执行 SQL 语句
	_, err = db.Exec(sts)
	if err != nil {
		fmt.Printf("Failed to create database table: %v\n", err)
		return
	}
	fmt.Printf("Successfully created database table! \n")
}

在这里插入图片描述

5、插入数据

package main

import (
	"database/sql"
	"fmt"
	// 导入包,导入前缀为下划线,则init函数被执行,然后注册驱动。
	_ "github.com/mattn/go-sqlite3"
)

func main() {
	// Open() 函数指定驱动名称和数据源名称
	db, err = sql.Open("sqlite3", "data.db")
	if err != nil {
		fmt.Printf("Database creation failed: %v\n", err)
		return
	}
	// 调用db.Close() 函数,确保关闭数据库并阻止启动新的查询
	defer db.Close()

	connectDB()
	insert(1, 0.81192)
}

var db *sql.DB
var err error

// 连接数据库
func connectDB() {
	var version string
	// QueryRow() 执行查询,返回版本号
	err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version)
	if err != nil {
		fmt.Printf("Database creation failed: %v\n", err)
		return
	}
	// 连接成功,打印出"database connected:版本号"
	fmt.Printf("Database creation successful: %v\n", version)
}

// 插入数据
func insert(uid int, weight float64) {
	// 插入语句
	res, err := db.Exec("INSERT INTO express_orders(uid, weight) VALUES(?,?)", uid, weight)
	if err != nil {
		fmt.Printf("Insert data failed: %v\n", err)
		return
	}

	// 获取自增ID
	lastInsertId, _ := res.LastInsertId()
	fmt.Printf("Successfully inserted data, lastInsertId =  %v\n", lastInsertId)
}

在这里插入图片描述

6、查询数据

package main

import (
	"database/sql"
	"fmt"
	// 导入包,导入前缀为下划线,则init函数被执行,然后注册驱动。
	_ "github.com/mattn/go-sqlite3"
)

func main() {
	// Open() 函数指定驱动名称和数据源名称
	db, err = sql.Open("sqlite3", "data.db")
	if err != nil {
		fmt.Printf("Database creation failed: %v\n", err)
		return
	}
	// 调用db.Close() 函数,确保关闭数据库并阻止启动新的查询
	defer db.Close()

	connectDB()
	ret := query(1)
	fmt.Println(ret)
}

var db *sql.DB
var err error

// 连接数据库
func connectDB() {
	var version string
	// QueryRow() 执行查询,返回版本号
	err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version)
	if err != nil {
		fmt.Printf("Database creation failed: %v\n", err)
		return
	}
	// 连接成功,打印出"database connected:版本号"
	fmt.Printf("Database creation successful: %v\n", version)
}

// 查询数据
func query(uid int) (weightList []float64) {
	// 结果重量集合
	weightList = make([]float64, 0)

	// 查询语句
	rows, err := db.Query("SELECT weight FROM express_orders WHERE uid = ?", uid)
	if err != nil {
		fmt.Printf("Failed to query data: %v\n", err)
		return
	}
	for rows.Next() {
		var weight float64
		err = rows.Scan(&weight)
		if err != nil {
			fmt.Printf("Failed to read data: %v\n", err)
			continue
		}
		weightList = append(weightList, weight)
	}
	return weightList
}

在这里插入图片描述

六、实践(运费清单计算和测试程序)

在这里插入图片描述

问题 1 代码如下:

package main

import (
	"fmt"
	"math"
)

func main() {
	var weight float64
	fmt.Print("请输入实际重量(单位:KG):")
	fmt.Scanf("%f", &weight)
	if weight > 0 && weight <= 100 {
		fee := compute(weight)
		fmt.Printf("快递费用为 %d 元。\n", fee)
	} else {
		fmt.Println("实际重量输入错误!!!")
	}
}

// 计算快递费用
func compute(number float64) int {
	// 快递费用
	fee := 0
	// 计费重量,实际重量向上取整
	weight := int(math.Ceil(number))

	// 计算费用
	switch weight == 1 {
	case false:
		newFee := float64(18)
		for i := 2; i <= weight; i++ {
			newFee = 5 + newFee*1.01
		}
		newFee = math.Round(newFee)
		fee = int(newFee)
	default:
		fee = 18
	}
	return fee
}

测试:输入0
在这里插入图片描述
测试:输入0.81192
在这里插入图片描述
测试:输入2.996
在这里插入图片描述
测试:输入99.99
在这里插入图片描述
测试:输入100
在这里插入图片描述

测试:输入101
在这里插入图片描述

问题 2 :

生成数据的代码:

package main

import (
	"database/sql"
	"fmt"
	"math/rand"
	"sort"
	"sync"

	// 导入包,导入前缀为下划线,则init函数被执行,然后注册驱动。
	_ "github.com/mattn/go-sqlite3"
)

var db *sql.DB
var err error

func main() {
	db, err = sql.Open("sqlite3", "data.db")
	if err != nil {
		fmt.Printf("Database creation failed: %v\n", err)
		return
	}
	// 调用db.Close() 函数,确保关闭数据库并阻止启动新的查询
	defer db.Close()

	// 连接数据库
	connectDB()

	// 创建数据库表
	//createTable()

	// 生成 1000 个用户 id
	createUid()

	var wg sync.WaitGroup
	wg.Add(10)

	// 创建 10 个协程,同时往数据库里插数据
	for i := 0; i < 10; i++ {
		go func() {
			// 生成 100000 条订单记录并插入数据库中
			createRecords()
		}()
	}
	wg.Wait()

}

// 用户 id
var uidList = make([]int, 1000)

// 生成 1000 个用户 id
func createUid() {
	for i := 0; i < 1000; i++ {
		uidList[i] = i + 1
	}
}

// 生成 100000 条订单记录并插入数据库中
func createRecords() {

	// 值数组
	valueList := make([]int, 100)
	// 权重数组
	weightList := make([]float64, 100)
	for i := 0; i < 100; i++ {
		valueList[i] = 100 - i
		// 权重递增排序
		weightList[i] = 1 / float64(100-i)
	}

	// 加权
	totals := make([]float64, 100)
	// 总权重
	weightTotal := float64(0)
	for i, weight := range weightList {
		weightTotal += weight
		totals[i] = weightTotal
	}
	// 插入 10000 条订单记录
	for i := 0; i < 10000; i++ {
		// 生成一个 1000 以内的整形随机数(包含 0 )
		n := rand.Intn(1000)
		// 取用户 id
		uid := uidList[n]

		// 使用总权重获取随机数,避免超过范围,随机生成的数需要排除0,故加 0.01
		num := rand.Float64()*weightTotal + 0.01
		// 核心点,使用二分法,找到对应的下标,如果没有则为大于该数的+1 下标,可能为len(a)即数组长度
		index := sort.SearchFloat64s(totals, num)
		// 根据下标去值数组中取数,放到结果数组中
		weight := valueList[index%100]
		insert(uid, weight)
	}
}

// 连接数据库
func connectDB() {
	var version string
	// QueryRow() 执行查询,返回版本号
	err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version)
	if err != nil {
		fmt.Printf("Database creation failed: %v\n", err)
		return
	}
	// 连接成功,打印出"database connected:版本号"
	fmt.Printf("Database creation successful: %v\n", version)
}

// 创建数据库表
func createTable() {
	// 建表语句
	sts := `
    CREATE TABLE express_orders (
        id INTEGER PRIMARY KEY NOT NULL,
        uid INTEGER NOT NULL,
        weight DOUBLE NOT NULL,
        created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
    );`

	// 使用db.Exec() 函数来执行 SQL 语句
	_, err = db.Exec(sts)
	if err != nil {
		fmt.Printf("Failed to create database table: %v\n", err)
		return
	}
	fmt.Printf("Successfully created database table! \n")
}

// 插入数据
func insert(uid int, weight int) {
	// 插入语句
	res, err := db.Exec("INSERT INTO express_orders(uid, weight) VALUES(?,?)", uid, weight)
	if err != nil {
		fmt.Printf("Insert data failed: %v\n", err)
		return
	}

	// 获取自增ID
	lastInsertId, _ := res.LastInsertId()
	fmt.Printf("Successfully inserted data, lastInsertId =  %v\n", lastInsertId)
}

在这里插入图片描述

查询功能的代码:

package main

import (
	"database/sql"
	"fmt"
)

type order struct {
	id         int
	uid        int
	weight     float64
	createTime string
}

func main() {
	var uid int
	fmt.Print("请输入 1 个用户 id:")
	fmt.Scanf("%f", &uid)
	db, err = sql.Open("sqlite3", "data.db")
	if err != nil {
		fmt.Printf("Database creation failed: %v\n", err)
		return
	}
	// 调用db.Close() 函数,确保关闭数据库并阻止启动新的查询
	defer db.Close()
	
	weightList := query(uid)
	fmt.Println(weightList)
	cost := 0
	for _, val := range weightList {
		fee := compute(val.weight)
		cost += fee
	}
	fmt.Printf("该用户总的快递费用为 %d 元。\n", cost)
}

// 查询数据
func query(uid int) (weightList []order) {

	// 结果重量集合
	weightList = make([]order, 0)

	// 查询语句
	rows, err := db.Query("SELECT weight FROM express_orders WHERE uid = ?", uid)
	if err != nil {
		fmt.Printf("Failed to query data: %v\n", err)
		return
	}
	defer rows.Close()

	fmt.Println(rows.Next())
	fmt.Println(rows.Columns())
	for rows.Next() {
		var id int
		var weight float64
		var createTime string
		err = rows.Scan(&id, &uid, &weight, &createTime)
		if err != nil {
			fmt.Printf("Failed to read data: %v\n", err)
			continue
		}
		fmt.Println(id, uid)
		orderRow := order{id: id, uid: uid, weight: weight, createTime: createTime}
		weightList = append(weightList, orderRow)
	}
	return weightList
}

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python百分比怎么算?-从基础到逐层深入

Python百分比怎么算&#xff1f; - 从基础到逐层深入 Python是目前全球最流行的编程语言之一&#xff0c;由于其易学易用的特点&#xff0c;广泛地应用于数据处理、Web开发、自动化测试等不同领域。当我们需要对一些数据进行计算和分析时&#xff0c;经常需要对百分比进行计算…

Linux第二天

上传 scp -r 本地文件路劲 用户名目标主机地址&#xff1a;路径 下载&#xff1a;scp -r 用户名目标主机地址&#xff1a;路径 本地目录 ls -A /root //查看root文件下所有的隐藏文件 命令&#xff1a;ls 选项&#xff1a; -l&#xff1a;查看文件属性 -h&#xff1a;文…

【Python】继承与多态

知识目录 一、写在前面✨二、继承三、多态四、Account和FreeChecking类的实现五、总结撒花&#x1f60a; 一、写在前面✨ 大家好&#xff01;我是初心&#xff0c;希望我们一路走来能坚守初心&#xff01; 今天跟大家分享的文章是 Python中的继承与多态 &#xff0c;希望能帮…

在windows下安装linux和kali子系统

目录 安装子系统 报错解决官方方法 步骤 1 - 启用适用于 Linux 的 Windows 子系统 步骤 2 - 检查运行 WSL 2 的要求 步骤 3 - 启用虚拟机功能 步骤 4 - 下载 Linux 内核更新包 步骤 5 - 将 WSL 2 设置为默认版本 步骤 6 - 安装所选的 Linux 分发 排查安装问题 下载发行…

【JavaSE】Java基础语法(二十一):内部类

文章目录 1. 内部类的基本使用2. 成员内部类3. 局部内部类4. 匿名内部类5. 匿名内部类在开发中的使用&#xff08;应用&#xff09; 1. 内部类的基本使用 内部类概念 在一个类中定义一个类。举例&#xff1a;在一个类A的内部定义一个类B&#xff0c;类B就被称为内部类 内部类定…

YOLOv8目标检测实战:Android手机部署 (视频课程)

课程链接&#xff1a;https://edu.csdn.net/course/detail/38595 YOLOv8 目标检测基于先前 YOLO 版本的成功&#xff0c;引入了新功能和改进&#xff0c;进一步提升了性能和灵活性。 本课程在Windows上手把手演示YOLOv8&#xff08;YOLOv8n和YOLOv8s&#xff09;目标检测在An…

jvm 分析调优工具-学习笔记

jvm 分析调优工具 jps命令查看java进程pid jps 列出java进程名(不完整类名) 和pid jps -l 列出java进程名(完整类名) 和pid jmap命令查看java进程占用的jvm资源情况 jmap -histo pid 查看内存情况 jmap -heap pid 查看java程序的堆占用信息 jmap -dump 导出heap快照分析文件he…

22 VueComponent 响应式处理

前言 这是最近的碰到的那个 和响应式相关的问题 特定的操作之后响应式对象不“响应“了 引起的一系列的文章 主要记录的是 vue 的相关实现机制 呵呵 理解本文需要 vue 的使用基础, js 的使用基础 测试用例 测试用例如下, 一个简单的 按钮事件的触发 问题的调试 数据…

老macbook升级新版本(Big sur、Monterey)

老macbook升级新版本&#xff08;Big sur、Monterey&#xff09; 一、前期须知以及准备1.摘要2.设备3.升级方法3.前期准备 二、引导U盘的搭建1.下载安装程序2.U盘格式问题3.下载系统镜像并写入U盘 三、系统安装结束语 一、前期须知以及准备 1.摘要 对于老版本的macbook一系列…

代码随想录训练营Day53| 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划

目录 学习目标 学习内容 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划 学习目标 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划 学习内容 1143.最长公共子序列 1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09;ht…

PS磨皮插件免费电脑版Portraiture4.03下载及使用教程

Portraiture是一款智能磨皮插件&#xff0c;为Photoshop和Lightroom添加一键磨皮美化功能&#xff0c;快速对照片中皮肤、头发、眉毛等部位进行美化&#xff0c;Portraiture 4用于人像图片润色&#xff0c;磨皮等&#xff0c;减少了人工选择图像区域的重复劳动。它能智能地对图…

chatgpt赋能python:如何在Python中输入字符

如何在Python中输入字符 Python是一种非常流行的编程语言&#xff0c;它被广泛应用于各种领域&#xff0c;包括Web开发、人工智能、数据分析、科学计算等。在Python中输入字符是一项基本的操作&#xff0c;本文将介绍常见的输入字符方式以及注意事项。 使用input()函数输入字…

[数据结构] AVL树的插入旋转 和 概念理解

文章目录 定义 && 性质定义性质 实现思路架构节点AVL树框架Insert&#xff08;插入&#xff09;左单旋右单旋左右双旋右左双旋 定义 && 性质 定义 二叉搜索树虽可以缩短查找的效率&#xff0c;但 如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c…

初学Qt(Day04)

今日目标 创建一个类似游戏手柄的窗口&#xff0c;每次鼠标点击拖动手柄&#xff0c;在qt开发界面输出坐标&#xff0c;每当松开鼠标&#xff0c;手柄自动复位。 目标是实现类似下面这种 先说结论&#xff08;免得我又忘记了&#xff09;&#xff1a;没写完&#xff0c;是一…

Makefile基础教学(include的使用方法)

文章目录 前言一、include在makefile中的概念介绍二、include使用示例三、include中需要注意的一些操作1. 在include前加-选项2. include触发规则创建了文件会发生什么3. include包含的文件夹存在 总结 前言 本篇文章将讲解include的使用方法&#xff0c;在C语言中使用include…

chatgpt赋能python:Python与SEO的奇妙关系

Python与SEO的奇妙关系 SEO(Search Engine Optimization)&#xff0c;中文翻译为搜索引擎优化&#xff0c;是指通过对网站进行各种技术和内容方面的优化&#xff0c;来提升网站在搜索引擎自然排名中的位置&#xff0c;进而吸引更多的潜在客户。而Python语言&#xff0c;则成为…

jQuery-attr()、val()、add()属性和each函数

<!DOCTYPE HTML> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <title>jQuery-attr()、add()属性和each函数</title> <script type"text/j…

[数据集][目标检测]数据集VOC格式绝缘子缺陷检测数据集VOC-4086张

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;4086 标注数量(xml文件个数)&#xff1a;4086 标注类别数&#xff1a;3 标注类别名称:["jueyuanzi",&…

25 VueComponent 的生命周期

前言 这是最近的碰到的那个 和响应式相关的问题 特定的操作之后响应式对象不“响应“了 引起的一系列的文章 主要记录的是 vue 的相关实现机制 呵呵 理解本文需要 vue 的使用基础, js 的使用基础 测试用例 测试用例如下, 一个简单的 按钮事件的触发 问题的调试 这里…

Linux——网络套接字3|Tcp客户端编写②

根据我们前面写的服务器,server端需要绑定,而client要不要bind呢? 不需要,因为客户端一旦和一个非常具体的端口号绑定,可能会导致端口号绑定多个客户端,因此可能会出现某个客户端无法启动。而服务器需要明确的端口号,因为服务器面对的是众多的客户端,服务器端口号一旦被…