在python中使用pymysql库连接MySQL数据库并进行操作。
1. 引入库
import pymysql
2. 创建连接对象
db = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='hhhh',
database='test',
charset='utf8'
)
3. 获取游标对象
cursor = db.cursor()
4. 执行sql语句并获取返回结果
# sql语句
sql = "select * from dept;"
# 执行语句,返回值为影响的行数
count = cursor.execute(sql) # 影响的行数
# 执行结果
content = cursor.fetchone() # 往后继续查询到的一个
print(content)
content = cursor.fetchall() # 往后继续查询到的所有
print(content)
5. sql语句参数化
为什么要参数化?
在直接将字符串传入sql语句中时,有sql注入风险,如恶意拼接、传入非法参数、增加恶意指令、添加额外条件等。示例代码如下:
# 传入'or 1 or',使表达式为真值,实现sql注入,不安全。
input_dept_name = input("请输入您的部门名称:")
sql = "select * from dept where name = '%s'" % input_dept_name
cursor.execute(sql)
content = cursor.fetchall()
print(content)
当用户输入
'or 1 or'
sql语句变成了
sql = "select * from dept where name = ''or 1 or''" %
'%s' 中的单引号和传入的单引号组成了空串'',1为真,’‘ or 1 or ''为真,where后的表达式为真,带来风险。为避免这一风险,将sql语句参数化。
# sql语句参数化防止sql注入
input_dept_name = input("请输入您的部门名称:")
# 构造参数列表
params = [input_dept_name]
# 执行
sql = "select * from dept where name = %s" # 注意%s不加引号
cursor.execute(sql, params)
content = cursor.fetchall()
print(content)
6. 事务操作提交与回滚
# 提交事务操作,默认开启事务,需手动提交。
db.commit()
# 回滚事务操作,try: … catch: …
db.rollback()
7. 关闭游标和连接
# 注意先后顺序,先关闭游标,再关闭连接
cursor.close()
db.close()