首页 > 数据库 >python连接mysql数据库

python连接mysql数据库

时间:2023-06-30 13:34:29浏览次数:54  
标签:cur python 数据库 sql db pymysql Connection time 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

# 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

相关文章

  • 事务全攻略,MySQL数据库必学知识!
    前言从今天开始,健哥就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深,全面讲解数据库体系。非常适合零基础的小伙伴来学习。全文大约【1707】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文......
  • 15个下载量均过亿使用率超高的Python库
    今天给大家分享最近一年内PyPI上下载量最高的Python包。现在我们来看看这些包的作用,他们之间的关系,以及为什么如此流行。1.Urllib3:8.93亿次下载Urllib3是Python的HTTP客户端,它提供了许多Python标准库没有的功能。线程安全连接池客户端SSL/TLS验证使用multipart......
  • python - 二分查找
    a=[1,3,5,7,9]#查找第一个大于等于x的位置deflower_bound(l,r,x):whilel<=r:mid=(l+r)//2ifa[mid]<x:l=mid+1else:r=mid-1returnl#查找第一个大于x的位置defupper_bound(l,r,x......
  • 用dotLucene为数据库内容建立索引
    //建立索引的类publicclassIndexer{privateIndexWriterwriter;Documentdoc=newDocument();publicIndexer(stringDirectory){InitializeIndex(Directory);}......
  • python 报错AttributeError: '_TestResult' object has no attribute 'outputBuffer'
    报错信息: 原因:使用setupclass必须加@classmethod装饰器 解决方案:在setupclass和teardownclass方法前面加@classmethod ......
  • Oracle与MySQL的最大连接数和超时时间查询与设置
    Oracle--查询最大连接数SELECTVALUEFROMv$parameterWHERENAME='processes';/*IDLE_TIME:限制每个会话所允许的最长连续空闲时间,超过这个时间会话将自动断开。(参数值是一个整数,单位是分钟,UNLIMITED不限制)CONNECT_TIME:限制指定会话的总运行时间限制,超过这个时间会话将......
  • python -m sysconfig快速查看 Python 的环境信息
    C:\Users\daizichuan>python-msysconfigPlatform:"win-amd64"Pythonversion:"3.10"Currentinstallationscheme:"nt"Paths:data="D:\miniconda3"include="D:\miniconda3\Include&quo......
  • Cubieboard A10 安装Nand系统,配置nginx,php,mysql,samba详细教程
    安装前置条件1.下载win32diskimager-v0.7-binary.zip2.下载debian_wheezy_armhf_v1_mele.zip3.下载cubie_nand_uboot_partition_image.zip4.下载FlashFXP.zip5.下载PanasonicSDFormatter.zip6.下载puttyfile_0.62cn.zip以上文件下载地址:http://pan.baidu.com/s/1i3Ke8gH ......
  • docker部署mysql主从同步
    1. 规划主机ipmaster10.0.0.1slave10.0.0.12. 查看镜像,下载镜像,导入镜像的命令docker imagesdocker pullmysql:5.7dockerload-imysql.tar3. 启动镜像服务 dockerrun-d --namemysql-master -p3306:3306 -eMYSQL_ROOT_PASSWORD=root@1234 mysql:5.7.174. 复......
  • python中关于continue(跳过)和 break (终止)的使用方法,易混淆
    在Python中,continue和break是两个控制流语句,用于在循环中改变程序的执行流程。它们的区别如下:continue:当程序执行到 continue 语句时,会跳过当前迭代中剩余的代码,直接进入下一次迭代。换句话说,continue 会终止当前迭代的剩余部分,然后开始下一次迭代。foriinrange(1,......