pymysql 在python3.x 中用于连接MySQL服务器的一个库;Python2中则使用mysqldb
pymysql的模块的基本的使用
# 导入pymysql模块 import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句的光标对象 cursor = conn.cursor() # 定义要执行的SQL语句 sql = """ CREATE TABLE USER1 ( id INT auto_increment PRIMARY KEY , name CHAR(10) NOT NULL UNIQUE, age TINYINT NOT NULL )ENGINE=innodb DEFAULT CHARSET=utf8; """ # 执行SQL语句 cursor.execute(sql) # 关闭光标对象 cursor.close() # 关闭数据库连接 conn.close()
如果想要返回的是字典格式的数据,则光标
# 得到一个可以执行SQL语句并且将结果作为字典返回的游标 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
2. SQL注入问题
1. SQL语句在程序中是字符串,动态拼接的字符串,拿用户输入的内容去拼接字符串
拿用户输入的内容去拼接字符串,会造成一下的问题: --(在SQL语句中表示注释)
2. 不要自己拼接字符串
例子:用数据库来练习登录
import pymysql # # 用数据库来做登录的练习; # # username = input("请输入用户名") # password = input("请输入密码") # # # 连接数据库,获得连接; conn = pymysql.connect( host="127.0.0.1", #数据库的id; port=3306, #数据库的端口号,是int类型的; user="root", #登录数据库的用户名; password="123456", #登录数据库的密码; database="userinfo", #登录后要查看哪个数据库; charset="utf8" #编码没有-; ) # # 获得一个可以执行 SQL语句 的光标对象(cursor); # cursor = conn.cursor() # 指定一个具体的光标,返回数据为字典的格式; cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # # 定义要执行的sql语句; # sql = "select * from info where username=%s and password=%s;" #%s 只是用来占位; # #数据库可以按照条件来寻找, # # #真正的执行sql语句; # ret = cursor.execute(sql,[username,password]) # #这里让pyMySQL 帮我们传入参数,为了不让我们自己拼接,从而造成 sql注入; # # # # ret 为返回结果,如果输入的用户名和密码在数据库里面能找到的话,就返回这一行的数据,即返回值不为空; # # 找不到,则为空; # if ret: # print("登录成功") # else: # print("登录失败") # 批量操作; # sql = "insert into user_info(username, password) value(%s,%s);" sql = "select * from user_info" cursor.execute(sql) #返回的不是具体的数据,而是受影响的行数; ret = cursor.fetchmany(3) #获得指定数量的数据;fetchone获得一条数据; print(ret) # cursor.scroll(1,mode="absolute") #绝对移动,写多少就是移到多少 cursor.scroll(-1,mode="relative") #相对定位,就是相对 光标 当前的位置,整数 是向下移动, 负数 是向上移动; # # 根据光标取值,取光标下面的值; ret = cursor.fetchall() #获得所有的数据; print(ret) # data = [("alex","18"),("egn","22"),("yuan","22")] # # executemany就是同时执行对个数据,传入的数据必须是 可迭代的 # cursor.executemany(sql,data) #内部实现for循环; # conn.commit() # 执行SQL语句的时候,报错的话,把它捕捉起来; # try: # cursor.executemany(sql,data) #内部实现for循环; # # for i in [("a",18),("b"),("c",16)]: # cursor.execute(sql,i) # # 改变表里面的数据的时候,需要提交数据; # conn.commit() # # except Exception: # #有异常,也就是有错误的时候,SQL语句全部都不执行,就像事件一样, # conn.rollback() #回滚 # 一组sql语句批量执行, 要么全部执行成功,要么全部执行失败 cursor.close() conn.close()