当前位置: 首页 > news >正文

Python一些可能用的到的函数系列132 ORM-sqlalchemy连clickhouse

说明

继续ORM的转换

通过ORM,可以:

  • 1 用几乎一样的方式来操作不同的数据库
  • 2 可以提供One的处理模式

内容

同步方式

这种方式更简单,适合处理小批量任务。这种操作严格来说,不是严格的One,而是MiniBatch,只是在某些时候,例如我自己的Interative Table,可以把这种方式视为One。真正的One还是要通过下面的异步方式来实现。

from sqlalchemy import create_engine, Column, Integer, String, Float, DateTime, func
from sqlalchemy.orm import sessionmaker,declarative_base
from datetime import datetimedb_url = f"postgresql://USER:PASSWD@IP:PORT/postgres"# from urllib.parse import quote_plus
# the_passed = quote_plus('!@#*')
# # 创建数据库引擎
pg_engine = create_engine(db_url)# 创建基类
Base = declarative_base()# 定义数据模型
class NewsContent(Base):__tablename__ = 'some_table'__table_args__ = {'schema': 'some_schema'}  # 指定模式id = Column(Integer, primary_key=True)mid = Column(String)content = Column(String)created = Column(DateTime)def dict(self):data_dict = {}data_dict['id'] = self.id data_dict['mid'] = self.mid data_dict['content'] = self.content data_dict['created'] = self.created return data_dict # 创建表
Base.metadata.create_all(pg_engine)# 创建会话
Session = sessionmaker(bind=pg_engine)
session = Session()# 随机选取100条数据 order_by(func.random()) 数据集太大或者索引没建好可能会非常慢
# random_news = session.query(NewsContent).limit(100).all()# >>>> 采用select in 的方式
# 查询最大id
max_id = session.query(func.max(NewsContent.id)).scalar()print(f"The maximum id is: {max_id}")import random# 定义范围和选择的数量
start = max_id-10000000
end = max_id
num_samples = 200# 从指定范围中随机选择
random_samples = random.sample(range(start, end + 1), num_samples)print(random_samples)# # 查询 ID 在集合中的记录
filtered_news = session.query(NewsContent).filter(NewsContent.id.in_(random_samples)).all()
filtered_news1 = [x.dict() for x in filtered_news ]

效果很好,速度很快。

异步方式

之后如果上生产了可以考虑这种方式

要使用 SQLAlchemy 异步连接 PostgreSQL,你可以结合 asyncio 和 SQLAlchemy 的异步支持。你使用的是 SQLAlchemy 2.x,而 SQLAlchemy 从 1.4 版本开始引入了对异步编程的支持,并在 2.x 版本中进一步强化和完善了这一功能。因此,SQLAlchemy 2.0.30 版本已经完全支持异步操作,特别是结合 asyncio 事件循环来异步连接数据库,如 PostgreSQL。

所以你当前使用的 SQLAlchemy 2.x 版本已经可以支持我之前提到的基于 asyncpg 的异步连接 PostgreSQL。这个版本的异步功能是通过 AsyncSession、create_async_engine 等接口来实现的。

以下是如何使用 SQLAlchemy 异步连接 PostgreSQL 的步骤:

1. 安装所需依赖

确保你已经安装了 asyncpg 和 SQLAlchemy 版本 1.4+ 及其他相关依赖。

pip install SQLAlchemy[asyncio] asyncpg

2. 配置异步连接

使用 async_engineAsyncSession 来配置异步连接。

示例代码

import asyncio
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String# 定义模型的基础类
Base = declarative_base()# 定义数据库模型
class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True, autoincrement=True)name = Column(String)# 异步连接数据库
DATABASE_URL = "postgresql+asyncpg://user:password@localhost/dbname"# 创建异步引擎
engine = create_async_engine(DATABASE_URL, echo=True)# 创建异步会话工厂
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False
)# 异步函数:数据库交互
async def async_main():async with async_session() as session:async with session.begin():# 创建新用户new_user = User(name="Async User")session.add(new_user)# 查询数据result = await session.execute("SELECT * FROM users")users = result.fetchall()print(users)# 启动异步事件循环
asyncio.run(async_main())

主要步骤解析:

  1. 创建异步引擎create_async_engine() 使用 postgresql+asyncpg 连接字符串。
  2. 异步会话:使用 sessionmaker() 创建异步会话工厂,结合 AsyncSession 实现数据库的异步交互。
  3. 异步操作:在 async_main() 中进行异步的数据库操作,如查询和添加数据。

注意事项:

  • 异步操作必须在 async 函数中执行,并通过 await 语句异步地进行数据库操作。
  • 数据库的连接字符串需要使用 postgresql+asyncpg 来指定 asyncpg 驱动。

这种方式可以有效利用异步 I/O,提高数据库操作的性能。

相关文章:

Python一些可能用的到的函数系列132 ORM-sqlalchemy连clickhouse

说明 继续ORM的转换 通过ORM,可以: 1 用几乎一样的方式来操作不同的数据库2 可以提供One的处理模式 内容 同步方式 这种方式更简单,适合处理小批量任务。这种操作严格来说,不是严格的One,而是MiniBatch&#xff0c…...

华为 HCIP-Datacom H12-821 题库 (12)

有需要题库的可以看主页置顶 V群进行学习交流 1.设备使能 BGP 自动聚合功能后,可将 10.1.1.1/24 和 10.2.1.1/24路由聚合成以下哪一项? A、10.2.1.0/24 B、10.0.0.0/14 C、10.0.0.0/8 D、10.1.1.0/24 答案:C 解析: 暂无解析 2.关…...

pointpillar部署-TensorRT实现(三)

模型后处理 __global__ void postprocess_kernal(const float *cls_input,float *box_input,const float *dir_cls_input,float *anchors,float *anchor_bottom_heights,float *bndbox_output,int *object_counter,const float min_x_range,const float max_x_range,const flo…...

Java学习中,为什么会混淆类方法和实例方法,应该怎么办?

在Java学习过程中,初学者经常会混淆类方法(静态方法)和实例方法。这种混淆源于它们之间的概念和使用方式具有一定的相似性,但却在本质上存在较大的区别。理解并掌握两者的区别和应用场景,是掌握Java面向对象编程思想的…...

【人工智能学习笔记】4_3 深度学习基础之循环神经网络

循环神经网络(Recurrent Neural Network, RNN) 是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network),循环神经网络具有短期记忆能力 RNN核心思想 RNN的结构 一个典型…...

解锁生活密码,AI答案之书解决复杂难题

本文由 ChatMoney团队出品 介绍说明 “答案之书智能体”是您贴心的智慧伙伴,随时准备为您解答生活中的种种困惑。无论您在工作中遭遇瓶颈,还是在情感世界里迷失方向,亦或是对个人成长感到迷茫,它都能倾听您的心声,并给…...

Android Radio2.0——公告监听设置(四)

上一篇文章我们介绍了广播公告的注册及监听设置,这里我们来看一下广播公告添加监听的调用流程。 一、添加公告监听 1、RadioManager 源码位置:/frameworks/base/core/java/android/hardware/radio/RadioManager.java /*** 添加新的公告侦听器* @param enabledAnnouncemen…...

EMR Spark-SQL性能极致优化揭秘 Native Codegen Framework

作者:周克勇,花名一锤,阿里巴巴计算平台事业部EMR团队技术专家,大数据领域技术爱好者,对Spark有浓厚兴趣和一定的了解,目前主要专注于EMR产品中开源计算引擎的优化工作。 背景和动机 SparkSQL多年来的性能…...

【VUE】实现当前页面刷新,刷新当前页面的两个方法(如何在一个页面写一个方法提供给全局其他地方调用)(如何重复调用同一个路由实现页面的重新加载)

实现前端某个页面刷新,非F5整个系统刷新,只刷新内容部分,按具体需求可以采用一下两个方式实现 方法一:路由快速切换实现页面重新加载 特点:只刷新页面而不是整个系统,样式会重新加载 本质:如何…...

【科研小小白】灰度化处理、阈值、反色、二值化、边缘检测;平滑;梯度计算;双阈值检测;非极大值抑制

什么是灰度化处理? 灰度化处理是将彩色图像转换为灰度图像的过程。在彩色图像中,每个像素通常由红(R)、绿(G)、蓝(B)三个通道组成。每个通道的取值范围通常在0到255之间。通过灰度化…...

数字经济时代,零售企业如何实现以消费者为中心的数字化转型?

在数字经济时代,零售企业正面临着前所未有的挑战与机遇。随着消费者行为的数字化和多样化,传统的零售模式已难以满足市场需求。为了在激烈的市场竞争中立于不败之地,零售企业必须实现以消费者为中心的数字化转型。这一转型不仅仅是技术的升级…...

微积分复习笔记 Calculus Volume 1 - 1.5 Exponential and Logarithmic Functions

1.5 Exponential and Logarithmic Functions - Calculus Volume 1 | OpenStax...

代码随想录 刷题记录-24 图论 (1)理论基础 、深搜与广搜

一、理论基础 参考: 图论理论基础 深度优先搜索理论基础 广度优先搜索理论基础 dfs dfs搜索可一个方向,并需要回溯,所以用递归的方式来实现是最方便的。 有递归的地方就有回溯,例如如下代码: void dfs(参数) {…...

MyBatis 缓存机制详解:原理、应用与优化策略

一、MyBatis 缓存概述 1.1 什么是缓存? 缓存是一种提高系统性能的技术,通过将常用的数据保存在内存中,减少对底层数据源(如数据库)的访问次数,从而加快数据读取速度。 在 MyBatis 中,缓存的主要目的是通过存储查询结果,减少对数据库的直接查询次数,提升系统性能。 …...

跨越技术壁垒:EasyCVR为何选择支持FMP4格式,重塑视频汇聚平台标准

随着物联网、大数据、云计算等技术的飞速发展,视频监控系统已经从传统的安防监控扩展到智慧城市、智能交通、工业制造等多个领域。视频流格式作为视频数据传输与存储的基础,其兼容性与效率直接影响到整个视频监控系统的性能。 在众多视频流格式中&#…...

美团OC感想

OC感想 晚上十点拿到美团意向了 到家事业部。,日常实习没过,暑期实习没过,秋招终于意向了,晚上十点发的,整整激动到一点才睡着,不仅因为这是秋招的第一个意向,更因为这是我一直心心念念想去的地…...

搜维尔科技:AcuMap - 针灸模拟VR训练解决方案

AcuMap第一个针灸VR训练解决方案。全面且医学上准确的人体映射,其中 14 条经络和 361 个穴位以 3D 形式可视化。您还可以在虚拟人体模型上模拟针刺。主要特点 - 可视化 14 条经络及其分支 - 基于 4 个主要类别的 361 个穴位:五行、危险穴位、补邪和特殊穴…...

WEB渗透权限维持篇-禁用Windows事件日志

往期文章WEB渗透权限维持篇-DLL注入\劫持-CSDN博客 WEB渗透权限维持篇-CLR-Injection-CSDN博客 WEB渗透权限维持篇-计划任务-CSDN博客 WEB渗透权限维持篇-DLL注入-修改内存中的PE头-CSDN博客 WEB渗透权限维持篇-DLL注入-进程挖空(MitreT1055.012)-CSDN博客 WEB渗透权限维…...

【设计模式】Template Method伪代码

1. 不好的代码 1.1 lib.cpp class Library{ public:void Step1(){//...}void Step3(){//...}void Step5(){//...} };1.2 app.cpp class Application{ public:bool Step2(){//...}void Step4(){//...} };int main() {Library lib();Application app();lib.Step1();if(app.Ste…...

关于2023.9.2~2023.9.10学习总结与教训

关于2023.9.2~2023.9.10学习总结与教训 语文古诗文与古诗基础阅读作文 数学几综卷子 英语物理政治总结待寻找的学习方法需应用的学习方法 语文 古诗文与古诗 背诵岳阳楼记和醉翁亭记的经验告诉我,应该在背诵时附以抄写同时在背下来后还应该去默写纠错,…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage)&#xff1a…...

vscode里如何用git

打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...