为了使python连接上数据库,你需要一个驱动,这个驱动是用于与数据库交互的库,本文是向大家介绍了如何利用python中的pymysql库来操作mysql数据库。
1、什么是pymysql?
pymysql是从python连接到mysql数据库服务器的接口, 简单理解就是,pymysql是python操作mysql数据库的三方模块,可以在python中连接数据库写mysql命令,它是一个纯python库。
2、安装pymysql
可以通过下面的命令来进行安装pymysql模块:
pip install pymysql
3、连接数据库
安装好pymysql后,在python程序中可以用 import pymysql 来导入模块。
在连接数据库前,首先要确定数据库服务端已启动。在数据库中有已经创建好的数据库,这里连接数据库‘mydb’,使用的用户名为‘root’,密码为‘mysql’。
比较常用的参数包括:
- host:数据库主机名.默认是用本地主机
- user:数据库登陆名.默认是当前用户
- password:数据库登陆的秘密.默认为空
- database:要使用的数据库名.没有默认值
- port:MySQL服务使用的TCP端口.默认是3306
- charset:数据库编码
# 导入pymysql import pymysql # 打开数据库连接 conn = pymysql.connect( host = '127.0.0.1', # 服务端地址 port = 3306, # 服务端端口 user = 'root', # 用户名 password = 'mysql', # 密码 database = 'mydb', # 要连接的数据库 charset = 'utf8' , # 设置数据库编码 cursorclass=pymysql.cursors.DictCursor # 记录结果,字典显示 ) # 使用 cursor() 方法创建一个游标对象 cursor cursor = conn.cursor() # 关闭数据库连接 conn.close()
上面的示例中有一个游标的概念,相当于光标的上下移动,每移动一次代表一条记录。在pymysql中,对于select等操作返回的结果都可以通过游标的移动配合相应方法函数来进行读取。
4、sql注入
如果某些sql语句要进行字符串拼接,那么一定要使用pymysql提供的execute()方法进行拼接,不要去用python中的%或format()方法,这可能导致出现sql注入问题带来不安全的隐患。
# 导入pymysql import pymysql # 打开数据库连接 conn = pymysql.connect( host = '127.0.0.1', # 服务端地址 port = 3306, # 服务端端口 user = 'root', # 用户名 password = 'mysql', # 密码 database = 'mydb', # 要连接的数据库 charset = 'utf8' , # 设置数据库编码 cursorclass=pymysql.cursors.DictCursor # 记录结果,字典显示 ) # 使用 cursor() 方法创建一个游标对象 cursor cursor = conn.cursor() # 执行sql sql = "select * from t1 where id=%s" # 提交执行,返回sql影响成功的行数 这里拼接能预防sql注入问题 res = cursor.execute(sql,("1",)) print(res) # 1 查出一条记录 # 拿到所有记录的结果 print(cursor.fetchall()) # 关闭游标 cursor.close() conn.close()
5、事务提交
执行update/insert/delete之类的操作时,必须使用conn.commit()进行事务提交后才能生效。或者在实例化conn对象时为它指定auto_commit参数为true即可自动提交事务。当操作出现问题时,可以使用conn.rollback()进行事务回滚。
# 导入pymysql import pymysql # 打开数据库连接 conn = pymysql.connect( host = '127.0.0.1', # 服务端地址 port = 3306, # 服务端端口 user = 'root', # 用户名 password = 'mysql', # 密码 database = 'mydb', # 要连接的数据库 charset = 'utf8' , # 设置数据库编码 cursorclass=pymysql.cursors.DictCursor, # 记录结果,字典显示 autocommit = True # 自动提交 ) # 使用 cursor() 方法创建一个游标对象 cursor cursor = conn.cursor() # 执行sql sql = "insert into t1(name) values(%s)" # 提交执行,返回sql影响成功的行数 这里拼接能预防sql注入问题 res = cursor.execute(sql,("新记录",)) print(res) # 1 成功插入一条记录 print(cursor.lastrowid) #在插入语句后查看,查看最后一条记录的行号 print(cursor.fetchall()) # conn.commit() # 手动提交 cursor.close() conn.close()
6、提交多条
cursor.executemany()方法可实现一次性提交多条sql。
# 导入pymysql import pymysql # 打开数据库连接 conn = pymysql.connect( host = '127.0.0.1', # 服务端地址 port = 3306, # 服务端端口 user = 'root', # 用户名 password = 'mysql', # 密码 database = 'mydb', # 要连接的数据库 charset = 'utf8' , # 设置数据库编码 cursorclass=pymysql.cursors.DictCursor, # 记录结果,字典显示 autocommit = True # 自动提交 ) # 使用 cursor() 方法创建一个游标对象 cursor cursor = conn.cursor() # 执行sql sql = "insert into t1(name) values(%s)" # 同一条命令,执行3次 # 提交执行,返回sql影响成功的行数 这里拼接能预防sql注入问题 res = cursor.executemany(sql,[("新记录1"),("新纪录2"),("新纪录3")]) print(res) # 3 成功插入三条记录 print(cursor.lastrowid) #在插入语句后查看,查看最后一条记录的行号 print(cursor.fetchall()) cursor.close() conn.close()
7、游标
获取到一条记录后,我们可以控制游标移动,也可以控制查看游标后的多少条记录,游标每移动一次代表一条记录
注:游标移动的条数即为记录的条数,如果移动值为负N就代表上N条记录
cursor.scroll(3,mode='absolute') 游标以绝对位置向后移动3条记录 cursor.scroll(3,mode='relative') 游标以当前位置向后移动3条记录
如果想获取记录,可使用以下三个方法
cursor.fetchone() # 获取第一条记录,游标向下移动一行 cursor.fetchmany(2) # 获取接下来的两条记录,游标向下移动两行 cursor.fetchall() # 获取全部记录,游标移动到末尾,返回的是一个列表
8、DBUtils
使用DBUtils的连接池来与MySQL服务端建立链接,避免了频繁的socket链接请求,这常用于并发性的访问。
首先,通过下面的命令进行安装:
pip install dbutils
使用方法:
import pymysql from dbutils.pooled_db import PooledDB class MySqlPool(object): config = { "creator": pymysql, # 使用连接数据库的模块 "host": "127.0.0.1", "port": 3306, "user": "root", "password": "mysql", "db": "mydb", "charset": "utf8", "autocommit": True, "mincached": 10, # 启动时开启的闲置连接数量(缺省值 0 开始时不创建连接) "maxconnections": 70, # 连接池最大连接数量 "maxcached": 10, # 连接池中允许的闲置的最多连接数量 "maxshared": 10, # 共享连接数允许的最大数量(缺省值 0 代表所有连接都是专用的)如果达到了最大数量,被请求为共享的连接将会被共享使用 "blocking": True, # 设置在连接池达到最大数量时的行为(缺省值 0 或 False 代表返回一个错误<toMany......> 其他代表阻塞直到连接数减少,连接被分配) "maxusage": 0, # 单个连接的最大允许复用次数(缺省值 0 或 False 代表不限制的复用).当达到最大数时,连接会自动重新连接(关闭和重新打开) "setsession": [], # 一个可选的SQL命令列表用于准备每个会话,如["set datestyle to german", ...],常用于做初始化命令 "cursorclass": pymysql.cursors.DictCursor # 返回类型,dict } pool = PooledDB(**config) # 单例模式创建出池子 def get_db(self): self.conn = MySqlPool.pool.connection() self.cursor = self.conn.cursor() return self def close(self): self.cursor.close() self.conn.close() def __enter__(self): return self.get_db() def __exit__(self, exc_type, exc_val, exc_tb): self.close() # 使用方式一 with MySqlPool() as db: db.cursor.execute("select * from t1;") print(db.cursor.fetchall()) # 使用方式二 db = MySqlPool().get_db() db.cursor.execute("insert into t1 (user_name,user_password,user_type) values ('aaa',123,1);") print(db.cursor.fetchall()) db.close()