Ubuntu系统下Python连接国产KingbaseES数据库实现增删改查

Ubuntu系统下Python连接国产KingbaseES数据库实现增删改查
摘要:本文将介绍Ubuntu系统下如何使用Python连接国产金仓数据库KingbaseES,并实现基本的增删改查操作。文中将通过具体代码示例展示连接数据库、执行SQL语句以及处理结果的全过程。这里把Python连接KingbaseES的经验整理一下,希望能帮到同样踩坑的兄弟。

目录

1.环境准备与驱动安装

1.1 科普ksycopg2知识

1.2 官方下载ksycopg2驱动

1.3 安装ksycopg2驱动

2. 连接KingbaseES数据库

3. 创建数据表

4. 实现增删改查功能

4.1 新增

4.2 查询

4.3 修改

4.4 删除

4.5 封装一个类crud方便复用

5.总结


1.环境准备与驱动安装

KingbaseES提供了专门的Python驱动包ksycopg2,它是基于Python DB API 2.0规范实现的线程安全数据库适配器!

1.1 科普ksycopg2知识

ksycopg2是Python编程语言的KingbaseES数据库适配器。它的主要特点是Python DB API 2.0 规范的完整实现和线程安全。

ksycopg2 主要在C程序中作为libkci包装器实现,因此既高效又安全。它拥有客户端和服务端游标,支持异步通信和通知、复制。

ksycopg2驱动需要和python大版本一致,如python3.8的ksycopg2驱动支持python3.8.x的任意小版本。

更多科普请查看金仓KingbaseES官方手册:2. 概述 — KingbaseES产品手册

1.2 官方下载ksycopg2驱动

1、首先需要下载并安装与你的Python版本和系统架构匹配的ksycopg2驱动。驱动可以从KingbaseES官方网站(KES-电科金仓官网)获取,如下图所示:

2、这里兄弟盟根据自己电脑系统,选择对应的版本,我这里是linux,下载下来如下图所示:KingbaseES_V009R001C010B0004_X64_Linux_Ksycopg2.tar 解压后可以看到有python2.7、python3.6、python3.7、python3.8、python3.9、python3.10、python3.11、python3.12,准备得真是周到,照顾各位大佬电脑上不同python版本,这一点为国产金仓数据库点赞👍👍👍

1.3 安装ksycopg2驱动

1、上面下载后解压并将ksycopg2文件夹放置在Python的模块搜索路径中,如果不清楚自己Python的模块在哪里,可以写个简单python代码查看:

import sys print(sys.path)

2、运行后如下所示,可以查看Python的模块位置:/usr/lib/python3/dist-packages

3、开始上传到:/usr/lib/python3/dist-packages

4、此外,还需要将KingbaseES的libkci库文件路径添加到LD_LIBRARY_PATH环境变量中:

export LD_LIBRARY_PATH=/kingbase/data/KESRealPro/V009R002C012/Server/lib:$LD_LIBRARY_PATH

如果不清楚自己KingbaseES的libkci库文件路在哪里,可以用这个命令查看:

ps -ef | grep kingbase

5、验证安装ksycoph2驱动

import ksycopg2 print("ksycopg2驱动安装成功")

2. 连接KingbaseES数据库

使用ksycopg2连接KingbaseES数据库需要提供数据库名称、用户名、密码、主机地址和端口号等信息。

import ksycopg2 def create_connection(): try: conn = ksycopg2.connect( database="TEST", user="SYSTEM", password="qwe123!@#", host="127.0.0.1", port="54321" ) print("数据库连接成功") return conn except Exception as e: print(f"连接数据库失败: {e}") return None # 建立数据库连接 connection = create_connection()

创建一个connect_database.py把上面代码复制进去,然后执行

python connect_database.py

3. 创建数据表

在执行增删改查操作前,需要先创建一张测试表,有表才好对后面的案例进行操作。

def create_table(conn): try: cursor = conn.cursor()" CREATE TABLE IF NOT EXISTS user_info ( id INTEGER PRIMARY KEY, username VARCHAR(50) NOT NULL, age INTEGER, created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) """ cursor.execute(create_table_sql) conn.commit() cursor.close() print("表创建成功") except Exception as e: print(f"创建表失败: {e}") conn.rollback() # 创建表 if connection: create_table(connection)

同理,在ubuntu服务器上新建一个create_table.py文件,把上面代码丢进去执行:

python create_table.py

4. 实现增删改查功能

4.1 新增

def insert_data_example(): """插入数据示例""" db_manager = KingbaseESManager( dbname="test", user="SYSTEM", password="qwe123!@#", host="127.0.0.1", port="54321" ) if db_manager.connect(): # 插入单条数据 insert_sql = "INSERT INTO user_info (id, username, age) VALUES (%s, %s, %s)" params = (1, '张三', 25) db_manager.execute_update(insert_sql, params) # 插入多条数据 users_to_insert = [ (2, '李四', 30), (3, '王五', 28), (4, '赵六', 35), (5, '钱七', 22) ] for user in users_to_insert: db_manager.execute_update(insert_sql, user) db_manager.disconnect() # 执行插入数据 insert_data_example()

调用python后登录数据库查看是否已经插入数据库,ubuntu登录如下所示

# 切换到kingbase用户 su - kingbase # 连接数据库 ksql -U SYSTEM -d test -p 54321 # 如果上面执行不成功,可以指定目录来连接 /kingbase/data/KESRealPro/V009R002C012/Server/bin/ksql -U SYSTEM -d test -p 54321

执行查询语句,查询所有用户数据,验证插入结果,如下图所示:

-- 查询所有用户数据,验证插入结果 SELECT * FROM user_info ORDER BY id;

4.2 查询

def query_data_example(): """查询数据示例""" db_manager = KingbaseESManager( dbname="test", user="SYSTEM", password="qwe123!@#", host="127.0.0.1", port="54321" ) if db_manager.connect(): # 查询所有数据 print("所有用户信息:") select_all_sql = "SELECT * FROM user_info ORDER BY id" all_users = db_manager.execute_query(select_all_sql) for user in all_users: print(user) # 根据ID查询特定用户 print("\n查询ID为2的用户:") select_by_id_sql = "SELECT * FROM user_info WHERE id = %s" user_by_id = db_manager.execute_query(select_by_id_sql, (2,)) print(user_by_id) # 根据年龄范围查询用户 print("\n年龄在25-30岁之间的用户:") select_by_age_sql = "SELECT * FROM user_info WHERE age BETWEEN %s AND %s ORDER BY age" users_by_age = db_manager.execute_query(select_by_age_sql, (25, 30)) for user in users_by_age: print(user) db_manager.disconnect() # 执行查询数据 query_data_example()

登录数据库验证如下所示:

4.3 修改

def update_data_example(): """更新数据示例""" db_manager = KingbaseESManager( dbname="TEST", user="SYSTEM", password="your_password", host="127.0.0.1", port="54321" ) if db_manager.connect(): # 更新用户年龄 print("更新张三的年龄为26:") update_sql = "UPDATE user_info SET age = %s WHERE id = %s" db_manager.execute_update(update_sql, (26, 1)) # 验证更新结果 print("\n更新后的用户信息:") select_sql = "SELECT * FROM user_info WHERE id = %s" updated_user = db_manager.execute_query(select_sql, (1,)) print(updated_user) db_manager.disconnect() # 执行更新数据 update_data_example()

执行python脚本后,登录数据库后台查看,确实是每个用户小于30岁的都加了1岁,如下所示:

4.4 删除

def delete_data_example(): """删除数据示例""" db_manager = KingbaseESManager( dbname="TEST", user="SYSTEM", password="your_password", host="127.0.0.1", port="54321" ) if db_manager.connect(): # 删除ID为5的用户 print("删除ID为5的用户:") delete_sql = "DELETE FROM user_info WHERE id = %s" db_manager.execute_update(delete_sql, (5,)) # 验证删除结果 print("\n删除后的所有用户:") select_all_sql = "SELECT * FROM user_info ORDER BY id" remaining_users = db_manager.execute_query(select_all_sql) for user in remaining_users: print(user) db_manager.disconnect() # 执行删除数据 delete_data_example()

同理,验证数据如下所示:

4.5 封装一个类crud方便复用

下面将实现完整的增删改查功能,并将这些操作封装在一个类中,方便复用。

import ksycopg2 from datetime import datetime class KingbaseESManager: def __init__(self, dbname, user, password, host, port): self.conn = None self.db_params = { "database": TEST, "user": SYSTEM, "password": qwe123!@#, "host": 127.0.0.1, "port": 54321 } def connect(self): """连接数据库""" try: self.conn = ksycopg2.connect(**self.db_params) print("数据库连接成功") return True except Exception as e: print(f"连接数据库失败: {e}") return False def disconnect(self): """断开数据库连接""" if self.conn: self.conn.close() print("数据库连接已关闭") def execute_query(self, sql, params=None): """执行查询语句并返回结果""" try: cursor = self.conn.cursor() if params: cursor.execute(sql, params) else: cursor.execute(sql) results = cursor.fetchall() cursor.close() return results except Exception as e: print(f"查询执行失败: {e}") return None def execute_update(self, sql, params=None): """执行更新操作(插入、更新、删除)""" try: cursor = self.conn.cursor() if params: cursor.execute(sql, params) else: cursor.execute(sql) self.conn.commit() affected_rows = cursor.rowcount cursor.close() print(f"操作成功,影响行数: {affected_rows}") return affected_rows except Exception as e: self.conn.rollback() print(f"操作执行失败: {e}") return -1 def insert_user(self, id, username, age): """插入用户数据""" sql = "INSERT INTO user_info (id, username, age) VALUES (%s, %s, %s)" params = (id, username, age) return self.execute_update(sql, params) def select_all_users(self): """查询所有用户""" sql = "SELECT * FROM user_info ORDER BY id" return self.execute_query(sql) def select_user_by_id(self, id): """根据ID查询用户""" sql = "SELECT * FROM user_info WHERE id = %s" params = (id,) return self.execute_query(sql, params) def update_user_age(self, id, new_age): """更新用户年龄""" sql = "UPDATE user_info SET age = %s WHERE id = %s" params = (new_age, id) return self.execute_update(sql, params) def delete_user(self, id): """删除用户""" sql = "DELETE FROM user_info WHERE id = %s" params = (id,) return self.execute_update(sql, params) def search_users_by_age_range(self, min_age, max_age): """根据年龄范围查询用户""" sql = "SELECT * FROM user_info WHERE age BETWEEN %s AND %s ORDER BY age" params = (min_age, max_age) return self.execute_query(sql, params) # 使用示例 if __name__ == "__main__": # 创建数据库管理实例 db_manager = KingbaseESManager( dbname="TEST", user="SYSTEM", password="qwe123!@#", host="127.0.0.1", port="54321" ) # 连接数据库 if db_manager.connect(): # 插入多条用户数据 users_to_insert = [ (1, '张三', 25), (2, '李四', 30), (3, '王五', 28), (4, '赵六', 35), (5, '钱七', 22) ] for user in users_to_insert: db_manager.insert_user(*user) # 查询所有用户 print("所有用户信息:") all_users = db_manager.select_all_users() for user in all_users: print(user) # 根据ID查询用户 print("\n查询ID为2的用户:") user_by_id = db_manager.select_user_by_id(2) print(user_by_id) # 更新用户年龄 print("\n更新张三的年龄为26:") db_manager.update_user_age(1, 26) # 查询年龄在25-30岁之间的用户 print("\n年龄在25-30岁之间的用户:") users_by_age = db_manager.search_users_by_age_range(25, 30) for user in users_by_age: print(user) # 删除ID为5的用户 print("\n删除ID为5的用户:") db_manager.delete_user(5) # 再次查询所有用户 print("\n删除后的所有用户:") remaining_users = db_manager.select_all_users() for user in remaining_users: print(user) # 断开连接 db_manager.disconnect()

5.总结

本文介绍了在Ubuntu系统中使用Python连接国产金仓数据库KingbaseES的方法。主要内容包括:1.安装与Python版本匹配的ksycopg2驱动;2.配置环境变量和连接参数;3.实现数据库连接、建表及增删改查操作;4.封装可复用的数据库操作类。通过具体代码示例演示了数据插入、查询、更新和删除等常见操作,并提供了验证方法。文章还分享了环境配置中的常见问题和解决方案,帮助开发者快速上手KingbaseES数据库操作。

编码不易,希望各位点赞支持,也支持我们国产的数据库,纸上得来终觉浅,希望各位大佬也亲自动手尝试一下,如果遇到什么问题欢迎评论区留言交流,相互学习,共同进步~正在走向自律

本文相关《电科金仓》分类链接推荐:

第一章:基础与入门

1、【金仓数据库征文】政府项目数据库迁移:从MySQL 5.7到KingbaseES的蜕变之路

2、【金仓数据库征文】学校AI数字人:从Sql Server到KingbaseES的数据库转型之路

3、电科金仓2025发布会,国产数据库的AI融合进化与智领未来

4、国产数据库逆袭:老邓的“六大不敢替”被金仓逐一破解

5、《一行代码不改动!用KES V9 2025完成SQL Server → 金仓“平替”迁移并启用向量检索》

6、《赤兔引擎×的卢智能体:电科金仓如何用“三骏架构”重塑AI原生数据库一体机》

7、探秘KingbaseES在线体验平台:技术盛宴还是虚有其表?

8、破除“分布式”迷思:回归数据库选型的本质

9、KDMS V4 一键搞定国产化迁移:零代码、零事故、零熬夜——金仓社区发布史上最省心数据库迁移评估神器

10、KingbaseES V009版本发布:国产数据库的新飞跃

第二章:能力与提升

1、零改造迁移实录:2000+存储过程从SQL Server滑入KingbaseES V9R4C12的72小时
2、国产数据库迁移神器,KDMSV4震撼上线

3、在Ubuntu服务器上安装KingbaseES V009R002C012(Orable兼容版)数据库过程详细记录

4、金仓数据库迁移评估系统(KDMS)V4 正式上线:国产化替代的技术底气

5、Ubuntu系统下Python连接国产KingbaseES数据库实现增删改查

Read more

sftpgo汉化处理

问题描述 官方提供的sftpgo webui的默认语言为英文, 没有待中文的语言包。实际上中文语言包已经翻译完毕,本文介绍一种在不重新编译的情况下为sftpgo的webui增加中文包的方法。 准备 1. (已完成安装的跳过) 安装sftpgo的官方安装包, 这里例子中使用的是: sftpgo_v2.6.6_windows_portable.zip 具体下载地址: https://github.com/drakkan/sftpgo/releases 2. 下载已经汉化的中文资源,其实际上是一个json文件, 可以参考这个:https://gitee.com/chenbichao/sftpgo-ryan/blob/master/static/locales/zh/translation.json 3. sftpgo服务已可以正常使用 原理 webui的前端资源都已经在sftpgo的可执行文件的同级目录下存在,分别是template文件夹下的页面展示信息 和 static文件夹下的资源。通过直接修改template中的js代码可以增加页面中的语言选项,并在用户点击是自动下

By Ne0inhk
Flutter 组件 saropa_lints 适配鸿蒙 HarmonyOS 实战:代码质量守卫,构建性能合规性检查与自定义分析规约治理架构

Flutter 组件 saropa_lints 适配鸿蒙 HarmonyOS 实战:代码质量守卫,构建性能合规性检查与自定义分析规约治理架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 saropa_lints 适配鸿蒙 HarmonyOS 实战:代码质量守卫,构建性能合规性检查与自定义分析规约治理架构 前言 在鸿蒙(OpenHarmony)生态迈向大规模工业化协同、涉及超大型项目敏捷迭代、海量模块解耦及严苛 AOT 性能交付标准的背景下,如何实现一套能够自动拦截低质量代码、保障跨团队开发风格绝对统一且符合鸿蒙性能极致要求的“静态扫描中心”,已成为决定应用长期可维护性与研发效能感的关键。在鸿蒙设备这类强调 AOT 静态优化与严格类型安全的环境下,如果应用代码中充斥着滥用的 dynamic 调用或循环引用,由于由于编译期的类型擦除与运行时的屏障开销,极易由于由于“代码腐化”导致鸿蒙应用在长期运行后发生不可预知的内存泄露。 我们需要一种能够强制约束研发纪律、支持自定义规则扩展且具备“一站式”合规性判定的 Linter 方案。 saropa_lints 为 Flutter 开发者引入了“质量铁律”范式。它不是简单的代码检查

By Ne0inhk
Flutter 三方库 objectbox_generator — 自动化构建鸿蒙极速 NoSQL 数据库映射(适配鸿蒙 HarmonyOS Next ohos)

Flutter 三方库 objectbox_generator — 自动化构建鸿蒙极速 NoSQL 数据库映射(适配鸿蒙 HarmonyOS Next ohos)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net。 Flutter 三方库 objectbox_generator — 自动化构建鸿蒙极速 NoSQL 数据库映射(适配鸿蒙 HarmonyOS Next ohos) 在高性能移动应用开发中,本地数据的持久化存储效率往往是决定用户感知流畅度的木桶短板。传统的 SQLite 虽然结构化程度高,但在处理大规模对象关系映射(ORM)时,复杂的 SQL 拼接和反射解析往往会成为性能瓶颈。 ObjectBox 作为一个专为移动设备打造的、跨平台的超高速 NoSQL 数据库,已经成为了许多追求极致体验开发者的首选。而在 Flutter for OpenHarmony 开发中,配合 objectbox_generator,我们可以通过注解驱动的自动化流程,掌握这套高性能数据库的核心用法。 ⚠️ 鸿蒙适配现状提示:截至本文撰写时,ObjectBox 的 Dart 插件尚未提供官方的 OpenHarmony

By Ne0inhk