上下文管理、redis发布订阅、RabbitMQ发布订阅、SQLAlchemy

一、上下文管理

 

import  contextlib
@contextlib.contextmanager
def work_state(state_list,worker_thread):state_list.append(worker_thread)try:yieldfinally:state_list.remove(worker_thread)
free_list=[]
current_thread="alex"
with work_state(free_list,current_thread):print(123)print(456)#以下为执行结果:
123
456

 

代码执行步骤

 

 

上下文用于需要 close()方法的模块

 

import  contextlib
import  socket@contextlib.contextmanager
def context_socket(host,port):sk=socket.socket()sk.bind((host,port))sk.listen(5)try:yield skfinally:sk.close()
with context_socket('127.0.0.1',8888) as sock:print(sock)#以下为执行结果:
<socket.socket fd=224, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8888)>

 

 

 

二、redis 发布订阅

#redis2.py 主程序import  redis
class RedisHelper:def __init__(self):self.__conn=redis.Redis(host='192.168.11.87')def public(self,msg,chan):self.__conn.publish(chan,msg)return  Truedef subscribe(self,chan):pub=self.__conn.pubsub()pub.subscribe(chan)pub.parse_response()return  pub

 

 

订阅

import redis2obj= redis2.RedisHelper()
data=obj.subscribe('fm111.7')
print(data.parse_response())#接收到发布信息:
[b'message', b'fm111.7', b'aaaaaa']

 

发布

import redis2obj= redis2.RedisHelper()
obj.public('alex_db','f111.7')

 

 

三、RabbitMQ

import pika#生产者 发布
connection =pika.BlockingConnection(pika.ConnectionParameters(host='192.168.11.87'))channel = connection.channel()
channel.queue_declare(queue='hello_wuwenyu')                 #创建队列,存在则忽略
channel.basic_publish(exchange='', routing_key='hello_wuwenyu', body='Hello World') print("[x] Sent 'Hello World!'") connection.close


 

 

import pika#消费者 订阅
connection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.11.87'))
channel = connection.channel()
channel.queue_declare(queue='hello_wuwenyu')  #
def callback(ch,method,properties,body):print(" [x] Received %r" % body)
channel.basic_consume(callback,queue='hello_wuwenyu',no_ack=True)
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()#接收到生产者发来的消息:
[*] Waiting for messages. To exit press CTRL+C
[x] Received b'Hello World'

 

  2 exchange 绑定多个队列

#

import pika#生产者 发布
import pika
import sysconnection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.11.87'))
channel = connection.channel()channel.exchange_declare(exchange='logs_fanout',type='fanout')message = '456'
channel.basic_publish(exchange='logs_fanout',routing_key='',body=message)
print(" [x] Sent %r" % message)
connection.close()

 

import pika#订阅
connection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.11.87'))
channel = connection.channel()channel.exchange_declare(exchange='logs_fanout',type='fanout')# 随机创建队列
result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue
# 绑定
channel.queue_bind(exchange='logs_fanout',queue=queue_name)print(' [*] Waiting for logs. To exit press CTRL+C')def callback(ch, method, properties, body):print(" [x] %r" % body)channel.basic_consume(callback,queue=queue_name,no_ack=True)channel.start_consuming()#执行多次消费端,随机产生多个队列,每个队列都接收到消息:
[*] Waiting for logs. To exit press CTRL+C[x] b'456'

 

 关键字

#生产者  severity = 'info'      severity = 'errer'   执行两次
import pika
import sysconnection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.11.87'))
channel = connection.channel()channel.exchange_declare(exchange='direct_logs_wuwenyu',type='direct')severity = 'info'     
# severity = 'errer' message = '123' channel.basic_publish(exchange='direct_logs_wuwenyu',routing_key=severity,body=message) print(" [x] Sent %r:%r" % (severity, message)) connection.close()

 

 

#订阅 消费 客户端1
import pika
import sysconnection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.11.87'))
channel = connection.channel()channel.exchange_declare(exchange='direct_logs_wuwenyu',type='direct')result = channel.queue_declare(exclusive=True)
queue_name = result.method.queueseverities =  ['error','info','warning']for severity in severities:channel.queue_bind(exchange='direct_logs_wuwenyu',queue=queue_name,routing_key=severity)print(' [*] Waiting for logs. To exit press CTRL+C')def callback(ch, method, properties, body):print(" [x] %r:%r" % (method.routing_key, body))channel.basic_consume(callback,queue=queue_name,no_ack=True)channel.start_consuming()#接受到的消息:[*] Waiting for logs. To exit press CTRL+C[x] 'error':b'123'[x] 'info':b'123'

 

 

#订阅 消费 客户端2
import pika
import sysconnection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.11.87'))
channel = connection.channel()channel.exchange_declare(exchange='direct_logs_wuwenyu',type='direct')result = channel.queue_declare(exclusive=True)
queue_name = result.method.queueseverities =  ['error',]for severity in severities:channel.queue_bind(exchange='direct_logs_wuwenyu',queue=queue_name,routing_key=severity)print(' [*] Waiting for logs. To exit press CTRL+C')def callback(ch, method, properties, body):print(" [x] %r:%r" % (method.routing_key, body))channel.basic_consume(callback,queue=queue_name,no_ack=True)channel.start_consuming()
#接受到的消息:[*] Waiting for logs. To exit press CTRL+C[x] 'info':b'123'

 

四、SQLAlchemy

SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。

Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:

MySQL-Python
mysql+mysqldb://:@[:]/pymysql
mysql+pymysql://:@/[?]MySQL-Connector
mysql+mysqlconnector://:@[:]/cx_Oracle
oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html

 


步骤一:

使用 Engine/ConnectionPooling/Dialect 进行数据库操作,Engine使用ConnectionPooling连接数据库,然后再通过Dialect执行SQL语句。

#!/usr/bin/env python
# -*- coding:utf-8 -*-fromsqlalchemy importcreate_engineengine =create_engine("mysql+mysqldb://root:123@127.0.0.1:3306/s11", max_overflow=5)engine.execute(
"INSERT INTO ts_test (a, b) VALUES ('2', 'v1')"
)engine.execute(
"INSERT INTO ts_test (a, b) VALUES (%s, %s)",
((555, "v1"),(666, "v1"),)
)
engine.execute(
"INSERT INTO ts_test (a, b) VALUES (%(id)s, %(name)s)",
id=999, name="v1"
)result =engine.execute('select * from ts_test')
result.fetchall()

 


事务操作

注:查看数据库连接:show status like 'Threads%';

步骤二:

使用 Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 进行数据库操作。Engine使用Schema Type创建一个特定的结构对象,之后通过SQL Expression Language将该对象转换成SQL语句,然后通过 ConnectionPooling 连接数据库,再然后通过 Dialect 执行SQL,并获取结果。

#!/usr/bin/env python
# -*- coding:utf-8 -*-fromsqlalchemy importcreate_engine, Table, Column, Integer, String, MetaData, ForeignKeymetadata =MetaData()user =Table('user', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(20)),
)color =Table('color', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(20)),
)
engine =create_engine("mysql+mysqldb://root:123@127.0.0.1:3306/s11", max_overflow=5)metadata.create_all(engine)
# metadata.clear()
# metadata.remove()

 


增删改查

更多内容详见:

    http://www.jianshu.com/p/e6bba189fcbd

    http://docs.sqlalchemy.org/en/latest/core/expression_api.html

注:SQLAlchemy无法修改表结构,如果需要可以使用SQLAlchemy开发者开源的另外一个软件Alembic来完成。

步骤三:

使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有组件对数据进行操作。根据类创建对象,对象转换成SQL,执行SQL。

#!/usr/bin/env python
# -*- coding:utf-8 -*-fromsqlalchemy.ext.declarative importdeclarative_base
fromsqlalchemy importColumn, Integer, String
fromsqlalchemy.orm importsessionmaker
fromsqlalchemy importcreate_engineengine =create_engine("mysql+mysqldb://root:123@127.0.0.1:3306/s11", max_overflow=5)Base =declarative_base()classUser(Base):
__tablename__ ='users'
id=Column(Integer, primary_key=True)
name =Column(String(50))# 寻找Base的所有子类,按照子类的结构在数据库中生成对应的数据表信息
# Base.metadata.create_all(engine)Session =sessionmaker(bind=engine)
session =Session()# ########## 增 ##########
# u = User(id=2, name='sb')
# session.add(u)
# session.add_all([
#     User(id=3, name='sb'),
#     User(id=4, name='sb')
# ])
# session.commit()# ########## 删除 ##########
# session.query(User).filter(User.id > 2).delete()
# session.commit()# ########## 修改 ##########
# session.query(User).filter(User.id > 2).update({'cluster_id' : 0})
# session.commit()
# ########## 查 ##########
# ret = session.query(User).filter_by(name='sb').first()# ret = session.query(User).filter_by(name='sb').all()
# print ret# ret = session.query(User).filter(User.name.in_(['sb','bb'])).all()
# print ret# ret = session.query(User.name.label('name_label')).all()
# print ret,type(ret)# ret = session.query(User).order_by(User.id).all()
# print ret# ret = session.query(User).order_by(User.id)[1:3]
# print ret
# session.commit()

 

 

  

  

  

转载于:https://www.cnblogs.com/wudalang/p/5700242.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript进阶(下)

指定分隔符连接数组元素join() join()方法用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的。 语法&#xff1a; arrayObject.join(分隔符) 参数说明: 注意&#xff1a;返回一个字符串&#xff0c;该字符串把数组中的各个元素串起来&#xff0c;用<…

ongl 表达式

struts.xml简单配置 <!-- &#xff08;默认false&#xff09;设置ognl表达式是否支持静态方法 --><constant name"struts.ognl.allowStaticMethodAccess" value"true"></constant><package name"ognl" namespace"/ogn…

Python开发-- Lesson 2--Python数据类型(2016/07/30)

1、文件操作 python中对文件、文件夹&#xff08;文件操作函数&#xff09;的操作需要涉及到os模块和shutil模块。 得到当前工作目录&#xff0c;即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir() 函数用来删除一个文件:os.remove(…

oracle什么是重复组,规范化:“重复组”是什么意思?

扬帆大鱼英语的价值一次又一次地重复。这是重复组吗&#xff1f;不。在SUBJECT_MODULE中英语的多次出现不是重复组&#xff0c;甚至不是人们误认为重复组的两件事中的任何一个。它们也不是冗余或缺乏规范化的证据。这样的多个外观可能与冗余或规范化有关&#xff0c;但是在没有…

清除浮动php,CSS清除浮动

今天看到一篇文章关于清除浮动的&#xff0c;突然间脑袋短路了&#xff0c;咦&#xff1f;为什么要清除浮动&#xff1f;原谅我的无知&#xff0c;搜了下原来是这样&#xff0c;又倒腾出原来的笔记&#xff0c;唉&#xff0c;本来就有记录啊&#xff0c;而且也会经常用到&#…

Linux下使用Speedtest测试网速

导读Speedtest是用来测试网络性能的开源软件&#xff0c;在Linux下面安装Speedtest可以用来测试网络出口的上传和下载速度&#xff0c;帮助排查网络方面导致的故障。Speedtest介绍由于公司几个项目用户访问的时候响应较慢&#xff0c;项目本身没问题&#xff0c;服务及调用的接…

iOS开发ARC内存管理

本文的主要内容&#xff1a; ARC的本质ARC的开启与关闭ARC的修饰符ARC与BlockARC与Toll-Free BridgingARC的本质 ARC是编译器&#xff08;时&#xff09;特性&#xff0c;而不是运行时特性&#xff0c;更不是垃圾回收器(GC)。 Automatic Reference Counting (ARC) is a compile…

php 实时查看公众号加粉数据,公众号实时涨粉数据怎么查看

公众号文章发布后如何查看涨粉效果&#xff1f;怎么根据发文情况来调整公众号运营方向呢&#xff1f;这款能监控实时涨粉数据的我们在进行公众号运营时&#xff0c;除了是简单的写文、排版、推送&#xff0c;还需要通过优质的内容不断吸引新用户快速发展新用户&#xff0c;将公…

iOS - UITextField

前言 NS_CLASS_AVAILABLE_IOS(2_0) interface UITextField : UIControl <UITextInput, NSCoding>available(iOS 2.0, *) public class UITextField : UIControl, UITextInput, NSCoding 1、UITextField 的创建 Objective-C // 实例化 UITextField 对象UITextFi…

微信php翻译和天气预报整合,微信公众平台天气预报功能开发

本来是想自己直接从中国天气网获取信息并处理&#xff0c;后来发现处理起来太麻烦&#xff0c;而且要获取所有城市的城市编码&#xff0c;再有就是&#xff01;不支持国外天气&#xff01;&#xff01;(我们学校有很多毕业生在国外上学&#xff0c;所以我考虑还是做出支持国外天…

关于Jenkins找不到依赖Jar包问题

昨晚在Jenkins发布时遇到一个Jar包找不到的问题&#xff0c;控制台的报错信息如下&#xff1a; 说白了就是找不到依赖的Jar包&#xff0c;但是当我们回退到灰度的时候发现灰度的环境是构建是没有问题的&#xff0c;为什么同一套代码在两个环境却有天壤之别呢&#xff0c;本着试…

VBS基础篇 - Dictionary对象

VBS基础篇 - Dictionary对象 Dictionary是存储数据键和项目对的对象&#xff0c;其主要属性有Count、Item、Key&#xff0c;主要方法有Add、Exists、Items、Keys、Remove、RemoveAll。 建立字典 Dim Dict : Set Dict CreateObject("Scripting.Dictionary")添加键值对…

linux编译mesa,如何在Ubuntu 16.04,17.10中安装Mesa 17.3.3

最新的MESA 3D图形库17.3.3现在在Ubuntu-X team PPA存储库中为Ubuntu 16.04和Ubuntu 17.10提供。Mesa 17.3.3实现了OpenGL 4.5 API&#xff0c;但由glGetString(GL_VERSION)或glGetIntegerv(GL_MAJOR_VERSION)/glGetIntegerv(GL_MINOR_VERSION)报告的版本取决于所使用的特定驱动…

iOS开发Swift篇—(三)字符串和数据类型

一、字符串 字符串是String类型的数据&#xff0c;用双引号""包住文字内容 let website "http://www.github.com" 1.字符串的常见操作 &#xff08;1&#xff09;用加号 做字符串拼接 let scheme "http://" let path “www.github.com” le…

linux查看xml文件的配置,3、kvm虚拟机日常管理与配置

KVM虚拟机的管理主要是通过virsh命令对虚拟机进行管理。1. 查看KVM虚拟机配置文件及运行状态(1) KVM虚拟机默认配置文件位置: /etc/libvirt/qemu/autostart目录是配置kvm虚拟机开机自启动目录。(2) virsh命令帮助# virsh -help或直接virsh命令和&#xff0c;再执行子命令。如下…

linux桌面环境是什么意思,Linux 黑话解释:什么是桌面环境?

在桌面 Linux 世界中&#xff0c;最常用的术语之一就是 桌面环境(Desktop Environment)(DE)。如果你是 Linux 的新手&#xff0c;你应该了解一下这个经常使用的术语。什么是 Linux 中的桌面环境?桌面环境是一个组件的组合体&#xff0c;为你提供常见的 图形用户界面(graphical…

Hadoop 2.5.1集群安装配置

本文的安装只涉及了hadoop-common、hadoop-hdfs、hadoop-mapreduce和hadoop-yarn&#xff0c;并不包含HBase、Hive和Pig等。 http://blog.csdn.net/aquester/article/details/24621005 1. 规划 1.1. 机器列表 NameNode SecondaryNameNode DataNodes 172.16.0.100 172.16.0.…

ubuntu14.04 x86编译upx 3.92 及so加固

的参考文章&#xff1a; http://www.cnblogs.com/fishou/p/4202061.html 1.download upx和所依赖的组件 upx3.92&#xff1a;https://www.pysol.org:4443/hg/upx.hg/archive/tip.tar.gzLZMA4.43&#xff1a;http://nchc.dl.sourceforge.net/project/sevenzip/LZMA%20SDK/4.43/l…

关闭linux系统中读写页缓存,Linux文件系统FAQ

Linux文件系统FAQ2010年03月25日最近实验室搞了一些列讲座&#xff0c;阿福师兄关于文件系统的讲座帮我弄清楚了一些以前不清楚的问题&#xff0c;以问答的形式对文件系统常见的问题进行了总结。Q: 文件系统如何看待底层物理块设备&#xff1f;文件系统把块设备简单的看做线性的…

Unity3d 札记-Let's try shooting 知识点汇总

1\LineRenderer LineRenderer是用来在3d场景画直线的一个工具。 public LineRenderer laserline;laserline.SetPositon(0,startposition);laserline.SetPositon(1,endposition);//设置结束位置startpositon,endposition均为Vector3 ,空间三维坐标 laserline.enabled(true); las…