一个超方便使用SQL的Python神器

Spring Boot日志可视化实战:5分钟搞定Promtail采集与Grafana查询(避坑指南) 本文详细介绍了如何通过Promtail和Grafana实现Spring Boot日志的可视化查询,提供从日志采集到高效查询的全流程实战指南,重点解决部署中的常见问题。内容包括Logback配置、Promtail日志采集、Grafana的LogQL查询技巧及生产环境优化建议,帮助开发者快速定位和解决日志问题。 阅读详情

作者:言淦,一枚喜欢淦代码的码农,"言淦说"主理人

其实一开始用的是pymysql,但是发现维护比较麻烦,还存在代码注入的风险,所以就干脆直接用ORM框架。

ORM即Object Relational Mapper,可以简单理解为数据库表和Python类之间的映射,通过操作Python类,可以间接操作数据库。

a67701c4163d9aa30f7e4e313bb6035f.png

Python的ORM框架比较出名的是SQLAlchemy和Peewee,这里不做比较,只是单纯讲解个人对SQLAlchemy的一些使用,希望能给各位朋友带来帮助。

  • sqlalchemy版本: 1.3.15

  • pymysql版本: 0.9.3

  • mysql版本: 5.7

初始化工作

一般使用ORM框架,都会有一些初始化工作,比如数据库连接,定义基础映射等。

以MySQL为例,创建数据库连接只需要传入DSN字符串即可。其中echo表示是否输出对应的sql语句,对调试比较有帮助。

from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://$user:$password@$host:$port/$db?charset=utf8mb4', echo=True)

个人设计

对于我个人而言,引进ORM框架时,我的项目会参考MVC模式做以下设计。其中model存储的是一些数据库模型,即数据库表映射的Python类;model_op存储的是每个模型对应的操作,即增删查改;调用方(如main.py)执行数据库操作时,只需要调用model_op层,并不用关心model层,从而实现解耦。

├── main.py
├── model
│   ├── __init__.py
│   ├── base_model.py
│   ├── ddl.sql
│   └── py_orm_model.py
└── model_op
    ├── __init__.py
    └── py_orm_model_op.py

映射声明(Model介绍)

举个栗子,如果我们有这样一张测试表

create table py_orm (
    `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '唯一id',
    `name` varchar(255) NOT NULL DEFAULT '' COMMENT '名称',
    `attr` JSON NOT NULL COMMENT '属性',
    `ct` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `ut` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON update CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY(`id`)
)ENGINE=InnoDB COMMENT '测试表';

在ORM框架中,映射的结果就是下文这个Python类

# py_orm_model.py
from .base_model import Base
from sqlalchemy import Column, Integer, String, TIMESTAMP, text, JSON


class PyOrmModel(Base):
    __tablename__ = 'py_orm'

    id = Column(Integer, autoincrement=True, 
                primary_key=True, comment='唯一id')
    name = Column(String(255), nullable=False, 
                  default='', comment='名称')
    attr = Column(JSON, nullable=False, comment='属性')
    ct = Column(TIMESTAMP, nullable=False, server_default=text('CURRENT_TIMESTAMP'), comment='创建时间')
    ut = Column(TIMESTAMP, nullable=False, 
                server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'),
                comment='更新时间')

首先

我们可以看到PyOrmModel继承了Base类,该类是sqlalchemy提供的一个基类,会对我们声明的Python类做一些检查,我将其放在base_model中。

# base_model.py
# 一般base_model做的都是一些初始化的工作

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:33306/orm_test?charset=utf8mb4", echo=False)

其次

每个Python类都必须包含__tablename__属性,不然无法找到对应的表。

第三

关于数据表的创建有两种方式,第一种当然是手动在MySQL中创建,只要你的Python类定义没有问题,就可以正常操作;第二种是通过orm框架创建,比如下面

# main.py
# 注意这里的导入路径,Base创建表时会寻找继承它的子类,如果路径不对,则无法创建成功

from sqlachlemy_lab import Base, engine

if __name__ == '__main__':
    Base.metadata.create_all(engine)

创建效果:

...
2020-04-04 10:12:53,974 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE py_orm (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    name VARCHAR(255) NOT NULL DEFAULT '' COMMENT '名称', 
    attr JSON NOT NULL COMMENT '属性', 
    ct TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    ut TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (id)
)

第四

关于字段属性

  • 1.primary_key和autoincrement比较好理解,就是MySQL的主键和递增属性。

  • 2.如果是int类型,不需要指定长度,而如果是varchar类型,则必须指定。

  • 3.nullable对应的就是MySQL中的NULL 和 NOT NULL

  • 4.关于default和server_default: default代表的是ORM框架层面的默认值,即插入的时候如果该字段未赋值,则会使用我们定义的默认值;server_default代表的是数据库层面的默认值,即DDL语句中的default关键字。

Session介绍

在SQLAlchemy的文档中提到,数据库的增删查改是通过session来执行的。

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)

session = Session()
orm = PyOrmModel(id=1, name='test', attr={})
session.add(orm)

session.commit()
session.close()

如上,我们可以看到,对于每一次操作,我们都需要对session进行获取,提交和释放。这样未免过于冗余和麻烦,所以我们一般会进行一层封装。

1.采用上下文管理器的方式

处理session的异常回滚和关闭,这部分与所参考的文章是几乎一致的。

# base_model.py
from contextlib import contextmanager
from sqlalchemy.orm import sessionmaker, scoped_session

def _get_session():
    """获取session"""
    return scoped_session(sessionmaker(bind=engine, expire_on_commit=False))()

# 在这里对session进行统一管理,包括获取,提交,回滚和关闭
@contextmanager
def db_session(commit=True):
    session = _get_session()
    try:
        yield session
        if commit:
            session.commit()
    except Exception as e:
        session.rollback()
        raise e
    finally:
        if session:
            session.close()

2.model和dict转换

在PyOrmModel中增加两个方法,用于model和dict之间的转换

class PyOrmModel(Base):
    ...

    @staticmethod
    def fields():
        return ['id', 'name', 'attr']

    @staticmethod
    def to_json(model):
        fields = PyOrmModel.fields()
        json_data = {}
        for field in fields:
            json_data[field] = model.__getattribute__(field)
        return json_data

    @staticmethod
    def from_json(data: dict):
        fields = PyOrmModel.fields()

        model = PyOrmModel()
        for field in fields:
            if field in data:
                model.__setattr__(field, data[field])
        return model

3.数据库操作的封装

与参考的文章不同,我是直接调用了session,从而使调用方不需要关注model层,减少耦合。

# py_orm_model_op.py
from sqlachlemy_lab.model import db_session
from sqlachlemy_lab.model import PyOrmModel


class PyOrmModelOp:
    def __init__(self):
        pass

    @staticmethod
    def save_data(data: dict):
        with db_session() as session:
            model = PyOrmModel.from_json(data)
            session.add(model)

    # 查询操作,不需要commit
    @staticmethod
    def query_data(pid: int):
        data_list = []
        with db_session(commit=False) as session:
            data = session.query(PyOrmModel).filter(PyOrmModel.id == pid)
            for d in data:
                data_list.append(PyOrmModel.to_json(d))

            return data_list

4.调用方

# main.py
from sqlachlemy_lab.model_op import PyOrmModelOp


if __name__ == '__main__':
    PyOrmModelOp.save_data({'id': 1, 'name': 'test', 'attr': {}})

完整代码请参见:  
https://github.com/yangancode/python_lab/tree/master/sqlachlemy_lab


 

 
推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

点阅读原文,看B站我的20个视频!

Apache Flink连载(一):Apache Flink是什么? Apache Flink 是一个框架和分布式处理引擎,用于在。 阅读详情

相关推荐

基于深度学习的UWB门禁检测

针对基于UWB技术智能门禁管理系统,由于测距误差或非视距原因导致门禁产生不合理动作的现象。分析如何采用基于深度学习的方法,通过对TWR测距数据、TWR监听数据、到达角度差(PDOA)、信道脉冲响应(CIR)等数据维度进行深度学习,利用 TensorFlow建立相应的推导模型,对卡片姿态进行更加精准可靠的检测,从而更好完成闸机开合控制。

tenth_quadrant的博客 2028

sqlalchemy的基本使用

基本使用 更多数据库操作 附录 1.链接:Session、sessionmaker、scoped_session相关资料 2.接近原生的sqlalchemy操作 链接-查询:sqlalchemy-查询 链接-更新,插入,删除:sqlalchemy-更新,插入,删除 3.会话通过query操作数据库的操作 会话的query查询:query操作API...

ch_atu的博客 719

射频电源与等离子体技术:原理、应用与优化策略

射频电源(RF Power Supply)作为高频交流电信号发生器,在半导体制造和材料处理中扮演关键角色。其核心原理是通过高频电场激发气体产生等离子体,这种电离气体包含电子、离子和活性基团,具有独特的非平衡特性。技术价值体现在等离子体密度和电子温度的可控性上,使得在刻蚀和沉积工艺中能精确调控材料处理效果。应用场景广泛覆盖PECVD、深槽刻蚀等工业流程,其中13.56MHz ISM频段因其全球合规性成为行业标准。优化策略包括双频驱动和阻抗匹配网络设计,可显著提升工艺均匀性和设备效率。

weixin_29163797的博客 391

SQLAlchemy 中的 Session,sessionmaker,scoped_session详解

一、关于SQLAlchemy 什么是SQLAlchemy? 答:SQLAlchemy是一个关系型数据库框架,它提供了高层的 ORM 和底层的原生数据库的操作,让开发者不用直接和 SQL 语句打交道,而是通过 Python 对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升。 一句话:就是对数据库的抽象! Session 其实 就是一个会话, 可以和数据库打交道的一个会...

没有撤退可言. 8834

知识图谱与人工智能本体论:构建机器认知的语义基石

本文探讨了知识图谱与人工智能本体论如何作为机器认知的语义基石,让AI从‘知道数据’迈向‘理解知识’。文章详细拆解了本体论的核心构件与构建方法,并阐述了从本体到知识图谱的实践路径,包括知识获取、融合、存储及推理应用,最终分析了其在智能搜索与专家系统等场景中带来的根本性重塑。

nginx7reverse的博客 912

2026款拯救者Y9000P深度学习环境配置指南

这套环境适配 2026 款拯救者 Y9000P 的 RTX5060,可直接用于 CV(图像分类、检测)、NLP 等 PyTorch 深度学习任务,GPU 利用率正常,无兼容性问题。后续复现环境时,直接按本文步骤操作即可~

大糊涂虫 2650

使用预训练Embedding,finetune DSSM模型

Milvus 小编:本文转载自公众号Python 科技园,作者王多鱼。 ​ 1. 前言 DSSM模型是点击预估领域的经典召回模型,是由 “用户”端 和 “商品”端 两个塔式结构组成。“用户”端 和 “商品”端 两个子塔分别生成最终的 “用户” Embedding 和 “商品” Embedding。在线上应用时,实时生成 “用户” 端的 Embedding(因为用户的行为是动态的),在线从数...

ZILLIZ 2318

hadoop 切片机制详解

hadoop切片机制详解

congge 1万+

python SQLAchemy增删查改

python SQLAchemy增删查改

weixin_42369828的博客 830

特征工程自动化(FeatureTools实战)

本项目模拟生成的医疗、金融和电商等领域的原始数据,适用于自动化特征工程的场景。主数据表(Entity Table):例如用户数据、交易数据、患者数据等。字段可能包括用户ID、年龄、性别、注册日期、消费金额、行为记录等。关联数据表(Related Tables):例如订单数据、点击记录、诊疗记录等。多个表之间通过外键建立关联。patient_id:患者IDage:年龄gender:性别:入院日期:出院日期diagnosis:诊断结果。

闲人编程的博客 1360

Python爬虫实战:抓取统计数据并生成年度对比图表详解

国家统计局网站(静态HTML页面Excel文件JSON接口(部分新版API)我们将重点演示从统计公报页面抓取数据,结合解析Excel文件,实现多种数据格式爬取处理。本文从零开始搭建了一个爬取国家统计数据并制作年度对比图表的完整流程。读者可以根据实际需求调整爬取目标,丰富数据分析维度,甚至结合机器学习模型预测未来趋势。欢迎你在评论区留言分享你的爬虫实践,或提出改进建议!

2201_76125261的博客 1002

SQLAlchemy ORM 框架详解

SQLAlchemy ORM 框架详解 一、安装 pip install sqlalchemy==1.4.7 pip install pymysql # 连接mysql数据库所需库 二、连接数据库 from sqlalchemy import create_engine engine = create_engine(f"mysql+pymysql://{数据库账号}:{密码}@{数据库地址}:3306/{数据库}", echo=True) print(engine) ------打印结果------

Joker-desire的博客 1529

rtpengine 项目

rtpengine 项目

原来45的博客 1791

一个超方便使用SQL的Python神器!

举个栗子,如果我们有这样一张测试表`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '唯一id',`name` varchar(255) NOT NULL DEFAULT '' COMMENT '名称',`attr` JSON NOT NULL COMMENT '属性',`ct` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

2401_86168842的博客 769

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

一个超方便使用 SQL 的 Python 神器

其实一开始用的是,但是发现维护比较麻烦,还存在代码注入的风险,所以就干脆直接用ORM框架。ORM即,可以简单理解为数据库表和Python类之间的映射,通过操作Python类,可以间接操作数据库。喜欢记得收藏、关注、点赞。注:技术交流,解惑答疑、资料代码,文末获取Python的ORM框架比较出名的是和,这里不做比较,只是单纯讲解个人对SQLAlchemy的一些使用,希望能给各位朋友带来帮助。sqlalchemy版本: 1.3.15pymysql版本: 0.9.3mysql版本: 5.7一般使用ORM框架,都会

Python数据挖掘 338

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SQL文件拆分神器:用PyCharm+Python3.7快速处理超6GB数据库备份文件

本文介绍了一种使用PyCharm和Python 3.7高效拆分超6GB大型SQL数据库备份文件的轻量级解决方案。该方法通过Python脚本实现流式读取和正则匹配,在Windows 10环境下有效规避内存瓶颈,将庞大文件按表拆分为独立文件,并结合PyCharm Database工具进行结果验证,为运维人员和开发者提供了灵活、低成本的数据处理选择。

lstm7chronicler的博客 184

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

一行代码让SQL颜值爆表 这个低调神器到底藏了什么魔法

# 一行代码让SQL颜值爆表 这个低调神器到底藏了什么魔法 --- ## 第一部分:背景——为什么需要 `sqlparse`? 在数据分析、后端开发、DBA 日常工作中,我们每天都要和 SQL 打交道。 真实场景里,SQL 往往“又臭又长”: - 线上紧急修复时手写的“面条 SQL”; - 从日志里复制出来的“一行流”语句; - BI 同事拖拽生成的“括号地狱”。 这些语句虽然能跑,但可读性极差,维护成本高。 `sqlparse` 的出现就是为了解

AIGC搞起 1354

探索 MoSQL:Python 数据结构驱动的 SQL 构建神器

探索 MoSQL:Python 数据结构驱动的 SQL 构建神器 在数据处理的世界里,SQL 一直是连接应用与数据库的桥梁。但直接编写 SQL 语句不仅对初学者有一定门槛,还可能面临安全和效率的问题。而今天,我们向您推荐一款新颖的开源工具——MoSQL,它将使您的数据库操作体验焕然一新。 项目介绍 MoSQL,顾名思义,是“超越SQL”的存在,旨在让开发者能利用熟悉的Python数据结构来构建SQ...

gitblog_00630的博客 1101

python使用神器_python 神器

适用与IOS手机的python编辑器,让你不限空间,地点都能玩转pyhton代码 !前言现在越来越多人学习python,很多小伙伴都富有激情的,利用碎片化的时间都要学习,小编不得不佩服你们,大家都知道pyhton是简单易学的,但是光说不练,假把式,最好能编程并且运行,最好能有一款神器软件可以随时随地编写python代码,而且功能齐全,呐,我今天就为大家介绍一款IOS手机上能编写p...文章qun ...

weixin_39707168的博客 445

卧槽,又一个SQL神器!

今天给大家分享一份大佬整理某厂的SQL的语法大全,包含两本书籍:《SQL基础知识》和《SQL进阶知识》。和其他SQL书籍不一样的是,这份《SQL语法大全》不仅包括SQL基础和进阶语法的所有...

Python数据之道 104

推荐开源项目:sql_to_sqlalchemy - SQL到SQLAlchemy的转换神器

在这个数据驱动的时代,我们经常需要处理各种SQL查询以与数据库交互。然而,当涉及到复杂的业务逻辑时,手动编写SQL和维护ORM(对象关系映射)代码可能会变得繁琐且易于出错。这就是`sql_to_sqlalchemy`项目大展拳脚的地方。它是一个强大的工具,可以将你的SQL语句自动转化为Python中的SQLAlchemy ORM表达式,极大地提高了开发效率。 ## 项目简介 是一个由Pyth...

gitblog_00030的博客 741
上一篇: Python做一个Kindle电子书下载助手,真香!
下一篇: PyCharm为什么这么牛?
菜鸟学Python
博客等级 码龄9年 8089粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值