python连接mysql数据库

  连接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

"""
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函数。

 

小结:本文重点在于pythonpy连接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

 

posted @ 2023-06-30 13:25  wancy  阅读(1580)  评论(0编辑  收藏  举报