python程序中使用MySQL数据库
1、python中使用MySQL数据库需要借助第三方模块 pymysql(pip install pymysql)
2、pymysql本质是一个套接字客户端软件,在python 程序中使用pymysql对象链接服务器端
1 pymysql连接数据库
#方式1: import pymysql #step1 链接 conn = pymysql.connect( host="localhost", user="root", password="123", db="myschool", charset="utf8") cursor = conn.cursor() #step2 拿游标 sql = "select * from class;" #step3 拼接sql语句 res1 = cursor.execute(sql) #step4 调用execute()执行sql语句 print(res1) #res不是查询的数据结果,而是查到数据的行数 #step5 得到查询数据 res2 = cursor.fetchone() #fetchone返回查到第一行数据,以元组的形式返回 res3 = cursor.fetchmany(2) #fetchmany(n) 返回查到的接着n条记录 res4 = cursor.fetchall() #fetchall() 返回剩下所有的数据记录 cursor.close() #step6 #关闭游标 conn.close() #step7 #关闭客户端链接
1、方式1清楚地列出了使用pymysql连接数据库的主要步骤
2、当使用查询操作时,查询的数据需要使用 fetchone()等函数获得,返回元组形式的结果
3、使用增、删、改操作时,涉及到拼接sql语句时的字符串引号问题,需要注意sql注入问题
4、此外,还有第二种连接方式,用字典进行连接参数的管理,这样子更优雅
#方式2: import pymysql.cursors config = { 'host': '127.0.0.1', 'port': 3306, 'user': 'root', 'password': 'root', 'db': 'myschool', 'charset': 'utf8' } conn = pymysql.connect(**config) #step1 创建连接 #cursor = conn.cursor() #step2 创建游标方式1 with conn.cursor() as cursor: #创建游标方法2 不需要再手动关闭游标 sql = "select * from class;" #step3 拼接sql语句 cursor.execute(sql) #step4 执行sql语句 res = cursor.fetchall() #step5 得到查询数据 print(res) conn.close() #step6 关闭连接,释放内存
2 sql 注入
sql注入现象见:https://www.cnblogs.com/linhaifeng/articles/7525619.html#_label3
1、通过前端的表单提交的数据中携带sql语句, 欺骗服务器, 在后端对数据进行存储时, 执行恶意的sql语句
2、比如在使用pymysql操作数据库是使用字符串拼接生产sql语句, 就会出现sql注入漏洞
3、使用pymysql时, 不要自己拼接字符串, 而是使用execute方法, pymysql模块已经对提交的数据做了处理, 不会出
现sql注入
3 增删改查操作
1、查主要使用的是execute()和fetchone()系列函数
2、增删改主要使用的是execute()和commit()函数
#示例1:查 import pymysql conn = pymysql.connect(host="localhost",user="root",password="123", db="myschool",charset="utf8") cursor = conn.cursor() sql = "select * from student;" res = cursor.execute(sql) data = cursor.fetchall() #fetchone()\fetchmany(size) print(data) cursor.close() conn.close()
3、需要注意的一点是,不要自己拼接sql语句的字符串、使用在execute中传参的方式
#示例2:增 import pymysql conn = pymysql.connect(host="localhost",user="root",password="123", db="myschool",charset="utf8") cursor = conn.cursor() #方式1 sql = "insert into student(sname,cid) values("tom",2);" res = cursor.execute(sql,) print(res) #打印sql影响成功的行数 conn.commit() #提交后才发现表中插入记录成功 #方式2 sql = "insert into student(sname,cid) values(%s,%d);" res = cursor.execute(sql,("tom",2)) #参数放在元祖中 print(res) conn.commit() #提交后才发现表中插入记录成功 #方式3 sql='insert into student(sname,cid) values(%s,%d);' res=cursor.executemany(sql,[("jack",3),("lili",4)]) #插入多行,列表 print(res) conn.commit() #提交后才发现表中插入记录成功 cursor.close() conn.close() #删、改的操作类似
4 pymysql使用总结
1、pymysql.connect()参数说明 host(str) #MySQL服务器地址 port(int) #MySQL服务器端口,默认3306 user(str) #用户名 password(str) #密码 db(str) #数据库名 charset(str) #连接编码 2、connection对象支持的方法 cursor() #获得游标 commit() #提交当前事务 rollback() #回滚当前事务 close() #关闭连接 3、cursor对象支持的方法 execute() #执行一个sql语句 fetchone() #获取结果集中的一条记录 fetchmany(size) #获取结果集中的多条记录,size指定条数 fetchall() #获取结果集中的所有剩下所有条 rowcount() #返回数据条数或影响行数 rownumber #返回数据条数或影响行数 close() #关闭游标对象