01_基本使用
1.1 安装pymysql模块
pip install pymysql
1.2 创建连接的基本使用
import pymysql # 1. 连接database conn = pymysql.connect( host = '数据库地址', port = 3306, # 默认3306端口号 user = '用户名', password = '密码', database = '数据库名称', charset='utf-8' ) # 2. 获取光标对象 cursor = conn.cursor() # # 执行完毕返回的结果集默认以元组显示 # 得到一个可以执行SQL语句并且将结果作为字典返回的游标 # cursor = conn.cursor(cursor=pymysql.cursor.DictCursor) # 3. 编写sql语句 sql = """ select * from stu """ # 4. 执行sql语句 cursor.execute(sql) # 5. 关闭光标对象 cursor.close() # 关闭数据库连接 # 6. conn.close()
1.3 游标cursor
游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理
通俗来说就是,操作数据和获取数据库结果都要通过游标来操作。
-
游标的方法
1. cursor():创建游标对象 2. close():关闭游标对象 3. excute():执行sql语句 4. executemany(sql, args):执行多个数据库查询语句 5. fetchone():得到结果集的下一行 6. fetchmany([size = cursor.arraysize]):得到结果集的下几行 7. fetchall():获取所有结果,执行sql语句后获得的结果
1.4 增删改查操作
import pymysql conn = pymysql.connect( host='localhost', port=3308, user='root', password='123456', database='test', charset='utf8' ) cursor = conn.cursor()
-
增(单条/批量 数据插入, 事务commit)
# 定义要执行的sql语句 sql = 'INSERT INTO account(username,money) VALUES(%s, %s);' select_sql = 'select * from account;' data = [ ('shunan', 500), ('jiangfeng', 600), ('xiaoliang', 700) ] # 拼接并执行sql语句 # 单挑数据插入 cursor.execute(sql, ['luluxiu', 800]) # 多条数据插入 cursor.executemany(sql, data) # 提交事务 conn.commit() # 关闭光标和连接 cursor.close() conn.close()
# 定义sql语句 cursor = conn.cursor() sql = 'delete from account where username=%s' name = 'luluxiu' cursor.execute(sql, [name]) # 提交事务 conn.commit() # 关闭连接 cursor.close() conn.close()
# 定义sql语句 sql = "update account set maney=%s where username=%s" cursor.execute(sql, [1000, 'shunan']) # 提交事务 conn.commit() # 关闭连接 cursor.close() conn.close()
# 查询最新的那一条数据的id last_id = cursor.lastrowid print("最后一条数据的ID是:{}".format(last_id)) # 查询所有,返回字典数据类型 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 定义sql语句 sql = "select username,money from account;" cursor.execute(sql) res = cursor.fetchall() # 查询所有 res1 = cursor.fetchone() # 取一条 res2 = cursor.fetchmany(4) # 取四条 res3 = cursor.fetchone() # 取一条 cursor.close() conn.close() print(res) print(res1) print(res2) print(res3)
02_数据库连接池
进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接mysql数据库请求时,都是独立的去请求访问,相当浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响。因此,实际使用中,通常会使用数据库的连接池技术,来访问数据库达到资源复用的目的。
解决方案:
DBUtils 是一套 Python 数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装。DBUtils 来自 Webware for Python 。
创建连接就从连接池获取,关闭连接就将连接放回到连接池中。
# 案例 import pymysql from dbutils.pooled_db import PooledDB # port这里因为某些原因改到了3308 # 5为连接池里的最少连接数,setsession=['SET AUTOCOMMIT = 1']是用来设置线程池是否打开自动更新的配置,0为False,1为True pool = PooledDB(pymysql, 5, host='localhost', port=3308, user='root', passwd='123456', db='test', setsession=['SET AUTOCOMMIT = 1']) conn = pool.connection() #以后每次需要数据库连接就是用connection()函数获取连接就好了 cursor = conn.cursor() sql = "select * from account" count = cursor.execute(sql) res = cursor.fetchall() print(res) # 连接放回到连接池 cursor.close() conn.close()
PS: 在 uwsgi 中,每个 http 请求都会分发给一个进程,连接池中配置的连接数都是一个进程为单位的(即上面的最大连接数,都是在一个进程中的连接数),而如果业务中,一个 http 请求中需要的 sql 连接数不是很多的话(其实大多数都只需要创建一个连接),配置的连接数配置都不需要太大。