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)
原文地址:https://www.cnblogs.com/wxcx/p/8332060.html