提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、上下文管理器存在的意义是什么?
上下文管理器对象存在的目的是管理with语句,就像迭代器的存在是为了管理for语句,with语句的目的是简化try/finally模式。这种模式用户保证一段代码运行完毕后执行某项操作,即便那段代码由于异常,return语句或sys.exit()调用而中止,也会执行指定的操作。finally子句中的代码通常由于释放重要的资源,或者还原临时变更的状态.
二、使用步骤
1.演示把文件对象当成上下文管理器使用(上下文管理器的基本使用)
上下文管理器协议包含__enter__和__exit__两个方法.with语句运行时,会在上下文管理器对象上调用__enter__方法.with语句运行结束后,会在上下文管理器上调用__exit__方法,以此扮演finally子句的角色
代码如下(示例):
with open('mirror.py') as p:
src = fp.read(60)
2.使用上下文管理器对mysql的链接
代码如下
# 这里的mysql部署方式是采用kubernetes的StatefulSet部署,通过service的NodePort暴漏出来,所有这里的port 不是3306
class Mysql():
def __init__(self):
self.user = 'root'
self.passwd = '1'
self.host = '172.16.10.200'
self.database = 'day62'
self.port = 30453
self.charset = 'utf8'
def __enter__(self):
self.db = pymysql.connect(user=self.user, passwd=self.passwd, host=self.host, database=self.database,
port=self.port, charset=self.charset)
self.cursor = self.db.cursor()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.db.close()
with Mysql() as f: # as 后面的是调用__enter__方法返回出来的结果
f.cursor.execute("select * from app01_user")
print(f.cursor.fetchall())
mysql部署yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-python
labels:
app: mysql-python
spec:
serviceName: mysql-service
selector:
matchLabels:
app: mysql-python
template:
metadata:
name: mysql-python
labels:
app: mysql-python
spec:
volumes:
- name: mysql
hostPath:
path: /mnt
containers:
- name: mysql
image: bingozhou/mysql5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: '1'
- name: MYSQL_DATABASE
value: 'day62'
ports:
- name: mysql
containerPort: 3306
volumeMounts:
- name: mysql
mountPath: /var/lib/mysql
---
apiVersion: v1
kind: Service
metadata:
name: mysql-service
spec:
selector:
app: mysql-python
ports:
- name: mysql
port: 3306
type: NodePort
有什么不对的地方,请求各位大佬,指点指点