python学习笔记(十五)python操作数据库
1.连接mysql,ip,端口号,密码,账号,数据库
2.建立游标
3.执行sql
4.获取结果
5.关闭连接,关闭游标
游标打开仓库的大门:
1 import pymysql 2 conn=pymysql.connect( 3 host='127.0.0.1', 4 user='root1', 5 passwd='mysql', 6 port=3306, 7 db='mysql', 8 charset='utf8' #charset必须写utf8,不能写utf-8 9 ) 10 cur=conn.cursor(cursor=pymysql.cursors.DictCursor)#建立游标,游标你就认为是仓库管理员,设游标类型为字典类型 11 cur.execute('show tables;')#执行sql语句 12 res=cur.fetchall()#获取sql执行结果,它把结果放到一个元组里,每一条数据也是一个元组;若指定了游标类型,则按指定的类型输出 13 print(res) 14 15 cur=conn.cursor(cursor=pymysql.cursors.DictCursor) 16 cur.execute('select * from myuser limit 5;') 17 res=cur.fetchall() 18 print(res) 19 20 cur=conn.cursor(cursor=pymysql.cursors.DictCursor) 21 cur.execute('select * from myuser where id=1') 22 res=cur.fetchall() 23 print(res)#[{'uname': '小黑', 'pwd': '123456', 'id': 1}] 24 25 cur=conn.cursor(cursor=pymysql.cursors.DictCursor) 26 cur.execute('select * from myuser;') 27 res=cur.fetchall() 28 print(res) 29 30 31 cur=conn.cursor()#没有指定游标类型 32 cur.execute('select * from myuser;') 33 res=cur.fetchall() 34 print(res[0][2]) 35 36 37 cur=conn.cursor(cursor=pymysql.cursors.DictCursor) 38 sql="insert into myuser (id,uname,pwd) values('7','小紫','123456');" 39 cur.execute(sql) 40 conn.commit()#提交;插入或者更新都需要先提交一下
41 cur.close()#关闭游标
42 conn.close()#关闭连接
fetchall 和fetchone:
1 import pymysql 2 conn=pymysql.connect( 3 host='127.0.0.1', 4 user='root1', 5 passwd='mysql', 6 port=3306, 7 db='mysql', 8 charset='utf8' 9 ) 10 cur=conn.cursor() 11 cur.execute('select *from myuser') 12 res=cur.fetchall() 13 print(res[0])#(1, '小黑', '123456') 14 print(res)#所有的数据 15 16 17 cur=conn.cursor() 18 cur.execute('select *from myuser') 19 res=cur.fetchone()#只获取一条结果,它的结果是一个一维的元组;只有一条数据,那么就用fetchone,超过一条数据就用fetchall 20 print(res)#(1, '小黑', '123456') 21 22 #指针的存在 23 res=cur.fetchone() 24 print(res) 25 print('fetchall',cur.fetchall())#除第一行之后的所有数据 26 print('fetchone',cur.fetchone())#None 指针移到了最后,什么都读不到了 27 28 cur=conn.cursor() 29 cur.execute('select *from myuser;') 30 res=cur.fetchone()#第一行数据 31 print(res) 32 print(cur.fetchall())#除第一行以后的所有数据 33 cur.scroll(0,mode='absolute')#移动游标到最前面 34 print(cur.fetchall())#所有的数据,包括第一行 35 36 37 cur=conn.cursor() 38 cur.execute('select *from myuser;') 39 res=cur.fetchone()#第一行数据 40 print(res) 41 print(cur.fetchall())#除第一行以后的所有数据,这时指针到了最后一行 42 cur.scroll(-7,mode='relative')#相对当前位置向后移到7,到了第一行,总共7行数据 43 print(cur.fetchall())#所有的数据 44 45 46 cur.close() 47 conn.close()
将操作数据库步骤封装成函数:
1 import pymysql 2 def op_mysql(host,user,passwd,db,sql,port=3306,charset='utf8'): 3 conn=pymysql.connect( 4 host=host, 5 user=user, 6 passwd=passwd, 7 db=db, 8 port=port, 9 charset=charset 10 ) 11 cur=conn.cursor(cursor=pymysql.cursors.DictCursor) 12 cur.execute(sql) 13 sql_start=sql[:6].upper()#取sql前6个字符串,判断它是什么类型的sql语句 14 if sql_start=='SELECT': 15 res=cur.fetchall()17 else: 18 conn.commit() 19 res='OK' 20 cur.close() 21 conn.close()
return res 22 sql2='select * from myuser;' 23 res=op_mysql( 24 host='127.0.0.1', 25 user='root1', 26 passwd='mysql', 27 db='mysql', 28 sql=sql2, 29 port=3306, 30 charset='utf8' 31 ) 32 print(res)
__name__=__main__:
别人导入这个python文件的时候,下面的代码不会被执行
自己调试的时候使用
详情: 1 https://www.zhihu.com/question/49136398
假设,调用mysql的函数封装位于tools.py文件里,那么新创建一个.py文件来调用此函数,写一个在数据库中查询用户的程序:
1 import tools 2 username=input('plz enter username:').strip() 3 passwd=input('plz enter passwd:').strip() 4 sql='select *from myuser where uname="%s";'%username 5 res=tools.op_mysql( 6 host='127.0.0.1', 7 user='root1', 8 passwd='mysql', 9 db='mysql', 10 sql=sql, 11 port=3306, 12 charset='utf8' 13 ) 14 print(res) 15 if res: 16 if passwd==res[0]['pwd']: 17 print('登录成功') 18 else: 19 print('密码错误') 20 else: 21 print('用户不存在')
MySQLdb提供了两个执行语句的方法,一个是execute(),另一个是executemany()
execute(sql)
可接受一条语句从而执行
executemany(templet,args)
能同时执行多条语句,执行同样多的语句可比execute()快很多,强烈建议执行多条语句时使用executemany
templet : sql模板字符串,
例如 'insert into table(id,name) values(%s,%s)'
args: 模板字符串的参数,是一个列表,列表中的每一个元素必须是元组!!!
例如: [(1,'小明'),(2,'zeke'),(3,'琦琦'),(4,'韩梅梅')]
executemany应用实例
#coding=utf-8 import MySQLdb import traceback tmp = "insert into exch_no_rand_auto(stkcode) values(%s);" #SQL模板字符串 l_tupple = [(i,) for i in range(100)] #生成数据参数,list里嵌套tuple class mymysql(object): def __init__(self): self.conn = MySQLdb.connect( host='127.0.0.1', port = 3306, user = 'root', passwd = '123456', db = 'xtp3') def insert_sql(self,temp,data): cur = self.conn.cursor() try: cur.executemany(temp,data) self.conn.commit() except: self.conn.rollback() traceback.print_exc() finally: cur.close() if __name__ == '__main__': m = mymysql() m.insert_sql(tmp,l_tupple)