zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    ssh反向连接配置
    综合实践
    20199323 2019-2020-2 《网络攻防实践》第12周作业
    20199323 2019-2020-2 《网络攻防实践》第10周作业
    20199323 2019-2020-2 《网络攻防实践》第8周作业
    20199323 2019-2020-2 《网络攻防实践》第6周作业
    20199323 2019-2020-2 《网络攻防实践》第五周作业
    实践三 网络嗅探与协议分析
    20199114 《网络攻防实践》 综合实践
    20199314 2019-2020-2 《网络攻防实践》第12周作业
  • 原文地址:https://www.cnblogs.com/wxcx/p/8332060.html
Copyright © 2011-2022 走看看