1.刚开始我们先给一张图片,是介绍Python操作MySQl详细步骤。
2.在Python语言中要想操作数据库,就需要使用的pymysql这个模块。
from pymysql import connect
3.获取connection连接对象
要和MySQL数据库连接,需要调用pymysql模块中的connect()方法,其中也包括一些参数解释。
conn=connect(参数列表)
- 参数host:连接的mysql主机,如果本机是’localhost’
- 参数port:连接的mysql主机的端口,默认是3306
- 参数database:数据库的名称
- 参数user:连接的用户名
- 参数password:连接的密码
- 参数charset:通信采用的编码方式,推荐使用utf8
4. 常用的方法有以下:
- 关闭数据库连接 conn.close()
- 提交数据 conn.commit()
- 撤销回滚数据 conn.rollback()
- 获取游标 cur = conn.cursor()
5.Cursor游标对象
5.1获取Cursor对象
调用Connection对象的cursor()方法
cur =conn.cursor()
目的: 执行sql语句(使用频度最高的语句为select、insert、update、delete)
5.2 使用游标执行SQL语句
execute(operation [, parameters ])
执行SQL语句,返回受影响的行数,主要用于执行insert、update、delete语句,也可以执行create、alter、drop等语句
5.3 关闭游标
cur.close()
5.4 获取结果集中的一条
cur.fetchone()
返回一个元组
5.5 获取结果集中的所有
cur.fetchall()
执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回
6.pymysql完成数据查询
import pymysql
conn = pymysql.connect(host='localhost', port=3306, user='root',password='mysql',database='python_test_1', charset='utf8')
# 获取游标
cursor = conn.cursor()
# 执行SQL语句 返回值就是SQL语句在执行过程中影响的行数
sql = "select * from hero;"
row_count = cursor.execute(sql)
print("SQL语句执行影响的行数%d" % row_count)
# 取出结果集中一行 返回的结果是一行
print(cursor.fetchone())
# 取出结果集中的所有数据 返回一行数据
for line in cursor.fetchall():
print(line)
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
7.pymysql完成对数据库的增删改
import pymysql
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='mysql',db='python_test_1', charset='utf8')
# 通过连接获取游标
cursor = conn.cursor()
# sql = "delete from hero where id = 5;"
# sql = insert into hero (name) values ('黎明');
sql = "update hero set kongfuid=444 where id = 4;"
row_count = cursor.execute(sql)
print("SQL语句执行影响的行数%d" % row_count)
# 提交数据到数据库
conn.commit()
# 回滚数据到什么都不做的状态 即撤销刚刚的修改
# conn.rollback()
# 关闭游标和连接
cursor.close()
conn.close()
8.参数化列表防止SQL注入
SQL注入 产生原因: 后台将用户提交的带有恶意的数据和SQL进行字符串方式的拼接,从而影响了SQL语句的语义,最终产生数据泄露的现象。
如果防止: sql语句的参数化, 将SQL语句的所有数据参数存在一个列表中传递给execute函数的第二个参数
from pymysql import connect
def main():
find_name = input("请输入物品名称:")
# 创建Connection连接
conn = connect(host='localhost',port=3306,user='root',password='mysql',database='goods',charset='utf8')
# 获得Cursor对象
cs1 = conn.cursor()
# 非安全的方式
# 输入 " or 1=1 or " (双引号也要输入)
# sql = 'select * from goods where name="%s"' % find_name
# print("""sql===>%s<====""" % sql)
# # 执行select语句,并返回受影响的行数:查询所有数据
# count = cs1.execute(sql)
# 安全的方式
# 构造参数列表
params = [find_name]
# 执行select语句,并返回受影响的行数:查询所有数据
count = cs1.execute('select * from goods where name=%s', params)
# 注意:
# 如果要是有多个参数,需要进行参数化
# 那么params = [数值1, 数值2....],此时sql语句中有多个%s即可
# 打印受影响的行数
print(count)
# 获取查询的结果
# result = cs1.fetchone()
result = cs1.fetchall()
# 打印查询的结果
print(result)
# 关闭Cursor对象
cs1.close()
# 关闭Connection对象
conn.close()
if __name__ == '__main__':
main()