Python操作国产金仓数据库(KingbaseES)全流程:从环境搭建到实战应用

Python操作国产金仓数据库(KingbaseES)全流程:从环境搭建到实战应用

Python操作国产金仓数据库(KingbaseES)全流程:从环境搭建到实战应用,大家好,我是 xcLeigh。现在国产化数据库越来越普及,金仓数据库(KingbaseES)作为一款超实用的企业级关系型数据库,在政府、金融、能源这些关键领域用得特别多。今天我就带大家从零开始,一步步学会用Python操作金仓数据库,从环境准备、连接数据库,到CRUD核心操作、事务处理,再到常见问题排查,内容全是干货,代码拿过去就能用,就算是新手也能很快上手!

前言

中电科金仓(北京)科技股份有限公司(以下简称"电科金仓")成立于1999年,是成立最早的拥有自主知识产权的国产数据库企业,也是中国电子科技集团(CETC)成员企业。电科金仓以"提供卓越的数据库产品助力企业级应用高质量发展"为使命,致力于"成为世界卓越的数据库产品与服务提供商"。

电科金仓自成立起始终坚持自主创新,专注数据库领域二十余载,具备出色的数据库产品研发及服务能力,核心产品金仓数据库管理系统KingbaseES(简称"KES")是面向全行业、全客户关键应用的企业级大型通用数据库。KES产品V9版本已通过国家权威机构认证,产品核心源代码自主率达到100%。2018年,电科金仓申报的"数据库管理系统核心技术的创新与金仓数据库产业化"项目荣获国家科学技术进步二等奖。金仓数据库管理系统KES于2022年入选国务院国资委发布的十项国有企业数字技术典型成果,彰显数据库领域国家队硬实力。继2023年金仓数据库管理系统V8通过第一批《安全可靠测评》后,2024年金仓数据库管理系统V9、金仓分布式HTAP数据库软件集群V3再度入围,至此电科金仓共计2款产品3个版本通过《安全可靠测评》*。


🥇 点击进入金仓数据库专栏,本专栏聚焦金仓数据库(KingbaseES)这一国产企业级融合数据库,为开发者及技术决策者提供从基础操作到架构设计的系统化学习路径。从多语法兼容(Oracle/MySQL/PostgreSQL)、多模数据存储(关系 / 文档 / 时序 / GIS)等功能展开讲解!


🌞 正文开始:


一、前置知识与环境准备

1.1 核心概念

金仓数据库(KingbaseES)在数据库产品研发和服务方面能力很突出,它的核心产品金仓数据库管理系统KingbaseES(简称"KES"),是面向全行业、全客户关键应用的企业级大型通用数据库。而且KES的V9版本已经通过国家权威机构认证,核心源代码自主率更是做到了100%,这一点特别厉害。

1.2 环境清单

  • 操作系统:Windows 10/11 或者 CentOS 7/8都能用
  • Python版本:得是3.7及以上的,不然可能会有兼容性问题
  • 金仓数据库:推荐用KingbaseES V8R6,这个版本兼容性比较好,用着省心
  • 依赖库:psycopg2-binary,这个库不用咱们手动编译,直接安装就行,很方便

1.3 环境搭建步骤

步骤1:安装Python :先去Python官网下载对应版本的安装包,安装的时候记得勾选"Add Python to PATH",然后按默认步骤装完就行。装完之后,打开命令行输入python --version,能显示版本号就说明装成功了。对了,要是不清楚怎么操作,也可以看看我之前写的这篇文章:https://xcleigh.blog.csdn.net/article/details/149340832

步骤2:安装psycopg2-binary:打开命令行,直接执行下面这个命令就能安装这个依赖库:

bash 复制代码
pip install psycopg2-binary

装完之后,Windows系统可以用pip list | findstr psycopg2,Linux系统用pip list | grep psycopg2,能看到这个库的信息,就说明安装成功了。

步骤3:确认金仓数据库服务 :这一步很关键,得先确保金仓数据库已经启动了,而且能用像Kingbase Navigator这样的客户端正常连接。另外,一定要把数据库的IP地址、端口、数据库名、用户名、密码 记下来,后面连接数据库的时候得用。要是这一步不清楚,也可以参考我这篇文章:https://xcleigh.blog.csdn.net/article/details/147401270


二、Python连接金仓数据库

其实Python连接金仓数据库的原理不复杂,就是通过psycopg2库创建一个数据库连接对象,创建的时候得把金仓数据库的连接参数(比如host、port、dbname这些)都指定好。连接成功之后,再创建游标对象,就能用它来执行SQL语句了。

2.2 连接代码实现

里面的具体参数,大家得根据自己本地数据库的连接配置来填哦。

python 复制代码
import psycopg2
from psycopg2 import OperationalError

def connect_kingbase():
    # 金仓数据库连接参数
    conn_params = {
        "host": "127.0.0.1",  # 数据库IP地址
        "port": 54321,             # 数据库端口(默认54321)
        "dbname": "test",        # 数据库名
        "user": "system",          # 用户名
        "password": "Kingbase123"  # 密码
    }
    
    conn = None
    try:
        # 建立数据库连接
        conn = psycopg2.connect(**conn_params)
        print("✅ 金仓数据库连接成功!")
    except OperationalError as e:
        print(f"❌ 连接失败:{e}")
    
    return conn

# 测试连接
if __name__ == "__main__":
    connection = connect_kingbase()

运行效果:

代码说明

  • 咱们用psycopg2.connect()这个方法,把连接参数传进去,就能得到一个连接对象;
  • 这里还加了OperationalError异常捕获,像IP填错了、密码不对这些连接失败的情况,都能在这里处理;
  • 运行代码之后,要是能看到"✅ 金仓数据库连接成功!"这句话,就说明数据库连接正常啦。

三、核心操作:CRUD实战

接下来,我就以"学生表(student)"为例,给大家演示一下用Python操作金仓数据库的增删改查(CRUD)操作。首先得先创建student表,对应的SQL语句在下面:

sql 复制代码
CREATE TABLE student (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age INT NOT NULL,
    gender VARCHAR(10) NOT NULL,
    major VARCHAR(100) NOT NULL
);

运行效果:

3.1 新增数据(Create)

新增数据很简单,就是用cursor.execute()执行INSERT语句,不管是插入单条学生数据,还是多条都能搞定。

python 复制代码
def insert_student(conn, students):
    insert_sql = """
    INSERT INTO student (name, age, gender, major)
    VALUES (%s, %s, %s, %s);
    """
    try:
        with conn.cursor() as cur:
            cur.executemany(insert_sql, students)
            conn.commit()
            print(f"✅ 成功插入{cur.rowcount}条数据")
    except Exception as e:
        conn.rollback()
        print(f"❌ 插入失败:{e}")

# 测试新增
if __name__ == "__main__":
    conn = connect_kingbase()
    if conn:
        student_list = [
            ("张三", 20, "男", "计算机科学与技术"),
            ("李四", 21, "女", "软件工程"),
            ("王五", 19, "男", "电子信息工程")
        ]
        insert_student(conn, student_list)
        conn.close()

运行效果:


数据库数据变化:

3.2 查询数据(Read)

查询数据就是执行SELECT语句,不管是想查学生表的所有数据,还是加条件查询、排序,都能实现。

python 复制代码
def query_student(conn, condition=None):
    # 基础查询语句
    query_sql = "SELECT * FROM student"
    if condition:
        query_sql += f" WHERE {condition}"
    query_sql += " ORDER BY id;"
    
    try:
        with conn.cursor() as cur:
            cur.execute(query_sql)
            # 获取列名
            columns = [desc[0] for desc in cur.description]
            # 获取查询结果
            results = cur.fetchall()
            # 转换为字典列表(更易读)
            students = [dict(zip(columns, row)) for row in results]
            
            print(f"📊 查询结果(共{len(students)}条):")
            for student in students:
                print(student)
            return students
    except Exception as e:
        print(f"❌ 查询失败:{e}")
        return []

# 测试查询
if __name__ == "__main__":
    conn = connect_kingbase()
    if conn:
        # 查询所有学生
        print("--- 所有学生 ---")
        query_student(conn)
        # 条件查询:年龄大于20的学生
        print("\n--- 年龄大于20的学生 ---")
        query_student(conn, "age > 20")
        conn.close()

运行效果:

3.3 更新数据(Update)

更新数据就是执行UPDATE语句,把符合指定条件的学生数据修改掉就行。

python 复制代码
def update_student(conn, new_data, condition):
    # SQL更新语句
    update_sql = f"""
    UPDATE student
    SET {', '.join([f"{k}=%s" for k in new_data.keys()])}
    WHERE {condition};
    """
    
    try:
        with conn.cursor() as cur:
            cur.execute(update_sql, list(new_data.values()))
            conn.commit()
            print(f"✅ 成功更新{cur.rowcount}条数据")
    except Exception as e:
        conn.rollback()
        print(f"❌ 更新失败:{e}")

# 测试更新
if __name__ == "__main__":
    conn = connect_kingbase()
    if conn:
        # 将张三的专业改为"人工智能"
        update_student(conn, {"major": "人工智能"}, "name='张三'")
        # 查看更新结果
        print("\n--- 更新后的张三 ---")
        query_student(conn, "name='张三'")
        conn.close()

运行效果:

3.4 删除数据(Delete)

删除数据也很 straightforward,执行DELETE语句,把符合指定条件的学生数据删掉就可以了。

python 复制代码
def delete_student(conn, condition):
    # SQL删除语句
    delete_sql = f"DELETE FROM student WHERE {condition};"
    
    try:
        with conn.cursor() as cur:
            cur.execute(delete_sql)
            conn.commit()
            print(f"✅ 成功删除{cur.rowcount}条数据")
    except Exception as e:
        conn.rollback()
        print(f"❌ 删除失败:{e}")

# 测试删除
if __name__ == "__main__":
    conn = connect_kingbase()
    if conn:
        # 删除王五的记录
        delete_student(conn, "name='王五'")
        # 查看删除结果
        print("\n--- 删除后的学生表 ---")
        query_student(conn)
        conn.close()

四、高级应用:事务与连接池

4.1 事务处理

金仓数据库是支持事务ACID特性的,也就是原子性、一致性、隔离性、持久性。在Python里,默认情况下,连接对象的"自动提交"是关闭的,所以得咱们手动调用commit()来提交事务,要是出了问题,就用rollback()回滚事务。
事务示例场景:比如转账的时候,要扣掉A账户的余额,同时给B账户加余额,这两步得同时成功才行。要是其中一步出了错,那整个操作都得回滚,不然账户余额就乱了。

4.2 连接池优化

在高并发的场景下,要是频繁创建、关闭数据库连接,会特别消耗资源。这时候用连接池就很管用,能有效提升性能。我推荐大家用psycopg2.pool模块来实现连接池,具体代码如下:

python 复制代码
from psycopg2 import pool

# 创建连接池
connection_pool = pool.SimpleConnectionPool(
    minconn=1,
    maxconn=5,
    host="192.168.1.100",
    port=54321,
    dbname="testdb",
    user="system",
    password="Kingbase123"
)

# 从连接池获取连接
conn = connection_pool.getconn()
# 执行操作...
# 归还连接到连接池
connection_pool.putconn(conn)
# 关闭连接池(程序退出时)
connection_pool.closeall()

五、常见问题与排查技巧

5.1 连接失败

  • 问题现象:有时候会报错"could not connect to server: Connection refused",遇到这种情况别慌,按步骤排查就行;
  • 排查步骤:首先,检查一下数据库的IP和端口是不是填对了,别输错了数字;然后,确认数据库服务是不是已经启动了,没启动的话肯定连不上;接着,看看防火墙有没有把数据库端口挡住,要是挡住了得开放端口;最后,再核对一下用户名和密码,别记混了。

5.2 语法错误

  • 问题现象:报错"syntax error at or near ...",这一般就是SQL语句有问题;
  • 排查步骤 :先看看写的SQL语句是不是符合金仓数据库的语法规范,不同数据库语法可能有点差别;另外,要注意占位符得用%s,可别用?或者@这些,用错了也会报错。

5.3 事务未提交

  • 问题现象:执行了INSERT、UPDATE、DELETE这些操作后,去数据库里看,数据根本没变化,这是怎么回事呢?;
  • 排查步骤 :其实很可能是忘了提交事务,大家要确认一下,执行完SQL语句后,有没有调用conn.commit()。要是没提交,等连接关闭的时候,事务会自动回滚,数据自然就没变化了。

六、总结

今天这篇文章,我把Python操作金仓数据库的全流程都讲清楚了,从环境搭建到CRUD实战,再到高级的事务和连接池应用,里面的代码示例我都实际测试过,大家拿过去就能用。掌握了这些知识,你就能轻松实现Python和金仓数据库的交互,日常开发中的需求基本都能满足。

要是觉得这篇文章对你有帮助,别忘了点赞、收藏,也可以关注我,后面我还会分享更多国产化数据库和Python相关的实战教程!要是在实践的时候遇到问题,也可以在评论区留言,我看到了会及时回复~

联系博主

xcLeigh 博主,全栈领域优质创作者,博客专家,目前,活跃在CSDN、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。

亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。

愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。

至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。


💞 关注博主 🌀 带你实现畅游前后端!

🥇 从零到一学习Python 🌀 带你玩转Python技术流!

🏆 人工智能学习合集 🌀 搭配实例教程与实战案例,帮你构建完整 AI 知识体系

💦 :本文撰写于CSDN平台 ,作者:xcLeigh所有权归作者所有)https://xcleigh.blog.csdn.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。


📣 亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(或者关注下方公众号,看见后第一时间回复,还有海量编程资料等你来领!),博主看见后一定及时给您答复 💌💌💌

相关推荐
这个DBA有点耶13 小时前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
用户83562907805113 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
用户83562907805113 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
这个DBA有点耶15 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技16 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend17 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
ClouGence20 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
你好潘先生21 小时前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
Agent_大师1 天前
WebSocket 行情重连成功,K线缺口不会自动消失
python
荣码1 天前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python