使用python上下文管理器实现对mysql的链接

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、上下文管理器存在的意义是什么?

上下文管理器对象存在的目的是管理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

有什么不对的地方,请求各位大佬,指点指点 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忙里偷闲学python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值