连接mysql方式很多,这里先只介绍pymysql库连接mysql数据库。
1.安装pymysql
pip install pymysql -i
2. 建立mysql数据表
安装好mysql数据库之后,建立表并插入数据后如下:
表的结构:
3. 连接数据库
连接数据库使用pymysql库的connections模块中的Connection类。所以得调用Connection(参数)得到Connection对象。
方法1:
import pymysql
arg_kwargs={
'host':"localhost",
'port':3306,
'user':'root',
'password':"123456",
'database':"db01",
'charset':'utf8'
}
db=pymysql.connections.Connection(arg_kwargs)#pymysql.connections.Connection对象
print(db.dict)#{'_local_infile': False, 'ssl': False,//代码效果参考:http://hnjlyzjd.com/hw/wz_24713.html
'host': 'localhost', 'port': 3306, 'user': b'root',.............方法2:
如果不想使用方法1中的字典,可以直接给构造函数赋值,本质一样:
import pymysql
db=pymysql.connect(
host="localhost",
port=3306,
user='root',
password="123456",
database="db01",
charset='utf8'
)
4. Connection类详解
Connection类位于connections模块中,再看下面这个情况,发现以下这四种方法都可以:
db=pymysql.connections.Connection(arg_kwargs)#1
# db=pymysql.Connection(arg_kwargs)#2
# db=pymysql.Connect(arg_kwargs)#3
# db=pymysql.connect(arg_kwargs)#4
为什么呢?原因如下:
经过深入看代码,发现在pymysql库中的init.py文件中的第135行定义了Connect = connect = Connection = connections.Connection(看下图所示)。
而使用import pymysql时,先执行了init.py,所以以上四种相同。网上用的pymysql.connect(参数)较多,因为简单。
Connection构造函数又39个参数,这里只介绍常用的几个参数:
参数
传入类型
参数说明
host
str
MySQL服务器地址
port
int
MySQL服务器端口号
user
str
用户名
password
str
密码
database
str
数据库名称
charset
str
字符编码
collation
str
字符串校对规则
5. //代码效果参考:http://hnjlyzjd.com/hw/wz_24711.html
查询操作import pymysql
arg_kwargs={
'host':"localhost",
'port':3306,
'user':'root',
'password':"123456",
'database':"db01",
'charset':'utf8'
}
#1.连接数据库,并得到Connection对象
db=pymysql.connections.Connection(arg_kwargs)
#2.创建数据库的游标
cur=db.cursor()
#3.sql语句
sql="select bname,press,author from book;"
#4.执行sql语句(其实是将sql语句提交给mysql数据库执行,执行后返回结果)
try:
cur.execute(sql)#是一个可迭代对象,返回一个int类型,为Number of affected rows.
except Exception as e:
print(e)
#查询不需要rollback,因为select不需要commit
else:
print("sql执行成功")
finally:
cur.close()#先关闭cur
db.close()#再关闭db
如果需要获取一条数据或多条数据,可以使用下面的方法:
# 分别获取一条记录数据、多条记录、所有记录
one=cur.fetchone()
many=cur.fetchmany(2)
all=cur.fetchall()
如果需要给sql语句传入参数,可以如下:
sql2="select bname,press,author from book where price>%s;"#用%s
cur.execute(sql2,【100】)#第二个参数为占位符传值,为列表,列表里的第一个元素对应第一个%s,如果有多过个%s,一一对应
6. 插入操作
写操作,最后需要使用commit提交事务。
import pymysql
#1.连接数据库
db=pymysql.connect(
host="localhost",
port=3306,
user='root',
password="123456",
database="db01",
charset='utf8'
)
data=【('数学','张三','机械出版社',78,"2023-06-04","数学书"),('英语','李四','机械出版社',67,"2023-07-04","英语书"),('活着','余华','人民出版社',46,"2023-06-01","富贵的一生")】
#2.创建数据库的游标
cur=db.cursor()
#3.sql语句
sql="insert into book(bname,author,press,price,presstime,comment) values" \
"(%s,%s,%s,%s,%s,%s);"
#4.提交数据库
#写操作,需要使用commit提交到数据库
try:
cur.executemany(sql, data)
#或者使用下面代码
# for i in range(len(data)):
# cur.execute(sql,data【i】)
except Exception as e:
print(e)
db.rollback()#如果提交的sql执行错误,事务回滚
else:
#提交到数据库
db.commit()#事务提交,提交后,数据持久化到硬盘中,事务开启是默认开启的
finally:
# 5.关闭
cur.close()
db.close()
注意 cur.executemany(sql, data)一次性写入多条记录,cur.execute(sql,data【i】)一次写入一条记录。
7. 修改操作
import pymysql
arg_kwargs={
'host':"localhost",
'port':3306,
'user':'root',
'password':"123456",
'database':"db01",
'charset':'utf8'
}
db=pymysql.connections.Connection(arg_kwargs)#拆包,将字典拆成host="localhost" ......
#创建数据库的游标
cur=db.cursor()
try:
update_sql="update book set price=%s where bname=%s;"
cur.execute(update_sql, 【300,'二十年后'】) # 第二个参数为占位符传值
except Exception as e:
print(e)
db.rollback()
else:
#提交到数据库
db.commit()#事务提交,事务开启是默认开启的
finally:
# 5.关闭
cur.close()
db.close()
8. cur.executemany(参数)与cur.execute(参数)区别
看个例子(参考网上例子):
# coding:utf-8
import time
import pymysql
"""
1、每条数据都进行execute和commit
2、多次执行exectue,最后commit
3、使用executemany执行1次,然后commit1次
"""
arg_kwargs={
'host':"localhost",
'port':3306,
'user':'root',
'password':"123456",
'database':"db01",
'charset':'utf8'
}
con=pymysql.connections.Connection(**arg_kwargs)
#创建数据库的游标
cur=con.cursor()
sql = 'insert into test_table(num) values(%s);'
# 1、执行和提交10000次
def test1(i):
t1 = time.time()
for i in range(i):
try:
cur.execute(sql,【i】)
con.commit()
except Exception as e:
print(e)
con.rollback()
t2 = time.time()
print('使用10000次execute和commit耗时:%.2f秒'%(t2-t1))
# 2、执行10000次,提交1次
def test2(i):
t1 = time.time()
</