python 连接数据库

news2024/12/23 23:15:49

文章目录

  • 同步操作
    • 同步连Mysql
    • 同步连redis
    • 同步连mongodb
  • 异步操作
    • 异步连mysql
    • 异步连redis
    • 异步连mongodb

同步操作

同步连Mysql

python 连接mysql可以使用pymysql、mysqlclient等。

安装

# win
pip install pymysql 

连接mysql:

# __author__ = "laufing"
import pymysql


# 连接
conn = pymysql.connect(host="localhost", port=3306, user="lauf", password="xxx", # 太长直接换行
                       database="test_lauf", charset="utf8")
# 开启事务
conn.begin()

# 获取游标
cursor = conn.cursor()
# 执行操作
cursor.execute("create table if not exists stu(id int primary key auto_increment, name varchar(50) unique , age int, price decimal, "
               "birth date)engine=innodb;") # innodb 支持事务、外键;行级锁
cursor.execute("insert into stu(id, name, age, price, birth) values (1, 'jack', 12, 20.4, '2000-01-20'),"
               "(2, 'lucy', 18, 300.5, '1990-05-23');")

# ...

# 尝试回滚  不会删除已创建的表
# conn.rollback()

# 提交
conn.commit()


# 最后关闭
cursor.close()
conn.close()

以上cursor操作部分,可以使用with来操作。

自定义上下文管理器,实现数据库的连接:

  1. 进入with作用域前,连接db、开启事务、 并获取游标;
  2. with作用域实现sql操作;
  3. with作用域结束退出时
# __author__ = "laufing"
import pymysql


# 自定义上下文管理器
class LaufConnectMysql():
    def __init__(self, **kwargs):
        # kwargs 收集 pymysql连接db的参数  + transaction: bool
        transaction = kwargs.pop("transaction")
        self.conn = pymysql.connect(**kwargs)
        self.cursor = None
        if transaction:
            # 开启事务
            self.conn.begin()

    def __enter__(self):
        """ 进入with作用域前 即执行"""
        print("进入with作用域前的准备工作(as)...")
        # 返回什么,with xxx as xxx, as 后面拿到的就是什么
        # 返回cursor游标对象
        self.cursor = self.conn.cursor()
        self.cursor.conn = self.conn
        return self.cursor

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("退出with作用域的收尾工作...")
        # 关闭游标
        self.cursor.close()
        # 关闭连接
        self.conn.close()
        # 防止内存泄漏


if __name__ == '__main__':
    # 连接db的参数
    kw_args = {
        "host": "localhost",
        "port": 3306,
        "user": "lauf",
        "password": "xxx",
        "database": "test_lauf",
        "charset": "utf8",
        "transaction": True
    }

    # with 操作
    with LaufConnectMysql(**kw_args) as cursor:  #
        print("with作用域:", cursor, type(cursor))
        # 执行操作
        try:
            cursor.execute("create table if not exists stu(id int primary key auto_increment, name varchar(50) unique , age int, price decimal, "
                           "birth date)engine=innodb;") # innodb 支持事务、外键;行级锁
            cursor.execute("insert into stu(id, name, age, price, birth) values (1, 'jack', 12, 20.4, '2000-01-20'),"
                           "(1, 'lucy', 18, 300.5, '1990-05-23');")
        except Exception as e:
            print("sql操作异常:", e.args)
            cursor.conn.rollback()
        finally:
            cursor.conn.commit()

在这里插入图片描述

同步连redis

python 同步连接redis可以使用redis包。
安装

# win
pip install redis

连接redis

import redis


conn = redis.Redis(host="localhost", port=6379, db=0)
print(conn.exists("user_1"))

使用连接池


import redis


# 创建连接池
pool = redis.ConnectionPool(host="localhost", port=6379, db=0, max_connections=30)

# 创建一个连接
conn = redis.Redis(connection_pool=pool)
print(conn.type("user_1"))
# 创建第二个连接
conn1 = redis.Redis(connection_pool=pool)
print(conn1.exists("count1"))

同步连mongodb

python同步连接mongodb可以使用pymongo包。

 
 

异步操作

  1. 基于协程的异步;
  2. 基于线程池、进程池的异步;

异步连mysql

异步连接mysql使用aiomysql(基于协程);
若没有对应的异步操作模块,则考虑使用线程池&进程池实现。
安装

pip install aiomysql

异步连接mysql:

import asyncio
import aiomysql  # 基于pymysql实现


async def main():
    # 异步连接mysql
    conn = await aiomysql.connect(host="localhost", port=3306, user="lauf",
                            password="xxx", db="test_lauf")
    # 开启事务
    await conn.begin()
    # 获取游标
    cur = await conn.cursor()

    # 执行sql
    try:
        await cur.execute("create table if not exists asyncstu(id int primary key auto_increment, "
                          "name varchar(50));")
        await cur.execute("insert into asyncStu(id, name) values(1, '666');")
    except Exception as e:
        print("sql操作异常:", e.args)
        # 回滚
        await conn.rollback()
    finally:
        # 提交
        await conn.commit()
    # 查询
    await cur.execute("select * from asyncstu;")
    result = await cur.fetchall()
    print("查询的结果:", result)

    # 关闭游标
    await cur.close()
    conn.close()



# 普通的阻塞式函数
def func():
	# 开启事件循环 
    asyncio.run(main())


if __name__ == '__main__':
    func()

使用async def定义的协程函数,必须执行才返回协程对象;
协程对象必须在asyncio的事件循环中执行
 

异步连redis

# pip install aioredis

import asyncio
import aioredis


async def connect(host, port):
    # 连接是IO操作
    conn = await aioredis.Redis(host=host, port=port)
    # 读写是IO操作
    result = await conn.keys("*")
    print("all keys:", result)

    # 断开连接是IO操作
    await conn.close()


if __name__ == '__main__':
    asyncio.run(connect("localhost", 6379))

 

异步连mongodb

python中无aiopymongo,可以考虑使用线程池完成异步连接mongodb。

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

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

相关文章

Java各种锁

目录 一、读写锁(ReentrantReadWriteLock) 二、非公平锁(synchronized/ReentrantLock) 三、可重入锁/递归锁(synchronized/ReentrantLock) 四、自旋锁(spinlock) 五、乐观锁/悲观锁 六、死锁 1、死锁代码 2、死锁的检测(jps -l 与 jstack 进程号) 本文通过学习&#xff…

Spring——Spring介绍和IOC相关概念

Spring是以Spring Framework为核心,其余的例如Spring MVC, Spring Cloud,Spring Data,Spring Security SpringBoot的基础都是Spring Framework。 Spring Boot可以在简化开发的基础上加速开发。 Spring Cloud分布式开发 Spring有…

SAP MM学习笔记6-SAP要怎么学

SAP还是很复杂的,学习之前,了解学习技巧很重要。 根据前辈经验,SAP学习技巧大致总结为如下三个,供大家参考。 1,忘了自己技术者的身份,控制追求技术细节的冲动 软件行业经常听到一句话,什么都…

Python进阶-----面对对象6.0(绑定方法[类方法、静态方法]与内置方法)

目录 前言: 1.绑定方法 (1)实例方法 (2)类方法 (3)静态方法 2.类型检测 (1)issubclass() 函数 (2)isinstance() 函数 3.内置方法&#xf…

【Verilog】——赋值语句、结构语句、块语句

目录 1.常用语句 2.块语句 1.顺序块 2.并行块 ​ 3.结构语句 1.always 2.initial 4.赋值语句 1.非阻塞赋值 2.阻塞赋值 3.非阻塞赋值和阻塞赋值的区别 4.深入理解阻塞赋值和非阻塞赋值 声明信号的时候统一大数在高位,小数在低位 比如:reg [3:…

多线程篇之8锁问题、字节码看Synchronized

八锁问题 ①. 标准访问有ab两个线程,请问先打印邮件还是短信 ②. sendEmail方法暂停3秒钟,请问先打印邮件还是短信 ③. 新增一个普通的hello方法,请问先打印邮件还是hello ④. 有两部手机,请问先打印邮件还是短信 ⑤. 两个静态同步方法,同1部手机,请问先打印邮件还是短信 ⑥. …

【数据库系列】MQSQL历史数据分区

互联网行业企业都倾向于mysql数据库,虽说mysql单表能支持亿级别的数据量,加上索引优化下查询速度,勉强能使用,但是对于追求性能和效率的互联网企业,这是远远不够的。Mysql数据库单表数据量到达500万左右,达…

第四讲:如何将本地代码与服务器代码保持实时同步

一、前言 在我们进行 Ambari 二次开发时,通常会先在服务器上部署一套可以使用的 Ambari 环境。 二次开发,就肯定是要改动代码的,我们不能老是在服务器上用vim编辑文件,那样效率太低,始终不是长久之计。 所以我们需要在本地打开我们的Ambari源码项目,比如用idea工具,可…

【电子学会】2022年12月图形化二级 -- 绘制风车

绘制风车 1. 准备工作 (1)隐藏默认的小猫角色; (2)选择背景:“Xy-grid”。 2. 功能实现 (1)小猫角色的初始位置为(x:0,y:0); (2)线条粗细为…

实验4 设计模式实验3

实验内容: 1. 某软件公司为新开发的智能手机控制与管理软件提供了一键备份功能,通 过该功能可以将原本存储在手机中的通信录、短信、照片、歌曲等资料一次性全 部拷贝到移动存储介质(例如MMC 卡或SD 卡)中。在实现过程中需要与多个 已有的类进行交互,例如通讯录管理类、短信…

黑马Spring学习笔记(四)——面向切面编程AOP

目录 一、AOP简介 二、AOP核心概念 三、AOP入门案例 四、AOP配置管理 4.1 AOP切入点表达式 4.1.1 语法格式 4.2.2 通配符 4.2.3 书写技巧 4.2 AOP通知类型 4.2.1 前置、后置、返回后、抛出异常后获取参数 4.2.2 环绕通知 一、AOP简介 AOP(Aspect Oriented Pro…

【IoT】创业成功不可或缺的两个因素:能力和趋势

今天就来谈谈能力和趋势究竟哪个更重要的问题。 在谈成功的十大要素时,我曾经讲到: 一命、二运、三风水,这三个要素几乎不涉及任何个人的努力。 而趋势跟这三个要素又是息息相关的,这也类似雷军所说的飞猪理论。 只要风足够大&…

Centos7(阿里云)_安装Mysql8.0

1.安装MySQL 新人可以试用一个月的阿里云,centos7的 一开始可能确实会自带mariadb,所以可以在网上随便找个教程开始尝试安装MySQL,当然大概率出错,然后此时你的rpm下面已经有了一个版本的mysql安装包。 以我为例,随便…

Windows下jdk安装与卸载-超详细的图文教程

jdk安装 下载jdk 由于现在主流就是jdk1.8,所以这里就下载jdk1.8进行演示。官方下载地址:https://www.oracle.com/java/technologies/downloads/#java8-windows。 官方下载需要注册oracle账号,国内下载有可能速度慢,若不想注册账…

【Linux】P5 实用快捷键 以及 下载安装指令

Linux实用快捷键与下载安装实用快捷键强制停止退出账户 / 环境查看历史命令光标移动快捷键清屏下载安装命令CentOS - yumUbunto - apt实用快捷键 强制停止 CTRL C当程序陷入死循环或者执行错误,可通过该命令强制停止 当程序输入很长但是发现错误,不想…

PDF 解析格式化输出 API 数据接口

PDF 解析格式化输出 API 数据接口 支持输出 TEXT HTML XML TAG,多种格式输出,超精准识别率。 1. 产品功能 通用的识别接口, 支持标准 PDF 文件解析;多种格式输出,支持 TEXT HTML XML TAG;HTML 包含完美排…

蒙特卡洛树搜索(MTCS)

一、目标 一种启发式的搜索算法,在搜索空间巨大的场景下比较有效 算法完成后得到一棵树,这棵树可以实现:给定一个游戏状态,直接选择最佳的下一步 二、算法四阶段 1、选择(Selection) 父节点选择UCB值最…

【ONE·C || 文件操作】

总言 C语言:文件操作。    文章目录总言1、文件是什么?为什么需要文件?1.1、为什么需要文件?1.2、文件是什么?2、文件的打开与关闭2.1、文件指针2.2、文件打开和关闭:fopen、fclose2.3、文件使用方式3、文…

windows下go安装并使用protobuf

go使用protobuf的过程以及可能出现的问题1. 下载proto windows版本并安装2. 安装protoc-gen-go3. proto文件转go文件报错protoc-gen-go: unable to determine go import path for "xxxx.proto"4. 生成的go文件中google.golang.org/protobuf/reflect/protoreflect依赖…

Zookeeper3.5.7版本——客户端命令行操作(znode 节点数据信息)

目录一、命令行语法二、znode 节点数据信息2.1、查看当前znode中所包含的内容2.2、查看当前节点详细数据2.3、节点详细数据解释一、命令行语法 命令行语法列表 命令基本语法功能描述help显示所有操作命令ls path使用 ls 命令来查看当前 znode 的子节点 [可监听]-w 监听子节点变…