python数据库&redis&邮件 l  日志log l  数据库mysql 邮件 l  redis

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

 python数据库&redis&邮件
l  日志log
l  数据库mysql
邮件
l  redis

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:

python数据库&redis&邮件
l  日志log
l  数据库mysql
邮件
l  redis

邮件

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一样

 python数据库&redis&邮件
l  日志log
l  数据库mysql
邮件
l  redis

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)