连接mysql方式很多,这里先只介绍pymysql库连接mysql数据库。
1.安装pymysql
pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple
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, '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. 查询操作
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 # t1=time.time() # print(t1) # # t2=time.time() # print(t2) # # print(t2-t1) """ 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() try: for i in range(i): cur.execute(sql,[i]) con.commit() except Exception as e: print(e) con.rollback() t2 = time.time() print('使用execute执行10000次,commit1次耗时:%.2f秒'%(t2-t1)) # 3、执行executemany1次,提交1次 def test3(i): t1 = time.time() args_list = [] for i in range(i): args_list.append([i]) try: cur.executemany(sql,args_list) con.commit() except Exception as e: print(e) con.rollback() t2 = time.time() print('使用executemany执行1次,commit1次耗时:%.2f秒'%(t2-t1)) def main(i:int): test1(i) test2(i) test3(i) if __name__ == '__main__': i=10000 print("次数" '为:'+str(i)+'次') main(i)
不同的计算机可能需要的时间不同,我当前使用的电脑性能很差,所以第一种方法为250多秒,好的电脑可能几十秒左右甚至更短。但是可以总结出执行时间最短的是executemany函数。
小结:本文重点在于python的py连接mysql数据库,对SQL语句没有作过多讲解。在__init__.py文件中定义变量或者逻辑将在导入时候被执行。select操作不需要使用db.commit()提交事务,但是写入操作、删除操作,需要使用dbcommit()提交事务后,才能永久性写入数据库。注意占位符的使用方法。executemany实际上也是把各个参数组合成一条SQL语句执行(==insert into article(an) values (),(),(),...),执行大量条数的数据时最好使用executemany函数。
若存在不足或错误之处,欢迎评论与指正,觉得有用,请点个赞!
参考资料:
https://blog.csdn.net/weixin_46055113/article/details/108317619
https://blog.csdn.net/weixin_34515649/article/details/114405058
https://www.cnblogs.com/eliwang/p/15578914.html
标签:cur,python,数据库,sql,db,pymysql,Connection,time,mysql From: https://www.cnblogs.com/wancy/p/17515675.html