Python:使用Cator实现mysql数据库的CURD简化操作

目录

    • 简介
    • 安装
    • 使用示例
      • 1、获取Database 对象
      • 2、Database对象
      • 3、Table操作
    • 支持的占位符
    • 显示sql日志
    • 注意问题

  • Github: https://github.com/mouday/cator
  • Pypi: https://pypi.org/project/cator
  • gitee: https://gitee.com/mouday/cator

简介

支持 mysql和sqlite数据库, 在现有连接对象Connection 基础上进行增强

返回数据统一为dict 字典,提高脚本书写速度

安装

pip install cator

支持的mysql连接库(任选其一即可):

  • pymysql
  • mysql-connector-python
  • mysqlclient

使用示例

1、获取Database 对象

Database 可以适用各种场景

import cator# mysql 
db_url = "mysql://root:123456@127.0.0.1:3306/data?charset=utf8&autocommit=true"# open Database
db = cator.connect(db_url)# close
db.close()

支持的连接url,其他参数可参考所使用的链接库的文档

# mysql autocommit=true参数指定自动提交
mysql://root:123456@127.0.0.1:3306/data?charset=utf8&autocommit=true# mysql+reconnect 模式可以指定断线重连
mysql+reconnect://root:123456@127.0.0.1:3306/data?autocommit=true# sqlite
sqlite:///data.db?isolation_level=null

2、Database对象

CURD使用示例

创建测试表

create table if not exists person (id int PRIMARY KEY auto_increment,name varchar(20),age int
)

CURD

# 执行原样sql 返回cursor对象
cursor = db.execute("show tables")# insert
sql = "insert into person (`name`, `age`) values (:name, :age)"
data = [{'name': 'Tom', 'age': 23}]
row_count = db.insert(sql, data)
print(row_count) # 1# insert_one
sql = "insert into person (`name`, `age`) values (:name, :age)"
data = {'name': 'Tom', 'age': 23}
row_id = db.insert_one(sql, data)
print(row_id) # 5# select
sql = 'select * from person limit :limit'
data = {'limit': 1}
rows = db.select(sql, data)
# [{'id': 2, 'name': 'Tom', 'age': 23}]# select_one
sql = 'select * from person where id = :id'
data = {'id': 5}
row = db.select_one(sql, data)
print(row)
# {'id': 5, 'name': 'Tom', 'age': 23}# update
sql = "update person set name = :name where id = :id"
data = {'name': 'Jack','id': 1
}
row_count = db.update(sql, data)
print(row_count) # 1# delete
sql = "delete from person where id = :id"
data = {'id': 1
}
row_count = db.delete(sql, data)
print(row_count) # 1

3、Table操作

Table 类提供了一系列的简化操作

注意:使用table操作,仅支持?或者%s作为占位符

Table 仅适用于单表操作,多表操作可以使用 Database对象

# 获取 Table 对象
table = db.table('person')# insert_one
data = {'name': 'Tom', 'age': 23}
row_id = table.insert_one(data)
print(row_id) # 6
# INSERT INTO `person` ( `name`, `age` ) VALUES ( %(name)s, %(age)s )# insert
data = [{'name': 'Tom', 'age': 23},{'name': 'Steve', 'age': 25}
]
row_count = table.insert(data)
print(row_count) # 2
# INSERT INTO `person` ( `age`, `name` ) VALUES ( %(age)s, %(name)s )# update_by_id
data = {'name': 'Jackk'}
row_count = table.update_by_id(uid=1, data=data)
print(row_count) # 1
# UPDATE `person` SET `name` = %(name)s WHERE `id` = %(id)s# delete_by_id
row_count = table.delete_by_id(uid=6)
print(row_count) # 1
# DELETE FROM `person` WHERE `id` = %(id)s# where select
rows = (table.where("id > ?", 1).order_by("id desc").limit(1).select())
# SELECT * FROM `person` WHERE id > %s ORDER BY id desc LIMIT %s
print(rows)
# [{'id': 9, 'name': 'Steve', 'age': 25}]# select_by_id
row = table.select_by_id(uid=5)
print(row) # {'id': 5, 'name': 'Tom', 'age': 23}
# SELECT * FROM `person` WHERE `id` = %(id)s# select count
total = table.select_count()
print(total) # 5
# SELECT count(*) as total FROM `person`# where select_one
ret = (table.where("id = ?", 2).select_one())
# SELECT * FROM `person` WHERE id = 2 LIMIT 1print(ret)
# {'id': 2, 'name': 'Tom', 'age': 23}# where select count
total = (table.where("age > ?", 10).select_count())
print(total)  # 7
# SELECT count(*) as total FROM `person` WHERE age > %s# where delete
row_count = (table.where("id = ?", 1).delete())
# DELETE FROM `person` WHERE id = %sprint(row_count) # 0# where update
row_count = (table.where("id = ?", 1).update({'age': 24}))
# UPDATE `person` SET `age` = %s WHERE id = %s
print(row_count) # 1# select page
query = table.where("age > ?", 1)total = query.select_count('id')
print(total)  # 7
# SELECT count(`id`) FROM `person` WHERE age > %srows = query.select_page(2, 1)
# SELECT * FROM `person` WHERE age > %s LIMIT %s OFFSET %s
print(rows)
# [{'id': 3, 'name': 'Tom', 'age': 23}]# increment
row_count = table.where("id = ?", 4).increment('age', 1)
# UPDATE `person` SET `age` = `age` + %s WHERE id = %s
print(row_count)# decrement
row_count = table.where("id = ?", 4).decrement('age', 1)
# UPDATE `person` SET `age` = `age` - %s WHERE id = %s
print(row_count)

支持的占位符

无论使用什么数据库驱动都支持4种占位符:

paramstylesupportMeaningexample
qmarkOKQuestion mark style...WHERE name=?
numeric-Numeric, positional style...WHERE name=:1
namedOKNamed style...WHERE name=:name
formatOKANSI C printf format codes...WHERE name=%s
pyformatOKPython extended format codes...WHERE name=%(name)s

显示sql日志

import logginglogger = logging.getLogger('cator')
logger.setLevel(level=logging.DEBUG)

注意问题

  1. 使用时需注意链接超时问题
  2. cator支持了autocommit自动提交,默认关闭,如有需要可以打开,
  3. 如果需要执行事务就需要关闭自动提交

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

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

相关文章

OpenHarmony实战:轻量级系统之子系统移植概述

OpenHarmony系统功能按照“系统 > 子系统 > 部件”逐级展开,支持根据实际需求裁剪某些非必要的部件,本文以部分子系统、部件为例进行介绍。若想使用OpenHarmony系统的能力,需要对相应子系统进行适配。 OpenHarmony芯片适配常见子系统列…

留学生在美国大学利用AI工具到底算不算作弊呢?

自2022年以来,美国大学就开启了一场AI作弊与反作弊大战 战场小至测验,大至申请 这场战争并没有一方胜利,作弊者心思费尽 校方反作弊弄得教授们苦不堪言 那么作为中国留学生该如何避免这场战役呢? 毕竟还是学业要紧呢…… 故事…

软考 系统架构设计师系列知识点之软件架构风格(10)

接前一篇文章:软考 系统架构设计师系列知识点之软件架构风格(9) 所属章节: 第7章. 系统架构设计基础知识 第3节. 软件架构风格 相关试题 7. 某企业内部现有的主要业务功能已封装成为Web服务。为了拓展业务范围,需要将…

让六西格玛培训有效的三个步骤,拿走不谢!

近年来,六西格玛作为一种先进的质量管理方法,被众多企业视为提升产品质量、优化流程、减少浪费的利器。然而,如何使六西格玛培训真正落地生根,发挥出其应有的效果,成为了许多企业关注的焦点。本文,天行健Si…

docker容器部署gitlab的runner的shell模式注册下job中无法使用docker指令

引言 现需通过gitlab-runner来构建jar部署的镜像,发现在job中无法使用docker指令,解决的过程中出现一系列异常,在此做个问题解决的记录。 内容 通过docker-compose部署 name: java-env services:env-gitlab-runner:restart: alwaysimage: env/gitlab-runner-java:latest…

每日五道java面试题之消息中间件MQ篇(二)

目录: 第一题. RabbitMQ的工作模式第二题. 如何保证RabbitMQ消息的顺序性?第三题. 消息如何分发?第四题. 消息怎么路由?第五题. 如何保证消息不被重复消费?或者说,如何保证消息消费时的幂等性? …

前端导出文本内容为csv文件,excel乱码

原因:编码格式问题,需要改为utf-8 bom // Create blob with utf8-bom 编码 const createBlobWithBOM(data, mimeType)> {const bom [0xEF, 0xBB, 0xBF];const bomArray new Uint8Array(bom);const dataArray new TextEncoder().encode(data);const…

Android adb ime 调试输入法

目录 前言列出所有输入法仅列出输入法 id列出所有输入法的所有信息 启用/禁用 输入法启用输入法禁用输入法 切换输入法还原输入法 前言 安装多个输入法后&#xff0c;可以在设置里进行切换。 既然是开发&#xff0c;能用命令就就命令~ ime 帮助说明&#xff1a; ime <c…

目标检测、识别和语义分割的标注工具安装

计算机视觉 图像分类&#xff08;目标检测&#xff09;&#xff1a;一张图像中是否含某种物体物体定位&#xff08;目标检测与目标识别&#xff09;&#xff1a;确定目标位置和所属类别。语义分割&#xff08;目标分割和目标分类&#xff09;&#xff1a;对图像进行像素级分类…

计算机视觉无人驾驶技术:入门指南

I. 引言&#xff1a; 计算机视觉无人驾驶技术是一种基于计算机视觉和机器学习技术的自动化驾驶技术。它可以通过搭载各种传感器和摄像机&#xff0c;让车辆自主感知周围环境&#xff0c;实现尽可能自动化的驾驶操作。 这种技术具有重要性和优势&#xff0c;包括&#xff1a; …

js 本地缓存localStorage和sessionStorage 还有cookie 用法和区别

一、定义和使用 localStorage 和 sessionStorage 属性允许在浏览器中存储 key/value 对的数据。 localStorage 用于长久保存整个网站的数据&#xff0c;保存的数据没有过期时间&#xff0c;直到手动去删除。 sessionStorage 数据保存在当前会话中&#xff0c;该数据对象临时保…

Mini-React

jsx jsx 是React中对于JavaScript的语法扩展&#xff0c;允许在JavaScript中去写类似于HTML的代码。使得开发者能够以一种更直观和声明式的方式去编写用户界面 vdom vdom是React为了提高性能而去引入的一个虚拟的dom表示。 它是一个轻量级的 JavaScript 对象&#xff0c;用于…

推荐算法策略需求-rank model优化

1.pred_oobe (base) [rusxx]$ pwd /home/disk2/data/xx/icode/baidu/oxygen/rus-pipeline/pipeline-migrate/UserBaseActiveStatPipeline/his_session (base) [rusxx]$ sh test.sh 2. user_skill_history_dict_expt2包含userid [workxx]$ vim /home/work/xx/du-rus/du_rus_o…

Python 之 Flask 框架学习

毕业那会使用过这个轻量级的框架&#xff0c;最近再来回看一下&#xff0c;依赖相关的就不多说了&#xff0c;直接从例子开始。下面示例中的 html 模板&#xff0c;千万记得要放到 templates 目录下。 快速启动 hello world from flask import Flask, jsonify, url_forapp F…

Redis集群的方案

文章目录 主从同步哨兵模式 在Redis中提供的集群方案总共有三种&#xff1a;主从同步、哨兵模式、Redis分片集群 主从同步 主从解决的是高并发问题。 单个Redis节点的并发能力有限&#xff0c;要进一步提高Redis的并发能力&#xff0c;可以搭建主从集群&#xff0c;实现读写分…

【edge浏览器无法登录某些网站,以及迅雷插件无法生效的解决办法】

edge浏览器无法登录某些网站&#xff0c;以及迅雷插件无法生效的解决办法 edge浏览器无法登录某些网站&#xff0c;但chrome浏览器可以登录浏览器插件无法使用&#xff0c;比如迅雷如果重装插件重装浏览器重装迅雷后仍然出现问题 edge浏览器无法登录某些网站&#xff0c;但chro…

基于FPGA的SPI_FLASH程序设计

SPI_FLASH简介 spi_flash是一种通用存储器&#xff0c;也称为SPI NOR Flash或SPI Flash。它使用SPI&#xff08;Serial Peripheral Interface&#xff09;接口进行通信&#xff0c;可以通过串行方式读写数据。spi_flash的特点是工作电压低&#xff0c;体积小&#xff0c;读写速…

设计模式之旅:工厂模式全方位解析

简介 设计模式中与工厂模式相关的主要有三种&#xff0c;它们分别是&#xff1a; 简单工厂模式&#xff08;Simple Factory&#xff09;&#xff1a;这不是GoF&#xff08;四人帮&#xff0c;设计模式的开创者&#xff09;定义的标准模式&#xff0c;但被广泛认为是工厂模式的…

【单片机家电产品学习记录--红外线】

单片机家电产品学习记录–红外线 红外手势驱动电路&#xff0c;&#xff08;手势控制的LED灯&#xff09; 原理 通过红外线对管&#xff0c;IC搭建的电路&#xff0c;实现灯模式转换。 手势控制灯模式转换&#xff0c;详细说明 转载 1《三色调光LED台灯电路》&#xff0c…

矩阵空间秩1矩阵小世界图

文章目录 1. 矩阵空间2. 微分方程3. 秩为1的矩阵4. 图 1. 矩阵空间 我们以3X3的矩阵空间 M 为例来说明相关情况。目前矩阵空间M中只关心两类计算&#xff0c;矩阵加法和矩阵数乘。 对称矩阵-子空间-有6个3X3的对称矩阵&#xff0c;所以为6维矩阵空间上三角矩阵-子空间-有6个3…