【clickhouse】 使用 SQLAlchemy 连接 ClickHouse 数据库的完整指南
我听见有人猜
你是敌人潜伏的内线
和你相知多年
我确信对你的了解
你舍命救我画面
一一在眼前浮现
司空见惯了鲜血
你忘记你本是娇娆的红颜
感觉你我彼此都那么依恋
🎵 许嵩《内线》
ClickHouse 是一款非常高效的开源列式数据库,因其在处理大规模数据时的高性能和低延迟而广受欢迎。对于使用 Python 进行数据分析和处理的开发者而言,SQLAlchemy 是一个非常流行的数据库抽象层,可以用于连接和操作各种数据库。在这篇博客中,我们将介绍如何使用 SQLAlchemy 连接 ClickHouse 数据库,并展示一些基本的查询操作。
1. 为什么选择 SQLAlchemy 连接 ClickHouse?
SQLAlchemy 是 Python 中一个非常流行的 ORM(对象关系映射)框架,通常用于与数据库进行交互。相比于直接编写 SQL 语句,SQLAlchemy 提供了更高层次的抽象,支持多种数据库,并且可以灵活地生成 SQL 查询。通过 SQLAlchemy,我们可以更加优雅地与数据库交互,编写可维护、可扩展的代码。
虽然 ClickHouse 本身有许多客户端和 API 接口可供使用,但通过 SQLAlchemy 进行连接可以将 ClickHouse 与现有的 Python 数据库交互代码无缝集成,尤其在你使用多个数据库时会更加方便。
2. 安装所需库
要使用 SQLAlchemy 连接 ClickHouse,需要安装以下几个 Python 库:
SQLAlchemy:用于与数据库进行高层次的交互。
ClickHouse SQLAlchemy:这是 SQLAlchemy 的 ClickHouse 方言库。
ClickHouse-Connect(或其他驱动):这是用于与 ClickHouse 通信的 Python 驱动。
在终端中使用以下命令来安装这些依赖项:
pip install sqlalchemy
pip install clickhouse-sqlalchemy
pip install clickhouse-connect
3. 连接 ClickHouse 数据库
ClickHouse 使用的是 HTTP 或 TCP 协议,因此连接 ClickHouse 时,我们可以选择 HTTP 端点或 TCP 端点。为了与 SQLAlchemy 配合使用,我们使用 clickhouse-sqlalchemy 库,它支持通过 SQLAlchemy 的连接字符串格式连接 ClickHouse。
3.1 基本的连接字符串格式
SQLAlchemy 使用统一的数据库 URI 连接格式,ClickHouse 也遵循类似的格式。以下是 ClickHouse 的基本连接字符串格式:
from sqlalchemy import create_engine# ClickHouse 数据库的连接字符串格式
CLICKHOUSE_URI = 'clickhouse+http://<username>:<password>@<host>:<port>/<database>'
其中:
username: ClickHouse 用户名,通常是 default。
password: 用户密码。
host: ClickHouse 服务器的地址。
port: ClickHouse 服务器使用的端口(默认 HTTP 端口是 8123)。
database: 要连接的 ClickHouse 数据库名称。
3.2 创建数据库引擎
使用 SQLAlchemy 的 create_engine() 函数来创建连接引擎。引擎是与数据库交互的基础对象。
以下是一个完整的示例,展示如何使用 SQLAlchemy 创建到 ClickHouse 的连接:
from sqlalchemy import create_engine# 定义连接字符串
CLICKHOUSE_URI = 'clickhouse+http://default:@localhost:8123/default'# 创建 SQLAlchemy 引擎
engine = create_engine(CLICKHOUSE_URI)# 测试连接
with engine.connect() as connection:result = connection.execute("SELECT version()")for row in result:print(f"ClickHouse 版本: {row[0]}")
在这个例子中,default:@localhost:8123/default 表示我们正在使用默认用户(没有密码),连接到本地运行的 ClickHouse 实例,默认数据库是 default。
4. 使用 SQLAlchemy 进行基本操作
创建完引擎之后,我们可以使用 SQLAlchemy 提供的各种方法来进行数据库操作,例如查询、插入、更新和删除数据。
4.1 查询数据
我们可以使用 SQLAlchemy 的 execute() 方法来执行任意 SQL 查询。比如,执行一个简单的 SELECT 查询,获取 ClickHouse 表中的数据:
# 假设有一个 `users` 表,查询其中的数据
with engine.connect() as connection:result = connection.execute("SELECT * FROM users LIMIT 5")for row in result:print(row)
在这个示例中,我们查询了 users 表中的前 5 条记录,并打印出结果。
4.2 插入数据
通过 execute() 方法,你也可以直接执行 INSERT 语句,向 ClickHouse 中插入数据。注意,ClickHouse 是一个列式数据库,通常不支持逐行插入,但在特定情况下(如小批量插入)可以进行插入操作。
insert_query = """
INSERT INTO users (id, name, age) VALUES
(1, 'Alice', 30),
(2, 'Bob', 24)
"""with engine.connect() as connection:connection.execute(insert_query)print("数据插入成功")
4.3 创建表
SQLAlchemy 也可以用来创建表结构,以下是一个简单的表创建示例:
from sqlalchemy import Table, Column, Integer, String, MetaData# 定义表结构
metadata = MetaData()users_table = Table('users', metadata,Column('id', Integer, primary_key=True),Column('name', String),Column('age', Integer)
)# 创建表
metadata.create_all(engine)
print("表 `users` 创建成功")
在这个例子中,我们定义了一个 users 表,并通过 metadata.create_all() 创建该表。
5. ORM 模式操作
SQLAlchemy 还支持使用 ORM(对象关系映射)模式与数据库交互。通过定义 Python 类,我们可以将数据库表映射为对象,并使用面向对象的方式操作数据库。
5.1 定义 ORM 模型
以下是定义一个 ORM 模型的例子:
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String# 创建 ORM 基类
Base = declarative_base()# 定义一个 User 类,对应数据库中的 users 表
class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)# 创建数据库中的表
Base.metadata.create_all(engine)
5.2 插入数据(ORM)
我们可以通过创建对象的方式插入数据:
from sqlalchemy.orm import sessionmaker# 创建会话
Session = sessionmaker(bind=engine)
session = Session()# 创建新用户
new_user = User(id=3, name='Charlie', age=29)# 添加并提交
session.add(new_user)
session.commit()
5.3 查询数据(ORM)
使用 ORM 模式查询数据也非常简单,像操作对象一样查询:
# 查询用户
users = session.query(User).filter_by(age=29).all()
for user in users:print(user.name)
6. 性能与优化
ClickHouse 是一个专为大数据设计的高性能数据库,使用 SQLAlchemy 与 ClickHouse 交互时,需要注意以下几点以保持性能:
批量操作:ClickHouse 更适合批量插入和查询数据,避免逐行操作。
并行执行:ClickHouse 支持并发查询,利用 SQLAlchemy 的连接池或并行库可以加速数据访问。
使用合适的驱动:clickhouse-connect 驱动性能较好,适用于高并发和大数据量的场景。
7. 总结
通过 clickhouse-sqlalchemy 和 SQLAlchemy 的结合,Python 开发者可以非常方便地连接并操作 ClickHouse 数据库。无论是通过 SQLAlchemy 的核心查询功能,还是 ORM 模式,SQLAlchemy 都能为你的 ClickHouse 项目提供强大的数据库抽象层。对于那些需要处理大量数据的应用,ClickHouse 与 SQLAlchemy 的结合能够提升开发效率,简化数据库操作的复杂度。
你可以根据需要扩展你的爬取任务、分析任务或其他大数据应用程序,借助 ClickHouse 强大的性能和 SQLAlchemy 的灵活性,构建高效的数据处理管道。
相关文章:
【clickhouse】 使用 SQLAlchemy 连接 ClickHouse 数据库的完整指南
我听见有人猜 你是敌人潜伏的内线 和你相知多年 我确信对你的了解 你舍命救我画面 一一在眼前浮现 司空见惯了鲜血 你忘记你本是娇娆的红颜 感觉你我彼此都那么依恋 🎵 许嵩《内线》 ClickHouse 是一款非常高效的开源列式数据库,因…...
按键收集单击,双击和长按
按键收集单击,双击和长按 引言 在我们生活中, 按键是必不可少的, 不同的电器, 有不同的按键, 但是按键总有不够用的时候, 那么给与一个按键赋予不同的功能,就必不可少了. 一个按键可以通过按下的时间长短和频次, 来定义其类型。 一次按键收集, 都是在一个按键收集周…...
进程的异常终止
进程的异常终止 进程收到了某些信号,他杀 进程自己调用abort函数,产生了SIGABRT(6)信号,自杀 进程的最后一个线程收到了"取消"操作,并且做出响应 如果进程是异常结束的,atexit\on_exit它们事先注册的遗言…...
并发编程 | Future是如何优化程序性能
在初识Future一文中介绍了Future的核心方法。本文中接着介绍如何用Future优化我们的程序性能。 在此之前,有必要介绍Future接口的一个实现类FutureTask。 FutureTask介绍 FutureTask继承结构 首先我们看一下FutureTask的继承结构: public class Futur…...
Oracle笔记
一、 如何解决 sqlplus 无法使用退格键和方向键 .bashrc 中添加如下内容,解决 退格键 stty erase ^h 安装 rlwap 后,执行如下命令可解决 方向键 rlwap sqlplus 二、 都有哪些备份数据到工具 三、 谈谈 你对 oracle 中实例和数据库的理解 数据库是一…...
LVS+Keepalived 双机热备
LVSKeepalived 双机热备 Keepalived案例分析Keepalived工具介绍Keepalived工具介绍一、功能特点 一、理解Keepalived实现原理实验报告资源列表一、安装keepalived以及ipvsadm Keepalived案例分析 企业应用中,单台服务器承担应用存在单点故障的危险单点故障一旦发生…...
Web Image scr图片从后端API获取基本实现
因系统开发中需求,会有页面显示图片直接从后端获取后显示,代码如下: 后端: /*** 获取图片流* param response* param fileName*/RequestMapping(value"getImgStream",method RequestMethod.GET)public void getImgStr…...
2024音频剪辑指南:探索四大高效工具!
音频剪辑不仅仅是技术活,更是一种艺术创作,它能够让声音更加生动、更具感染力。今天,我们就来探索几款优秀的音频剪辑工具。 福昕音频剪辑 链接:www.pdf365.cn/foxit-clip/ 福昕音频剪辑是一款界面简洁、操作直观的音频编辑软件…...
“CSS”第一步——WEB开发系列13
CSS (Cascading Style Sheets,层叠样式表),是一种用来为结构化文档(如 HTML 文档或 XML 应用)添加样式(字体、间距和颜色等)的计算机语言,CSS 文件扩展名为 .css。 一、什么是 CSS&a…...
IEEE802网络协议和标准
IEEE802网络协议和标准 802委员会IEEE 802介绍现有标准 IEEE 802.3介绍物理媒介类型MAC子层与LLC子层主要内容通讯标准POE供电标准802.3af、802.3at、802.3btIEEE802.3af的工作过程:IEEE802.3af主要供电参数:IEEE802.3af的分级参数:为什么会有…...
vulnhub靶机 DC-9(渗透测试详解)
一、靶机信息收集 1、靶机下载 https://download.vulnhub.com/dc/DC-9.zip 2、靶机IP扫描 3、探测靶机主机、端口、服务版本信息 4、靶机目录扫描 二、web渗透测试 1、访问靶机IP 查看页面功能点,发现一个搜索框和登录框 2、测试一下是否存在sql注入 查看当前数…...
javaweb的新能源充电系统pf
TOC springboot339javaweb的新能源充电系统pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域…...
如何在桌面同时展示多个窗口
一、实现2分屏显示 win箭头 二、实现3分屏显示 1. 在实现2分屏显示的基础上,再次点击箭头图标,这次选择屏幕的上方或下方。 2. 点击后,第三个窗口将会出现在你选择的区域。现在,你可以在三个窗口之间自由切换,提高工…...
The Sandbox 游戏制作教程(第 5 部分):创建基于分类的系统
欢迎回到我们的系列,我们将记录 The Sandbox Game Maker 的 “On-Equip”(装备)功能的多种用途。 如果你刚加入 The Sandbox,装备功能是 “可收集组件”(Collectable Component)中的一个多功能工具&#x…...
HTML浏览器缓存(Browser Cache)
介绍: 浏览器缓存是Web缓存中最直接、最常见的一种形式。当浏览器首次请求某个资源时,如果服务器响应中包含了缓存控制指令(如Cache-Control、Expires等),浏览器就会将这些资源存储在本地缓存中。后续请求相同资源时&a…...
短剧APP系统,推动短剧市场发展
近年来,短剧作为一直火爆的新兴行业,凭借着剧情进奏、爽、时长短等优势,深受大众欢迎,成为了大众碎片化时间的解压神器。 目前,随着短剧市场的快速发展,各个类型的短剧层出不穷,也推动了短剧AP…...
嵌入式 | 嵌入式 Linux 系统使用摄像头
点击上方"蓝字"关注我们 01、引言 >>> 在嵌入式 Linux 系统使用摄像头 俗话说“眼见为实”,这或许是为什么近年来摄像头在嵌入式系统上快速增长的原因。它们被用于不同的场景,如: 远程监控:典型的例子是闭路电视,监控人员在监视环境(或许你所在的大楼…...
C 开源库之cJSON
cJSON简介 CJSON库是一个用于解析和生成JSON数据的C语言库。 它提供了一组函数,使得在C语言中操作JSON数据变得简单而高效。 您可以使用CJSON库来解析从服务器返回的JSON数据,或者将C语言数据结构转换为JSON格式以进行传输。 cJSON 使用 官网地址&…...
ROW_NUMBER(), RANK(), DENSE_RANK() SQL排序函数图文详解
ROW_NUMBER(), RANK(), DENSE_RANK() ROW_NUMBER(): 为结果集中的每一行分配唯一的连续编号。即使有重复的值,ROW_NUMBER() 也会为它们分配不同的序号。 SELECT column_name, ROW_NUMBER() OVER (ORDER BY column_name) AS row_num FROM table_name;2. RANK(): 对结…...
Spring IoCDI(下)—DI的尾声
我们之前学习了控制反转IoC,接下来就开始学习依赖注入DI的细节。 依赖注入是一个过程,是指IoC容器在创建Bean时,去提供运行时所依赖的资源,而资源指的就是对象。我们使用 Autowired 注解,完成依赖注入的操作。简单来说…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...
LangChain【6】之输出解析器:结构化LLM响应的关键工具
文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器?1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...
