目录
三、数据库的查找(fetchone,fetchmany,fetchall)
四、获取插入数据表的最后一条数据的自增id(cursor.lastrowid)
零、pymysql
PyMySQL是一个基于python编写的mysql驱动程序,可以让python语言操作mysql数据库。
安装:pip3 install pymysql
一、简单操作数据库(建立连接、获取游标、关闭连接)
import pymysql user=input('用户名: ').strip() pwd=input('密码: ').strip() # 和数据库建立链接 conn=pymysql.connect( host='localhost', user='root', password='123', database='test',charset='utf8' ) # 获取接受sql语句的对象(游标),默认用元组返回结果 cursor=conn.cursor() #同上,但执行完毕返回的结果集以字典显示 #cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) # 执行sql语句,返回终端的是执行成功后,受影响的行数 sql_rows='select * from userinfo where name="%s" and password="%s"' %(user,pwd) # 注意%s需要加引号 print(sql_rows) select_count=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目 print(select_count) # 关闭数据库连接 cursor.close() conn.close() if select_count: print('登录成功') else: print('登录失败')
二、 数据库的增、删、改操作(conn.commit())
import pymysql # 和数据库建立连接链接 conn=pymysql.connect(host='localhost',user='root',password='123',database='test') # 获取游标 cursor=conn.cursor() # 执行修改语句的三种方法 ## part1 语句中直接写入修改数据 # sql='insert into userinfo(name,password) values("root","123456");' # res=cursor.execute(sql) # 执行sql语句,返回sql影响成功的行数 # print(res) ## part2 语句外,后续操作进行对于数据写入 # sql='insert into userinfo(name,password) values(%s,%s);' # res=cursor.execute(sql,("root","123456")) # 执行sql语句,返回sql影响成功的行数 # print(res) ## part3 语句外,写入多个修改数据 sql='insert into userinfo(name,password) values(%s,%s);' res=cursor.executemany(sql,[("root","123456"),("lhf","12356"),("eee","156")]) # 执行sql语句,返回sql影响成功的行数 print(res) conn.commit() # 提交修改操作,执行commit后才能成功修改 cursor.close() conn.close()
三、数据库的查找(fetchone,fetchmany,fetchall)
import pymysql # 获取连接对象 conn=pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123', database='db42', charset='utf8' ) # 获取接受sql语句的对象(dictcursor 是以字典的形式返回) cursor=conn.cursor(pymysql.cursors.DictCursor) # 执行sql语句,返回的是执行成功受影响的行数 rows=cursor.execute('select * from class;') print(rows) # fetchone()一次只查取一个 print(cursor.fetchone()) print(cursor.fetchone()) # fetchmany(num)一次只查取num个 print(cursor.fetchmany(2)) # fetchall()一次取完存在列表中 print(cursor.fetchall()) # 第二次取全部则取出空列表 print(cursor.fetchall()) print(cursor.fetchall()) # 重置指针位置absolute是最开始的位置,3代表往后移动三条,取到第四条输出 cursor.scroll(3,'absolute') print(cursor.fetchone()) print(cursor.fetchone()) #第一条输出 print(cursor.fetchone()) # 第二条输出 # 相对于当前位置往后走一条 cursor.scroll(1,'relative') #当前第二条,往后走一条 print(cursor.fetchone())# 输出第三条 cursor.close() conn.close()
四、获取插入数据表的最后一条数据的自增id(cursor.lastrowid)
import pymysql conn=pymysql.connect(host='localhost',user='root',password='123',database='test') cursor=conn.cursor() sql='insert into userinfo(name,password) values("xxx","123");' rows=cursor.execute(sql) # cursor.lastrowid print(cursor.lastrowid) #在插入语句后查看 conn.commit() cursor.close() conn.close()
五、pymysql对sql注入的自动预防
# 原来是我们对sql进行字符串拼接 # sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd) # print(sql) # res=cursor.execute(sql) # 改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了) sql="select * from userinfo where name=%s and password=%s" ''' !!!注意%s需要去掉引号,因为pymysql会自动为我们加上 ''' res=cursor.execute(sql,[user,pwd]) # pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
5-1 基于防注入的SQL语句写法 - 字典
def sql_storage(self, data_dic): # 确保数据字典内没有空字段,存在执行即报错 for k, v in data_dic.items(): if not v: data_dic[k] = 0 # 存在更新,未存在添加 select_sql = 'select id from exchange_information where name=%s' # 返回执行成功受影响的行数 select_rows = self.cusor.execute(select_sql, (data_dic['name'],)) if not select_rows: sql = ''' insert into exchange_information (name,slug,logo_url,website,twitter_url,blog_url,chat_url,fee_url,visible) values(%(name)s,%(slug)s,%(logo_url)s,%(website)s,%(twitter_url)s,%(blog_url)s,%(chat_url)s,%(fee_url)s,%(visible)s); ''' else: data_dic['id'] = self.cusor.fetchone() # 书写 SQL 语句时,关键词前不可存在 ‘,’ sql = ''' update exchange_information set name=%(name)s, slug=%(slug)s, logo_url=%(logo_url)s, website=%(website)s, twitter_url=%(twitter_url)s, blog_url=%(blog_url)s, chat_url=%(chat_url)s, fee_url=%(fee_url)s where id=%(id)s ''' self.cusor.execute(sql, data_dic) self.connect.commit()