python ---使用python操作mysql ---> pymysql

本章内容:

1:能够完成从MySQL中读取出数据; [重点]
    查询: execute()、fetchall()


2:能够将数据写入MySQL数据库。 [重点]
    插入数据: execute()  sql = insert into xxx

[掌握]pymysql模块的安装

==目标:==了解如何安装pymysql模块?

当要使用Python和MySQL数据库进行交互,需要借助一个第三方模块:pymysql。

在使用pymysql模块前,先进行安装:

pip install pymysql

有时使用pip install xxx命令安装时较慢,若要提升pip下载的速度,可采用命令:

在终端安装

pip install 模块名 [-i 镜像源地址]
pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pymysql -i http://mirrors.aliyun.com/pypi/simple/

比如,在国内的镜像源中,有很多可供使用的源地址:

镜像来源镜像源地址
豆瓣http://pypi.douban.com/simple/
阿里云Simple Index
清华大学Simple Index
中国科技大学Simple Index
华中理工大学http://pypi.hustunique.com/
山东理工大学Loading...

当成功安装pymysql模块后,可直接导入使用:

# 导入模块
import pymysql

例如,一起来完成:

(1)在Python中,使用命令安装pymysql模块;

(2)当成功安装模块后,即可导入并验证是否已成功安装;

(3)思考:还有其他方式安装模块吗?

 

==总结:==

(1)当要在Python中安装pymysql模块,可以使用()命令;==A、pip install pymsql==;B、install pymysql;

(2)注意:当要使用pymysql模块时,可以直接导入使用,语法:import pymysql。

[了解]pymysql的操作步骤

==目标:==了解pymysql的操作步骤。

在Python中,使用pymysql模块来操作MySQL数据的基本步骤

对于图解,操作步骤说明:

(1)导入模块;
(2)创建连接对象;
(3)创建游标对象;
(4)使用游标对象执行SQL并进行增删改查;
(5)关闭游标对象;
(6)关闭连接对象。

例如,一起来了解:

(1)操作pymysql模块的基本步骤;

(2)对各个步骤做详细说明。

==详细步骤:== 用户名  密码   ip地址使用自己的

(1)导入模块;
	导入模块前, 优先安装pymysql模块: pip install pymysql
	import pymysql
	# 使用模块操作MySQL数据库
----------------------------------
(2)创建连接对象;
	db_conn = pymysql.connect()
		# 用户名 root
		# 密码 123456
		# IP地址 127.0.0.1    localhost 
		# 端口号 3306
		# 数据库名 班级名_db_xxx
		# 编码格式 utf8   gbk
----------------------------------
(3)创建游标对象;
	db_cursor = db_conn.cursor()
		# 游标获取数据
----------------------------------
(4)使用游标对象执行SQL并进行增删改查;
	db_cursor.execute(xxxx)
		# 增 insert into 表名[(字段1, 字段2, ...)] values(值1, 值2,...)[,(值1, 值2,...),...][;]
		# 删 delete from 表名 [where 条件];
		# 改 update 表名 set 字段1=值1[, 字段2=值2, ...] [where 条件];
		# 查 select *[字段1, 字段2, ...] from 表名 [where 条件];
----------------------------------
(5)关闭游标对象;
	close()
----------------------------------
(6)关闭连接对象。
	close()

==总结:==

(1)当操作完pymysql后,需要对连接、游标等对象资源进行关闭,可以使用()方法;A、exit();==B、close();==

(2)注意:为了便于使用和操作pymysql模块,建议按照操作步骤来进行处理。

[了解]connection对象

==目标:==了解connection对象的常用方法。

我们都知道,在使用MySQL数据库前,首先需要登录并进行连接。[命令行、DataGrip]

类似地,在使用pymysql模块时,也需要登录并进行连接,且此时需要使用connection对象。

connection是用于建立与数据库的连接,需要使用pymysql模块来调用:

函数含义
connect(host=None, port=0, user=None, password="", database=None, charset='',...)用于创建Connection连接对象。 ①host:表示连接MySQL的IP地址。若为本机,则可表示成'localhost'或'127.0.0.1';若为其他计算机,则表示为具体IP地址; ②port:表示连接的MySQL的端口号,默认是3306; ③user:表示连接的用户名,默认是root; ④password:表示连接的密码; ⑤database:表示数据库的名称; ⑥charset:表示采用的编码方式,设定为'utf8'即可。

当成功通过connect()获取并得到连接对象后,常用函数:

函数含义
commit()用于事务提交,在进行数据操作时需要进行事务提交后才会生效。
close()用于关闭连接。
cursor()用于返回cursor对象,可使用该对象来执行SQL语句并获取结果。

说明:

(1)使用pymysql模块时,已默认开启了事务,因此要让数据操作生效,则必须要进行事务提交;

(2)为了节约系统内存资源,通常在使用完Connection连接对象后,要进行close()关闭连接。

==总结:==

(1)通常情况下,使用pymysql连接MySQL数据库,需要知道:IP地址、()、用户名、密码;==A、端口号==;B、权限

(2)注意:pymysql模块操作MySQL是默认已经开启了事务。

[了解]cursor对象

==目标:==了解cursor对象的常用方法。

若要执行SQL语句时,则需要使用cursor对象,可通过connection对象的cursor()方法进行创建。

函数含义
cursor()用于返回cursor对象,可使用该对象来执行SQL语句并获取结果。

当有了cursor对象后,常用函数:

函数含义
execute(operate [, param])用于执行SQL语句,返回受影响的行数。 其中,参数operate为字符串类型,表示SQL语句; 参数parameters为列表类型,表示SQL语句中的参数。
fetchone()在执行查询语句时,获取查询结果集的第一行数据,返回一个元组,即(v1, v2,...)。
fetchall()在执行查询时,获取结果集的所有行,返回一个元组,即((v11, v12,...), (v21, v22,...),...)。
close()关闭cursor对象。

说明:

(1)使用execute()执行SQL语句时,SQL语句应写成字符串型;

(2)当关闭connection和cursor对象时,记得先关闭cursor游标,后关闭connection连接。

==总结:==

(1)当要使用cursor游标对象来执行SQL语句时,可以使用()方法;A、catch();==B、excute();==

(2)注意:在使用pymysql执行SQL语句时,要使用cursor对象来操作。

数据记录操作

[了解]准备数据表

==目标:==完成数据表的准备工作。

通常情况下,在使用pymysql模块前,会先创建好数据库和数据表字段信息。

这样,可以更便于后期操作。

例如,使用MySQL命令完成:

(1)创建一个班级db_students数据库,并设定为utf8编码;

(2)在库中新建一个数据表,包含编号id、姓名name、性别gender、年龄age等字段;

(3)其中,字段编号id为整型、主键且自动增长;

(4)操作完成后,查看表结构,并查看表内是否有数据内容。

######################新建库和表#############################
# 创建库
create database if not exists zz20db_students charset utf8;
# 使用库
use zz20db_students;
# 查看表信息
show tables;
# 创建表
create table if not exists student(
    id int primary key auto_increment,
    name varchar(20),
    gender varchar(10),
    age int
) engine = InnoDB default charset utf8;
# 查看表字段
desc student;
# 查看表数据
select * from student;

==总结:==

(1)在操作pymysql前,请记得先创建好数据表,便于后面的程序执行。

[掌握]插入数据

==目标:==掌握pymysql模块插入数据的使用。

当已成功创建好了数据库和数据表,就可以使用pymysql来给表内添加数据了。使用函数:

函数含义
execute(operate [, param])用于执行SQL语句,返回受影响的行数。 其中,参数operate为字符串类型,表示SQL语句; 参数parameters为列表类型,表示SQL语句中的参数。

说明:

param参数是可选项。

例如,使用pymysql模块来完成:

(1)使用execute()向学生表中插入1条学生数据;

(2)使用DataGrip查看添加成功后的数据结果;

(3)思考:如果要插入两条数据,该怎么做呢?

# 1、导入模块
import pymysql

# 2、创建连接对象
conn = pymysql.connect(
    host='192.168.88.100',
    port=3306,
    user='root',
    password='123456',
    database= 'zz20db_students',
    charset='utf8'
)
print(conn)  # 测试一下服务器是否联通

# 3、获取游标
db_cursor = conn.cursor()

# 4、使用游标来执行sql
result = db_cursor.execute("insert into student(name,gender,age) values ('刘备','男',23)")
print(result) # 返回影响的行数

# 5、增删改之后,一定要让操作生效,必须要提交事务,否则不生效
conn.commit()

# 6、关闭游标对象;
db_cursor.close()

# 7、关闭连接对象。
conn.close()

==总结:==

(1)当使用pymysql模块插入数据,必须使用()方法提交事务;A、submit();==B、commit();==

(2)注意:使用PyCharm编写程序插入数据成功后,可以到DataGrip中查看是否已成功添加数据。

[掌握]修改数据

==目标:==掌握execute()修改数据的使用。

当数据显示有误时,就需要来修改数据内容。使用函数:

函数含义
execute(operate [, param])用于执行SQL语句,返回受影响的行数。 其中,参数operate为字符串类型,表示SQL语句; 参数parameters为列表类型,表示SQL语句中的参数。

说明:

param参数是可选项。

例如,使用pymysql模块来完成:

(1)使用execute()修改学生表中id为1的数据,并把年龄修改为19岁,姓名修改为王军;

(2)使用DataGrip查看修改成功后的数据结果;

(3)思考:能否把性别为男的所有数据,性别都修改为Male呢?

# 1、导入模块
import pymysql

# 2、创建连接对象
conn = pymysql.connect(
    host='192.168.88.100',
    port=3306,
    user='root',
    password='123456',
    database= 'zz20db_students',
    charset='utf8'
)
print(conn)  # 测试一下服务器是否联通

# 3、获取游标
db_cursor = conn.cursor()

# 4、使用游标来执行sql
result = db_cursor.execute("""
    update student set name = '大乔' where id = 4
    """)
print(result) # 返回影响的行数

# 5、增删改之后,一定要让操作生效,必须要提交事务,否则不生效
conn.commit()

# 6、关闭游标对象;
db_cursor.close()

# 7、关闭连接对象。
conn.close()

==总结:==

(1)当使用pymysql模块修改数据,要使用commit()方法进行提交事务;

(2)注意:若要修改数据表的数据内容,必须先已存在该数据。

[掌握]删除数据

==目标:==掌握如何使用execute()删除数据。

当数据内容已失效时,就需要来删除数据内容。使用函数:

函数含义
execute(operate [, param])用于执行SQL语句,返回受影响的行数。 其中,参数operate为字符串类型,表示SQL语句; 参数parameters为列表类型,表示SQL语句中的参数。

说明:

param参数是可选项。

例如,使用pymysql模块来完成:

(1)使用execute()删除学生表中id为2的这条数据;

(2)使用DataGrip查看删除成功后的数据结果;

(3)思考:目前,使用execute()操作数据时,都采用硬编码方式,会存在什么问题吗?

# 1、导入模块
import pymysql

# 2、创建连接对象
conn = pymysql.connect(
    host='192.168.88.100',
    port=3306,
    user='root',
    password='123456',
    database= 'zz20db_students',
    charset='utf8'
)
print(conn)  # 测试一下服务器是否联通

# 3、获取游标
db_cursor = conn.cursor()

# 4、使用游标来执行sql
result = db_cursor.execute("""
    delete from student where name = '曹操'
    """)
print(result) # 返回影响的行数

# 5、增删改之后,一定要让操作生效,必须要提交事务,否则不生效
conn.commit()

# 6、关闭游标对象;
db_cursor.close()

# 7、关闭连接对象。
conn.close()

==总结:==

(1)当要删除数据记录时,应该使用()关键字;==A、delete==;B、drop;

(2)注意:使用pymysql模块删除数据时,也需要进行提交事务。

[了解]SQL注入

==目标:==了解什么是SQL注入?

SQL注入指的是:恶意篡改或注入SQL条件。

当开发者的数据条件若被恶意篡改,那就达不到预期的查询效果。

为了了解SQL注入是怎么回事?通过一个案例来分析。

例如,使用命令来完成:

(1)给学生表tb_student中添加一些数据,查看效果;

(2)查询age=22的这条数据的所有信息;

(3)使用SQL注入方式来恶意篡改查询条件,比如在条件结尾处,添加or 1=1,并查询结果;

(4)思考:对比两次查询结果,该如何解决这类SQL注入问题呢?

# 1、导入模块
import pymysql

# 2、创建连接对象
conn = pymysql.connect(
    host='192.168.88.100',
    port=3306,
    user='root',
    password='123456',
    database= 'zz20db_students',
    charset='utf8'
)
print(conn)  # 测试一下服务器是否联通

# 3、获取游标
db_cursor = conn.cursor()

input_id = input('请输入你要删除的id:')  # 从键盘输入: 88 or 1=1
# 4、使用游标来执行sql                   # 发现所有数据都被删除,因为or后边的条件永远成立,条件永远为真
result = db_cursor.execute(f"""
    delete from student where id = {input_id}   
    """)
print(result) # 返回影响的行数

# 5、增删改之后,一定要让操作生效,必须要提交事务,否则不生效
conn.commit()

# 6、关闭游标对象;
db_cursor.close()

# 7、关闭连接对象。
conn.close()

==总结:==

(1)恶意篡改或注入新的SQL条件的行为叫做();==A、SQL注入==;B、SQL添加;

(2)注意:当恶意篡改了SQL条件后,查询的结果可能达不到预期效果。

[掌握]语句参数化

==目标:==掌握语句参数化的使用。

如果要解决SQL注入的问题,在pym

语句参数化是指以%s表示值,然后再传入具体的参数值进行替换。

为了更好理解语句参数化,可以把SQL语句的参数化、值,简要地理解为print()函数中的格式化符号输出:

print("xxx%s, xxx%d"%(name, age))

要使用cursor对象的函数:

函数含义
execute(operate, param)用于执行SQL语句,返回受影响的行数。 其中,参数operation为字符串类型,表示具体的SQL语句,注意,若在SQL语句中要向外传入参数值,则该参数均使用%s表示; 参数parameters为列表类型,表示SQL语句中的参数。

说明:

param参数的类型是列表list。

例如,使用pymysql模块来完成:

(1)通过键盘录入的方式输入变化的数据值;

(2)使用语句参数化和execute()给数据表添加一条数据内容;

(3)操作完成后,使用DataGrip查看添加成功后的数据结果。

# 1、导入模块
import pymysql

# 2、创建连接对象
conn = pymysql.connect(
    host='192.168.88.100',
    port=3306,
    user='root',
    password='123456',
    database= 'zz20db_students',
    charset='utf8'
)
print(conn)  # 测试一下服务器是否联通

# 3、获取游标
db_cursor = conn.cursor()

input_id = input('请输入你要删除的id:')  # 从键盘输入: 88 or 1=1
params = [input_id]
# 不管你从键盘输入什么都会当做普通字符串赋值给%s,id = '88 or 1=1'  -以前--> id = 88 or 1=1
sql= "delete from student where id =  %s "  
# 4、使用游标来执行sql                  
result = db_cursor.execute(sql,params)

print(result) # 返回影响的行数

# 5、增删改之后,一定要让操作生效,必须要提交事务,否则不生效
conn.commit()

# 6、关闭游标对象;
db_cursor.close()

# 7、关闭连接对象。
conn.close()
# 1、导入模块
import pymysql

# 2、创建连接对象
conn = pymysql.connect(
    host='192.168.88.100',
    port=3306,
    user='root',
    password='123456',
    database= 'zz20db_students',
    charset='utf8'
)
print(conn)  # 测试一下服务器是否联通

# 3、获取游标
db_cursor = conn.cursor()

param = ['张飞','男',33]
sql = 'insert into student(name,gender,age) values (%s,%s,%s)'
result = db_cursor.execute(sql, param)


print(result) # 返回影响的行数

# 5、增删改之后,一定要让操作生效,必须要提交事务,否则不生效
conn.commit()

# 6、关闭游标对象;
db_cursor.close()

# 7、关闭连接对象。
conn.close()

==总结:==

(1)请问:语句参数化时,必须使用%s表示参数,这句话正确吗?==A、正确==;B、错误;

(2)注意:要进行语句参数化时,使用execute()方法时需要传递两个参数。

[掌握]查询数据

==目标:==掌握pymysql查询数据操作。

查询数据,要使用cursor对象的函数:

函数含义
execute(operate [, param])用于执行SQL语句,返回受影响的行数。 其中,参数operation为字符串类型,表示具体的SQL语句,注意,若在SQL语句中要向外传入参数值,则该参数均使用%s表示; 参数parameters为列表类型,表示SQL语句中的参数。
fetchone()在执行查询语句时,获取查询结果集的第一行数据,返回一个元组,即(v1, v2,...)。
fetchall()在执行查询时,获取结果集的所有行,返回一个元组,即((v11, v12,...), (v21, v22,...),...)。

说明:

查询的数据结果是元组类型。

例如,使用pymysql模块来完成:

(1)使用fetchone来查询一条某xx姓名的数据信息;

(2)使用fetchall()查询出所有数据信息,并遍历出详细信息。

# 1、导入模块
import pymysql

# 2、创建连接对象
conn = pymysql.connect(
    host='192.168.88.100',
    port=3306,
    user='root',
    password='123456',
    database= 'zz20db_students',
    charset='utf8'
)
print(conn)  # 测试一下服务器是否联通

# 3、获取游标
db_cursor = conn.cursor()


# 执行sql,进行查询
sql = 'select * from student'
db_cursor.execute(sql)

# 获取查询结果,获取一行
print(db_cursor.fetchone())

print('--------------------')
# 获取查询结果,获取多行,并遍历
result = db_cursor.fetchall()

for row2 in result:
    print(row2)
# 1、导入模块
import pymysql

# 2、创建连接对象
conn = pymysql.connect(
    host='192.168.88.100',
    port=3306,
    user='root',
    password='123456',
    database= 'zz20db_students',
    charset='utf8'
)
print(conn)  # 测试一下服务器是否联通

# 3、获取游标
db_cursor = conn.cursor()


# 执行sql,进行查询,男性,年龄大于20岁的学生信息
gender = input('请输入你要查询的性别: ')
age = input('请输入你要查询的年龄: ')

params = [gender,age]
sql = 'select * from student where gender = %s and age > %s'  # %s 表示占位符
db_cursor.execute(sql,params)

print('--------------------')
# 获取查询结果,获取多行,并遍历
result = db_cursor.fetchall()

for row2 in result:
    print(row2)

# 5、增删改之后,一定要让操作生效,必须要提交事务,否则不生效
conn.commit()

# 6、关闭游标对象;
db_cursor.close()

# 7、关闭连接对象。
conn.close()

==总结:==

(1)当要获取所有查询结果数据时,可以使用()方法;A、fetchone();==B、fetchall()==;

(2)注意:虽然查询数据无需提交事务,但还是建议提交一下,这样可以避免与CRUD的差异化。

注册与登录案例

[了解]注册

==目标:==了解注册用户的使用。

比如,在登录某网站前,是需要进行注册用户的。那么,注册是怎么做的呢?

其实,注册用户本质上就是给用户表添加一条数据。

例如,一起来完成:

(1)新建一个班级db_users数据库,编码为utf8;

(2)在库中新建一个用户表,字段有:编号id[主键自增]、用户名username、密码password;

(3)使用键盘录入数据的形式输入用户名、密码,并用于注册一个用户;

(4)使用DataGrip查看注册成功后的用户数据结果。

import pymysql

db_conn = pymysql.connect(
    host="localhost",
    port=3306,
    user="root",
    password="123456",
    database="sz38db_users",
    charset="utf8"
)
db_cursor = db_conn.cursor()
# 执行插入语句
in_name = input("请输入用户名:")
in_pwd = input("请输入密码:")
params = [in_name,in_pwd]
sql = "insert into tb_user(username,password) values(%s,%s)"
db_cursor.execute(sql,params)

# 提交事务
db_conn.commit()
db_cursor.close()
db_conn.close()
print("数据注册已结束!~~")

==总结:==

(1)当要注册用户时,本质上实现的是()功能;==A、插入数据==;B、查询数据;

(2)注意:使用pymysql模块操作注册功能时,记得进行语句参数化。

[掌握]登录

==目标:==掌握如何进行登录操作。

当成功注册用户信息后,则可以进行登录操作了。那么,登录是怎么做的呢?

其实,登录账户本质上就是:查询用户数据,并与用户手动输入的用户名和密码进行匹配。

当匹配成功,则可以登录;反之,则登录失败。

例如,一起来完成:

(1)使用键盘录入数据的形式输入用户名、密码,并用于登录操作;

(2)当登录时,使用的数据内容则是已注册成功的用户表信息;

(3)观察注册成功后的用户数据,当已匹配成功,则表示成功登录。

import pymysql

db_conn = pymysql.connect(
    host="localhost",
    port=3306,
    user="root",
    password="123456",
    database="sz38db_users",
    charset="utf8"
)
db_cursor = db_conn.cursor()
# 执行查询语句、匹配
sql = "select username,password from tb_user"
db_cursor.execute(sql)
query_result = db_cursor.fetchall()
print(query_result)

# 匹配
in_uname = input("请输入用户名:")
in_upwd = input("请输入密码:")
# for user in query_result:
for username,password in query_result:
    if in_uname == username and in_upwd == password:
        print(f"恭喜你,{username}, 已登录成功!!")
        break  # 跳出
else:
    print("登录失败!!!")

# 提交事务
db_conn.commit()
db_cursor.close()
db_conn.close()
print("数据注册已结束!~~")

# 需求:
# 1.根据上述sql无法知道是用户名或密码哪个出错了, 若要知道到底是哪个出错, 做新需求??   select username from tb_user where password=xx;
# 2.注册和登录账户时,应该要给密码加密处理? 做新需求?? -hashlib库   [MD5 =32位]  [SHA1 = 40位]  ==>学习: 是什么? 使用API?  实战开发?
# https://tool.lu/encdec/

# *3.验证码? 邮箱号、手机号等?  --新增字段、添加数据等??

==总结:==

(1)在Python中,如果要判断数据内容是否匹配成功可以使用()语句;==A、if==;B、where;

(2)注意:在实际应用中,登录和注册功能可能还会涉及到用户数据加密,比如MD5加密、SHA1加密等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作系统复习-存储管理之虚拟内存

虚拟内存概述 有些进程实际需要的内存很大,超过物理内存的容量。多道程序设计,使得每个进程可用物理内存更加稀缺。不可能无限增加物理内存,物理内存总有不够的时候。虚拟内存是操作系统内存管理的关键技术。使得多道程序运行和大程序运行称…

永久免费的iPhone,iPad,Mac,iWatch锁屏,桌面壁纸样机生成器NO.105

使用这个壁纸样机生成器,生成iPhone,iPad,Mac,iWatch锁屏,桌面壁纸,展示你的壁纸作品,一眼就看出壁纸好不好看,适不适合 资源来源于网络,免费分享仅供学习和测试使用&am…

【C语言初阶】分支语句

🌟博主主页:我是一只海绵派大星 📚专栏分类:C语言 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、什么是语句 二、if语句 悬空else 三、switch语句 default 四、switch语句与if-else语句性能对比如何&#xff1f…

【Python核心数据结构探秘】:元组与字典的完美协奏曲

文章目录 🚀一、元组⭐1. 元组查询的相关方法❤️2. 坑点🎬3. 修改元组 🌈二、集合⭐1. 集合踩坑❤️2. 集合特点💥无序性💥唯一性 ☔3. 集合(交,并,补)🎬4. …

手撕设计模式——克隆对象之原型模式

1.业务需求 ​ 大家好,我是菠菜啊,前俩天有点忙,今天继续更新了。今天给大家介绍克隆对象——原型模式。老规矩,在介绍这期之前,我们先来看看这样的需求:《西游记》中每次孙悟空拔出一撮猴毛吹一下&#x…

【电赛】STM32-PID直流减速电机小车【寻迹+避障+跟随】【更新ing】

一.需求分析 1.主控:STM32C8T6(没什么好说的哈哈) 2.电机:JAG25-370电机 【问】为什么要用直流减速电机?? PID控制器需要依靠精确的反馈信号来调整其输出,确保电机按照预定的速度和位置运行…

简单聊一下Oracle,MySQL,postgresql三种锁表的机制,行锁和表锁

MySQL: MySQL使用行级锁定和表级锁定。行级锁定允许多个会话同时写入表,适用于多用户、高并发和OLTP应用。表级锁定只允许一个会话一次更新表,适用于只读、主要读取或单用户应用。 比如mysql开启一个窗口执行 begin; update xc_county_a…

激光点云配准算法——Cofinet / GeoTransforme / MAC

激光点云配准算法——Cofinet / GeoTransformer / MAC GeoTransformer MAC是当前最SOTA的点云匹配算法,在之前我用总结过视觉特征匹配的相关算法 视觉SLAM总结——SuperPoint / SuperGlue 本篇博客对Cofinet、GeoTransformer、MAC三篇论文进行简单总结 1. Cofine…

jquery.datetimepicker无法添加清除按钮的问题

项目场景: 自从决定用现有新技术实现CRM老项目起,就开始了我的折腾之路,最近一直在折腾前端页面,不像后端Java,写的有问题运行会报错,大多数报错一搜就能找到解决方案,前端这个倒好&#xff0c…

【Qt】TreeWidget中Item的UserCheckable注意事项,没有出现多选框

1. 异常 开启 ItemIsUserCheckable以后,界面上没有出现多选框。 QTreeWidgetItem *item new QTreeWidgetItem();item->setText(0, "hello");item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsSelectable |Qt::ItemIsEnabled | Qt::ItemIsAuto…

Linux---防火墙

文章目录 目录 文章目录 前言 一.静态防火墙:iptables iptables五链 iptables 四表 iptables控制类型 iptables命令配置 前言 这儿主要介绍Linux系统本身提供的软件防火墙的功能,即数据包过滤机制。 数据包过滤,也就是分析进入主机的网络数…

k8s 1.28 搭建rabbitmq集群

1.环境 1.1 k8s 1.28 1.2 rabbit 3.8 1.3 工作空间default 1.4 注意,内存最好充足一点,因为我就两个节点一个master、一个node,起初我的node是8g,还剩3~4G,集群竟然一直起不来,后来将虚拟机内存扩大&#x…

刷机维修进阶教程-----红米k30 nv损坏故障 修复实例教程步骤解析

小米红米系列机型在米8起始就有了串码校验。不得随意更改参数限制。不同于其他机型,可以任意刷入同芯片的基带qcn来修复基带和串码丢失。米系列刷入同芯片基带qcn会提示nv损坏故障。是因为有串码校验。一般在于格机或者全檫除分区后写新参数出现的故障。 这种解决方法通常有两…

武忠祥17堂课没必要全听,这几个才是精华!

作者:Captain 链接:https://www.zhihu.com/question/381665751/answer/3197724055 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 17堂课类似于习题课,是专题训练 17堂课省略了…

fs.1.10 ON rockylinux8 docker镜像制作

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 rockylinux docker上编译安装fs1.10版本的流程记录。 环境 docker engine:Version 24.0.6 rockylinux docker:8 freeswitch:v1.10.7 手动模式 rockylinux准备 docker hub拉取r…

IPv4 子网掩码计算器—python代码实现

今天聊一下,我用python和vscode工具实现一个IPv4计算器的一些思路,以及使用Python编写IPv4计算器一些好处? 首先,一、Python语法简洁易读,便于理解和维护,即使对编程不熟悉的用户也能快速了解代码逻辑。其…

基于51单片机的车辆动态称重系统设计

一 动态称重 所谓动态称重是指通过分析和测量车胎运动中的力,来计算该运动车辆的总重量、轴重、轮重和部分重量数据的过程。动态称重系统按经过车辆行驶的速度划分,可分为低速动态称重系统与高速动态称重系统。因为我国高速公路的限速最高是120,所以高速动态称重系统在理论…

AI大模型探索之路-实战篇16:优化决策流程:Agent智能数据分析平台中Planning功能实践

系列篇章💥 AI大模型探索之路-实战篇4:深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5:探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6:掌握Function Calling的详细流程 AI大模型探索之路-实战篇7…

【机器学习系列】深入理解集成学习:从Bagging到Boosting

目录 一、集成方法的一般思想 二、集成方法的基本原理 三、构建集成分类器的方法 常见的有装袋(Bagging)和提升(Boosting)两种方法 方法1 :装袋(Bagging) Bagging原理如下图: …

使用SourceTree切换不同的托管平台

背景:sourcetree一开始绑定了gitee,想拉取github的项目时拉取不了 原因:git绑定的账号(邮箱)、密码不一致 解决办法: 重新设置账号密码 在windows种可找到下面的文件夹,进行删除 C:\Users\US…