一、首先应该学会怎样安装pymysql模块:
安装1:
//安装 pip 3 install pymysql /*如果pip不能正常使用可以报:Fatal error in launcher: Unable to create process using '"' 可能是因为pip的配置不太正常,可以使用:*/ python -m pip install pymysql //尝试一下一般都会成功,注意前面python的版本号
安装2:在pycharm中安装
二、pymysql的用法:(连接数据库、获取游标、执行SQL语句、关闭游标,关闭连接)
import pymysql # 获取用户输入 name = input("用户名>>:") pwd = input("密码>>:") # 校验用户输入的用户名和密码是否正确 # 去数据库里取数据做判断 # 1. 连上数据库 conn = pymysql.connect(host="localhost",database="s8", user="root", password="", charset="utf8") # 不是utf-8 # 光有链接还不行,需要获取光标,让我能够输入SQL语句并执行 cursor = conn.cursor() # 2. 执行SQL语句 --> select * from userinfo where name=name and pwd=pwd sql = "select * from userinfo WHERE name='%s' and pwd='%s';" % (name, pwd) print(sql) ret = cursor.execute(sql) # 获取影响的行数 # 关闭光标和连接 cursor.close() conn.close() if ret: print("登陆成功") else: print("登录失败")
虽然已经实现了对输入的用户名和密码与数据库中的数据进行对比了,但时出现了一点问题,如果用户输入时输入--符号时就会注释掉它后面的sql不会执行,就会绕开密码,例如:
最后那一个空格,在一条sql语句中如果遇到select * from t1 where id > 3 -- and name='egon';则--之后的条件被注释掉了 #1、sql注入之:用户存在,绕过密码 egon' -- 任意字符 #2、sql注入之:用户不存在,绕过用户与密码 xxx' or 1=1 -- 任意字符
解决方式:
复制代码 # 原来是我们对sql进行字符串拼接 # sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd) # print(sql) # rows=cursor.execute(sql) #改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了) sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上 rows=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
三、对数据库数据的增、删、改、查:
增:
import pymysql # 连接 conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8") # 没有- # 获取光标 cursor = conn.cursor() # 写sql语句 sql = "insert into userinfo(name, pwd) VALUE (%s, %s);" username = "Egon2" password = "dashuaibi" try: # 执行SQL语句 cursor.execute(sql, (username, password, username, password)) conn.commit() # 把修改提交到数据库 except Exception as e: conn.rollback() cursor.close() conn.close()
批量增加:
import pymysql # 连接 conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8") # 没有- # 获取光标 cursor = conn.cursor() # 写sql语句 sql = "insert into userinfo (name, pwd) VALUES (%s, %s);" user1 = "Egon1" pwd1 = "sb1" user2 = "Egon2" pwd2 = "sb2" data = ((user1, pwd1), (user2, pwd2)) try: # 执行SQL语句 # cursor.execute(sql, (user1, pwd1)) # cursor.execute(sql, (user2, pwd2)) cursor.executemany(sql, data) conn.commit() # 把修改提交到数据库 except Exception as e: conn.rollback() cursor.close() conn.close()
删除数据:
import pymysql # 连接 conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8") # 没有- # 获取光标 cursor = conn.cursor() # 写sql语句 sql = "delete from userinfo where name=%s" username = "alex" try: # 执行SQL语句 cursor.execute(sql, (username,)) conn.commit() # 把修改提交到数据库 except Exception as e: conn.rollback() cursor.close() conn.close()
修改数据:
import pymysql # 连接 conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8") # 没有- # 获取光标 cursor = conn.cursor() # 写sql语句 sql = "update userinfo set pwd=%s where name=%s" username = "Egon" password = "sb" try: # 执行SQL语句 cursor.execute(sql, (password, username)) conn.commit() # 把修改提交到数据库 except Exception as e: conn.rollback() cursor.close() conn.close()
查询数据:
import pymysql # 连接 conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8") # 没有- # 获取光标 cursor = conn.cursor() # 写sql语句 sql = "select * from userinfo;" # 执行SQL语句 ret = cursor.execute(sql) print("-->",ret) # 一次取一条 # print(cursor.fetchone()) # print(cursor.fetchone()) # print(cursor.fetchone()) # 一次取所有 # print(cursor.fetchall()) # 一起取三条 # print(cursor.fetchmany(3)) # 进阶用法 print(cursor.fetchone()) print(cursor.fetchall()) print(cursor.fetchone()) # 移动取数据的光标 cursor.scroll(-2) # 默认是相对移动 print(cursor.fetchone()) # 按照绝对位置去移动 cursor.scroll(4, mode="absolute") print(cursor.fetchone()) cursor.close() conn.close()
四、获取插入的最后一条数据的自增ID:
import pymysql # 连接 conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8") # 没有- # 获取光标 cursor = conn.cursor() # 写sql语句 sql = "insert into userinfo (name, pwd) VALUES (%s, %s);" user1 = "Egon3" pwd1 = "sb3" try: # 执行SQL语句 cursor.execute(sql, (user1, pwd1)) conn.commit() # 把修改提交到数据库 # 拿到我插入这条数据的ID last_id = cursor.lastrowid print("--> 刚才插入的那条数据的ID值是:", last_id) except Exception as e: conn.rollback() cursor.close() conn.close()