• python数据库&redis&邮件


    l  日志log

    https://cloud.tencent.com/developer/article/1086872

     

    warnings.simplefilter()   --

    l  数据库mysql

    https://blog.csdn.net/guofeng93/article/details/53994112

    python3.0使用pymysql数据库包,mysql客户端可以使用SQLyong/Navicat

    pip install PyMySQL

    import pymysql

    1. 工作原理

    l  创建连接

    l  创建游标对象(sql语句的执行,获取结果等都是在游标上操作的)

    l  关闭游标和数据库连接

    1. 各流程对应的方法

    1         创建数据库连接

    db = pymysql.connect(host=?,user=?,possword=?,database=?,port=3306,charset=utf8, cursorclass=Cursor, autocommit=False)

    database:指定的数据库

    charset:指定的字符编码

    cursorclass:指定游标

    autocommit:False代表sql dml语句不自动提交

    # 检查连接是否断开,如果断开就进行重连
    self.conn.ping(reconnect=True)

    2         游标

    创建游标,mysql的各种操作都是基于游标进行操作, 一个连接可以创建多个游标,互相不干扰

    创建游标对象

    cursor = db.cursour(cursor=None)

    默认创建的游标类型是pymysql.cursors. Cursor;在这里可以创建不同的游标类型;也可以在connection连接中指明cursor类型

    游标类型

    l  缓存式游标

    pymysql.cursors. Cursor 默认,该游标fetch返回的数据是元组类型(12,14)

    pymysql.cursors. DictCursor该游标fetch返回的数据是字典类型{‘name’:12,’age’:14}

    缓存式游标,不管是fetchone还是fetchall在执行语句时候会一次性返回所有的数据到客户端,当数据量特别大,会占用大量内存,导致内存溢出;大数据可以使用非缓存式游标

    l  非缓存式游标

    pymysql.cursors. SSCursor默认,该游标fetch返回的数据是元组类型(12,14)

    pymysql.cursors. SSDictCursor该游标fetch返回的数据是字典类型{‘name’:12,’age’:14}

    注:因为 SSCursor 是没有缓存的游标,结果集只要没取完,这个 conn 是不能再处理别的 sql,包括另外生成一个 cursor 也不行的。如果需要干别的,请另外再生成一个连接对象。

    每次读取后处理数据要快,不能超过 60 s,否则 mysql 将会断开这次连接,也可以修改 SET NET_WRITE_TIMEOUT = xx 来增加超时间隔。

    游标相关操作

    执行sql语句

    l  执行单条SQL

    cursor.execute(sql语句)    --执行sql语句,并返回影响行数

    l  批量执行sql语句

    cursor.executemany(templet,args) 能同时执行多条语句

    templet:sql模板字符串

    args:模板字符串参数列表,列表中每个元素必须是元组

    示列:

    cursor.executemany(“insert into values %s,%s”,[(20,30),(10,20)]) ,执行2条sql语句

    获取数据

    执行查询sql后,需要获取查询出的记录;sql执行后,游标cursor指向第一条数据之前的位置,通过fetch移动游标来获取数据

    l  获取剩余的所有记录

    cursor.fetchall()

    该方法会获取游标位置之后的所有记录

    l  指定每次获取n条记录

    cursor.fetchmany([n])

    该方法每次调用会获取游标位置后的n条记录,执行一次,游标移动n条记录

    l  指定每次获取1条记录

    cursor.fetchone()  

    该方法每次调用会获取游标位置后的1条记录,执行一次,游标移动1条记录

    l  返回记录总数

    cursor.rowcount() 

    该方法返回游标最后一次exeute返回数据的行数;即记录总数

    l  返回游标的位置

    cursor.rownumber()  --返回当前游标的位置

    注:1.数据取完返回None

    2.cursor游标fetch到的记录返回类型,根据设置的游标类型来定的;Cursor游标返回元组类型;DictCursor游标返回字典类型

    关闭游标

    l  手动关闭游标

    游标执行完后,执行cursor.closed()关闭游标

    l  with语句自动关闭游标

    conn = sql连接

    try:

             with conn.cursor() as cursor :

                       result = cursor.execute(…)

             conn.commit

    finally:

             conn.close()

    注:游标使用with,可以自动在with语句结束后,自动关闭游标

    3         事务提交&回滚

    l  提交DML

    默认创建connection连接时自动提交设置为false,对于DML操作,不会自动提交,需要用户手动提交;也可以设置自动提交为True,那么对应的DML操作会自动提交的

    conn.commit()   --手动提交

    conn. autocommit(True)  --设置自动提交;或者在创建connection时参数autocommit=True

    l  DML数据回滚

    conn.rollback()

    一般在执行DML语句出错后回滚;对于未提交的数据可以执行数据回滚

    4         关闭连接

    conn.close()

    样例

    示列1:

    邮件

    pip install zmail

    使用之前确认你的邮件打开smtp/pop3功能

    连接邮件服务器

    server = zmail.server(username,psd,smtp_host=’smt.163.com’,smtp_port=994,smtp_ssl=True,pop_host=’pop.163.com’,pop_port=995,pop_tls=True)

    l  校验smtp和pop功能是否正常

    server.stmp_able()/server.pop_able()  返回true代表正常

     

    注:如果发件人邮箱是QQ邮箱,密码要使用授权码

    获取邮件

    l  获取最新邮件

    mail=server.get_latest()

    l  通过ID检索邮件

    mail=server.get_mail(2)

    l  根据主题&发件人等搜索邮件

    mail=server.get_mails(subject=‘主题关键字’,start_time=‘开始时间’,sender=‘发件人’,start_index=‘指定开始范围’,end_index=‘结束范围’)

    注:返回数组,其中主要主题包含subject就会被搜索到,start_index/end_index是指从第几条搜索到第几条

    l  获取邮箱信息

    server.stat()返回(邮件条数,邮箱大小)

    解析邮件内容

    mail返回的是字典,邮件都映射到字典中,mail[‘subject’]  --获取邮件的主题

    l  显示邮件

    zmail.show(mail)

    l  获取邮件信息

    mail[‘subject’],mail返回的是字典

    发送邮件

    server.send_mail(recip,mail, cc=None, timeout=None)

    recip:收件人,可以是str/list:‘aa@163.com’/[‘aa@163.com’,’nn@163.com’]

    mail:邮件内容,dict类型,dict中固定key如下:

             ‘subject’:主题

             ‘content_text’:发送文本内容

             ‘content_html’:发送html内容,html文件的字符串内容,需要f.read()出来

             ’attachments‘:附件list,使用绝对路径

    cc:抄送人,同recip一样

     

    l  redis

    http://www.cnblogs.com/hjc4025/p/709615.html

    import redis

    1       工作原理

    l  redis连接池,连接池相当于缓存了多个客户端与redis服务端的连接,当有新的客户端来进行连接时,只需要去连接池获取一个连接即可,实际上连接池就是把一个连接共享给多个客户端,类似广播

    2       流程

    3         连接池

    conn_pool = redis.connectionPool(host=,port = ,posswd= ,db=,decode_response=False)

    decode_response:默认False,结果返回的是二进制;True返回字符串

    4         客户端访问

    l  客户端使用连接池链接访问

    re_pool = redis.Redis(Connection_pool=conn_pool)

    l  客户端直接访问

    re_pool = redis.Redis(host=’’,port=’’…)

    l  另一个客户端连接池访问

    re_pool1 = redis.Redis(Connection_pool=conn_pool)

    注:redis每次客户端只能请求一个指令,如果想同时请求多个指令,需要使用管道

    re_pool.pipline(transaction=True)

    知道、想到、做到、得到
  • 相关阅读:
    MultipartFile 多文件上传的应用
    启动关闭zookeeper集群的脚本
    分布式锁
    NFS部署教程
    Docker安装(Debian8)-构建简单的SpringBoot应用
    Nginx实战-后端应用健康检查
    分布式文件系统FastDFS安装教程
    Redis缓存使用技巧
    WebSocket原理与实践
    HashMap中ConcurrentModificationException异常解读
  • 原文地址:https://www.cnblogs.com/Durant0420/p/14440333.html
Copyright © 2020-2023  润新知