Python操作国产金仓数据库(KingbaseES)全流程:搭建自己的网页数据管理(增删改查)

Python操作国产金仓数据库(KingbaseES)全流程:搭建自己的网页数据管理(增删改查)

在这里插入图片描述

Python操作国产金仓数据库(KingbaseES)全流程:搭建自己的网页数据管理(增删改查)

Python操作国产金仓数据库(KingbaseES)全流程:搭建自己的网页数据管理(增删改查),现在国产化替代是大趋势,国产数据库的应用越来越广,金仓数据库(KingbaseES)作为其中的佼佼者,在政务、金融这些领域用得特别多。今天我就带大家从0到1,一步步实现用Python操作KingbaseES数据库,还会基于Flask框架搭一个可视化的网页管理系统,数据的增删改查全流程都能搞定,不管你是Python开发者还是数据库管理员,跟着学都能用得上。
在这里插入图片描述

前言

在这里插入图片描述

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

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

在这里插入图片描述

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


🌞 正文开始:


现在国产化替代是大趋势,国产数据库的应用范围越来越广,金仓数据库(KingbaseES)作为其中的佼佼者,在政务、金融等领域部署得特别多。今天我就带大家从0到1,亲手实现用Python操作KingbaseES数据库,还会基于Flask框架搭一个可视化的网页管理系统,数据的增删改查(CRUD)全流程都能覆盖到,Python开发者和数据库管理员跟着学,都能掌握这套实用技能。

一、前置知识与环境准备

开始动手前,咱们得把相关的环境和工具准备好,这样后面开发的时候才不会卡壳。

1.1 核心技术栈

这次做项目用的技术都不复杂,也不用复杂的框架,轻量化还好上手,具体有这些:

  • 后端框架:Flask(这是个轻量级的Python Web框架,用来快速搭网页服务特别方便)
  • 数据库驱动:psycopg2(KingbaseES兼容PostgreSQL协议,直接用这个驱动就能连接数据库)
  • 前端技术:HTML + 原生CSS(不用额外学前端框架,咱们把核心功能实现了就行)
  • 数据库:KingbaseES V8/R3(我这次用的是比较常见的版本,其他版本操作步骤都一样)

1.2 环境安装步骤

步骤1:安装Python(已经装了的话这步就跳过)

直接去Python官网下载3.7及以上版本,安装的时候记得勾选“Add Python to PATH”,这样后面在命令行里就能直接调用pythonpip命令了。

步骤2:安装依赖库

打开命令行,输下面这些命令,就能把项目需要的依赖库装好:

# 安装Flask框架 pip install flask # 安装KingbaseES数据库驱动(兼容PostgreSQL) pip install psycopg2-binary 
步骤3:确认KingbaseES数据库状态
  • 首先得确保KingbaseES数据库已经启动了,而且能通过IP(比如本地的127.0.0.1)和端口(默认常用端口是54321)访问到。
  • 提前创建好数据库,我这次用的是TEST库,大家可以用KingbaseES的图形化工具KingbaseManager来创建。
  • 还要准备好数据库的账号密码,我这里用的是默认管理员账号system,密码大家可以自己修改。

二、项目架构设计

为了让代码结构清晰,后面维护起来也方便,咱们采用“后端逻辑+前端模板”的分层设计,整个项目的目录结构是这样的:

kingbase_web_manager/ # 项目根目录 ├── app.py # 后端核心逻辑(包含Flask服务、数据库操作、路由定义) └── templates/ # 前端HTML模板文件夹(用继承式设计,减少重复代码) ├── base.html # 基础模板(放公共头部、样式、消息提示这些) ├── index.html # 首页(用来展示用户列表) ├── init_schema.html # 表结构初始化页面 ├── create_user.html # 新增用户页面 ├── user_detail.html # 用户详情页面 └── update_balance.html # 余额修改页面 
  • 后端:通过Flask定义路由,处理前端发来的HTTP请求,再调用psycopg2去操作KingbaseES数据库。
  • 前端:用HTML模板继承的方式,base.html作为父模板,这样所有页面风格能统一,也能少写很多重复代码。

三、后端核心实现(app.py)

后端就像是整个系统的“大脑”,负责连接数据库、处理业务逻辑,最后把数据返回给前端。下面我分模块给大家讲核心代码怎么写。

3.1 初始化Flask与数据库配置

首先创建app.py文件,先把Flask应用初始化好,再配置KingbaseES数据库的连接参数:

from flask import Flask, jsonify, request, render_template, redirect, url_for, flash import psycopg2 # KingbaseES数据库驱动import psycopg2.extras as extras # 扩展功能(如DictCursor,让查询结果为字典格式)# 初始化Flask应用 app = Flask(__name__)# 配置secret_key(用于flash消息提示,防止跨站请求伪造) app.secret_key ='kingbase_web_manager_2024'# --------------------------# KingbaseES数据库连接配置# -------------------------- DB_CFG =dict( host="127.0.0.1",# 数据库IP(本地为127.0.0.1,远程需填实际IP) port=54321,# KingbaseES默认常见端口(不同环境可能为5432,需确认) dbname="TEST",# 数据库名称(提前创建好) user="system",# 数据库账号(管理员账号) password="jcsjk520.",# 数据库密码(替换为你的实际密码) connect_timeout=5,# 连接超时时间(5秒))# --------------------------# 数据库连接工具函数# --------------------------defget_conn():"""获取KingbaseES数据库连接"""try:# 使用psycopg2.connect连接数据库,**DB_CFG表示解包配置字典 conn = psycopg2.connect(**DB_CFG)return conn except Exception as e:# 连接失败时抛出异常(后续路由会捕获处理)raise Exception(f"数据库连接失败: {str(e)}")

3.2 表结构初始化(建表)

第一次用的时候,得先创建用户表(t_user),咱们可以通过/init-schema这个路由,在网页端触发建表操作:

@app.route('/init-schema', methods=['GET','POST'])definit_schema():"""初始化用户表结构(GET请求显示页面,POST请求执行建表)"""# 1. POST请求:用户点击"初始化"按钮,执行建表SQLif request.method =='POST':# 定义建表SQL(if not exists确保表不存在时才创建,避免重复执行报错) create_table_sql =""" create table if not exists t_user( id serial primary key, # 自增主键(用户ID) name varchar(64) not null, # 用户名(非空) balance numeric(12,2) default 0, # 余额(默认0,支持两位小数) created_at timestamp default current_timestamp # 创建时间(默认当前时间) ); """try:# 使用with语句自动管理连接和游标(无需手动关闭)with get_conn()as conn, conn.cursor()as cur: cur.execute(create_table_sql)# 执行建表SQL# 建表成功,通过flash传递成功消息(前端会显示) flash('表结构初始化成功!','success')except Exception as e:# 建表失败,传递错误消息 flash(f'初始化失败: {str(e)}','danger')# 无论成功与否,跳转回首页return redirect(url_for('index'))# 2. GET请求:显示初始化表结构的页面return render_template('init_schema.html')

3.3 用户数据增删改查实现

接下来咱们实现核心的CRUD功能,每个功能对应一个路由,专门处理前端的请求,然后操作数据库。

3.3.1 首页:展示所有用户(查-列表)

首页/这个路由会查询t_user表里的所有数据,然后把数据传给前端模板展示出来:

@app.route('/')defindex():"""首页:展示所有用户列表"""try:# 查询所有用户数据(按ID升序,可选) query_sql ="select id, name, balance, created_at from t_user order by id;"# 使用DictCursor,让查询结果为字典(便于前端通过键名获取值)with get_conn()as conn, conn.cursor(cursor_factory=extras.DictCursor)as cur: cur.execute(query_sql)# fetchall()获取所有结果,转换为列表(每个元素是字典) users =[dict(row)for row in cur.fetchall()]# 渲染首页模板,传递用户列表数据return render_template('index.html', users=users)except Exception as e:# 查询失败,显示错误消息,传递空列表 flash(f'数据库查询错误: {str(e)}','danger')return render_template('index.html', users=[])
3.3.2 新增用户(增)

通过/user/create这个路由实现新增用户的功能,还能让用户输入用户名和初始余额:

@app.route('/user/create', methods=['GET','POST'])defcreate_user():"""新增用户(GET显示表单,POST提交数据)"""if request.method =='POST':# 1. 获取前端表单提交的数据(request.form用于获取POST表单数据) name = request.form.get('name')# 用户名(必填) balance = request.form.get('balance',0.0)# 初始余额(可选,默认0)# 2. 数据校验:用户名不能为空ifnot name: flash('用户名不能为空!','danger')return render_template('create_user.html')# 校验失败,返回表单页面try:# 3. 数据格式转换:余额转为浮点数(防止非数字输入) balance =float(balance)if balance else0.0# 4. 执行插入SQL(returning id返回新增用户的ID) insert_sql ="insert into t_user(name, balance) values (%s, %s) returning id;"with get_conn()as conn, conn.cursor()as cur: cur.execute(insert_sql,(name, balance))# %s为参数占位符(防止SQL注入) user_id = cur.fetchone()[0]# 获取返回的用户ID# 5. 新增成功,跳转回首页 flash(f'用户创建成功!用户ID: {user_id}','success')return redirect(url_for('index'))except ValueError:# 余额非数字时捕获异常 flash('初始余额必须为数字!','danger')except Exception as e:# 其他错误(如数据库异常) flash(f'用户创建失败: {str(e)}','danger')# GET请求:显示新增用户表单return render_template('create_user.html')
3.3.3 查看用户详情(查-单条)

通过用户ID查询单条用户数据,然后展示详细信息:

@app.route('/user/<int:user_id>')defget_user(user_id):"""查看单个用户详情(通过URL路径传递user_id)"""try:# 查询指定ID的用户数据 query_sql ="select id, name, balance, created_at from t_user where id=%s;"with get_conn()as conn, conn.cursor(cursor_factory=extras.DictCursor)as cur: cur.execute(query_sql,(user_id,))# 传递user_id参数 user =dict(cur.fetchone())if cur.rowcount >0elseNone# 转换为字典# 校验用户是否存在ifnot user: flash('该用户不存在!','danger')return redirect(url_for('index'))# 不存在则跳转回首页# 渲染详情页面,传递用户数据return render_template('user_detail.html', user=user)except Exception as e: flash(f'查询用户失败: {str(e)}','danger')return redirect(url_for('index'))
3.3.4 修改用户余额(改)

通过/user/<user_id>/balance这个路由调整用户余额,不管是增加还是减少都能实现:

@app.route('/user/<int:user_id>/balance', methods=['GET','POST'])defupdate_balance(user_id):"""修改用户余额(GET显示表单,POST提交修改)"""if request.method =='POST':try:# 1. 获取余额变动值(delta:正数增加,负数减少) delta =float(request.form.get('delta',0))# 2. 执行更新SQL(balance = balance + %s 实现增量更新) update_sql ="update t_user set balance = balance + %s where id=%s;"with get_conn()as conn, conn.cursor()as cur: cur.execute(update_sql,(delta, user_id))# 校验用户是否存在(rowcount为受影响行数,0表示无此用户)if cur.rowcount ==0: flash('该用户不存在!','danger')return redirect(url_for('index'))# 3. 更新成功,跳转回用户详情页 flash('余额更新成功!','success')return redirect(url_for('get_user', user_id=user_id))except ValueError:# 变动值非数字时捕获异常 flash('余额变动值必须为数字!','danger')except Exception as e: flash(f'余额更新失败: {str(e)}','danger')# GET请求:显示余额修改表单(先查询当前用户信息)try: query_sql ="select id, name, balance from t_user where id=%s;"with get_conn()as conn, conn.cursor(cursor_factory=extras.DictCursor)as cur: cur.execute(query_sql,(user_id,)) user =dict(cur.fetchone())if cur.rowcount >0elseNoneifnot user: flash('该用户不存在!','danger')return redirect(url_for('index'))# 渲染修改余额表单,传递当前用户信息return render_template('update_balance.html', user=user)except Exception as e: flash(f'查询用户信息失败: {str(e)}','danger')return redirect(url_for('index'))
3.3.5 删除用户(删)

通过/user/<user_id>/delete这个路由删除指定用户,为了防止误删,还得让用户确认一下操作:

@app.route('/user/<int:user_id>/delete', methods=['POST'])defdelete_user(user_id):"""删除用户(仅支持POST请求,避免GET请求误触发)"""try:# 执行删除SQL delete_sql ="delete from t_user where id=%s;"with get_conn()as conn, conn.cursor()as cur: cur.execute(delete_sql,(user_id,))if cur.rowcount ==0: flash('该用户不存在!','danger')else: flash('用户删除成功!','success')except Exception as e: flash(f'用户删除失败: {str(e)}','danger')# 删除后跳转回首页return redirect(url_for('index'))# --------------------------# 启动Flask服务# --------------------------if __name__ =='__main__':# debug=True:开发模式(代码修改后自动重启,错误信息显示在网页上) app.run(debug=True)

四、前端模板实现(templates文件夹)

前端咱们用“继承式模板”来设计,base.html里定义公共的样式和页面结构,其他模板都继承它,这样能少写很多重复代码。

4.1 基础模板(base.html)

所有页面的公共部分,像头部标题、样式、消息提示这些,都放在这个模板里:

<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>Kingbase用户管理系统</title><!-- 公共CSS样式(统一页面风格) --><style>.container{max-width: 1200px;margin: 0 auto;padding: 20px;}.flash{padding: 12px;margin: 15px 0;border-radius: 4px;font-size: 14px;}.success{background-color: #d4edda;color: #155724;border: 1px solid #c3e6cb;}.danger{background-color: #f8d7da;color: #721c24;border: 1px solid #f5c6cb;}table{width: 100%;border-collapse: collapse;margin: 20px 0;}th, td{padding: 12px 15px;border: 1px solid #ddd;text-align: left;}th{background-color: #f8f9fa;font-weight: bold;}tr:hover{background-color: #f8f9fa;}.btn{display: inline-block;padding: 8px 16px;margin: 0 5px;text-decoration: none;color: #fff;border-radius: 4px;border: none;cursor: pointer;font-size: 14px;}.btn-primary{background-color: #007bff;}.btn-success{background-color: #28a745;}.btn-danger{background-color: #dc3545;}.form-group{margin-bottom: 20px;}label{display: block;margin-bottom: 8px;font-weight: bold;}input{padding: 10px;width: 350px;border: 1px solid #ddd;border-radius: 4px;font-size: 14px;box-sizing: border-box;}h1, h2{color: #333;margin-bottom: 20px;}.operate-btn-group{margin: 20px 0;}</style></head><body><divclass="container"><!-- 页面标题(点击可返回首页) --><h1><ahref="/"style="text-decoration: none;color: #333;">Kingbase用户管理系统</a></h1><!-- 消息提示区域(显示success/danger消息) --><div> {% with messages = get_flashed_messages(with_categories=true) %} {% if messages %} {% for category, message in messages %} <divclass="flash {{ category }}">{{ message }}</div> {% endfor %} {% endif %} {% endwith %} </div><!-- 子模板内容区域(由其他页面填充) --> {% block content %}{% endblock %} </div></body></html>

4.2 首页模板(index.html)

这个模板继承base.html,主要用来展示用户列表和操作按钮:

{% extends "base.html" %} <!-- 继承基础模板 --> {% block content %} <!-- 填充content区域 --><!-- 操作按钮组(初始化表结构、新增用户) --><divclass="operate-btn-group"><ahref="/init-schema"class="btn btn-primary">初始化表结构</a><ahref="/user/create"class="btn btn-success">添加新用户</a></div><!-- 用户列表标题 --><h2>用户列表</h2><!-- 若有用户数据,展示表格;否则提示无数据 --> {% if users %} <table><tr><th>用户ID</th><th>用户名</th><th>账户余额(元)</th><th>创建时间</th><th>操作</th></tr> {% for user in users %} <!-- 循环遍历用户列表 --><tr><td>{{ user.id }}</td><td>{{ user.name }}</td><td>{{ user.balance }}</td><td>{{ user.created_at }}</td><td><!-- 查看详情按钮 --><ahref="/user/{{ user.id }}"class="btn btn-primary">查看</a><!-- 调整余额按钮 --><ahref="/user/{{ user.id }}/balance"class="btn btn-success">调整余额</a><!-- 删除按钮(POST请求,需用表单包裹) --><formaction="/user/{{ user.id }}/delete"method="post"style="display: inline;"><buttontype="submit"class="btn btn-danger"onclick="return confirm('确定要删除该用户吗?删除后不可恢复!')"> 删除 </button></form></td></tr> {% endfor %} </table> {% else %} <pstyle="color: #666;font-size: 16px;">暂无用户数据,请先初始化表结构并添加用户。</p> {% endif %} {% endblock %} 
在这里插入图片描述

4.3 表结构初始化模板(init_schema.html)

这个模板提供一个初始化表结构的确认按钮,点击就能触发建表:

{% extends "base.html" %} {% block content %} <h2>初始化用户表结构</h2><pstyle="font-size: 16px;margin: 20px 0;"> 点击下方按钮创建用户表(t_user),若表已存在则不会重复创建。 </p><!-- 提交表单(POST请求触发建表) --><formmethod="post"><buttontype="submit"class="btn btn-success">确认初始化表结构</button><ahref="/"class="btn btn-primary">返回首页</a></form> {% endblock %} 
在这里插入图片描述

4.4 新增用户模板(create_user.html)

这里有个表单,用户可以输入用户名和初始余额,用来新增用户:

{% extends "base.html" %} {% block content %} <h2>添加新用户</h2><formmethod="post"><!-- 用户名输入框(必填) --><divclass="form-group"><labelfor="name">用户名 <spanstyle="color: red;">*</span></label><inputtype="text"id="name"name="name"requiredplaceholder="请输入用户名(如:张三)"></div><!-- 初始余额输入框(可选) --><divclass="form-group"><labelfor="balance">初始余额(元)</label><inputtype="number"id="balance"name="balance"step="0.01"min="0"placeholder="请输入数字(默认0,如:100.50)"></div><!-- 提交与返回按钮 --><buttontype="submit"class="btn btn-success">创建用户</button><ahref="/"class="btn btn-primary">返回首页</a></form> {% endblock %} 
在这里插入图片描述

4.5 用户详情模板(user_detail.html)

这个模板用来展示单个用户的详细信息,看得更清楚:

{% extends "base.html" %} {% block content %} <h2>用户详情</h2> {% if user %} <table><tr><thstyle="width: 150px;">用户ID</th><td>{{ user.id }}</td></tr><tr><th>用户名</th><td>{{ user.name }}</td></tr><tr><th>账户余额(元)</th><td>{{ user.balance }}</td></tr><tr><th>创建时间</th><td>{{ user.created_at }}</td></tr></table><!-- 操作按钮 --><divclass="operate-btn-group"><ahref="/user/{{ user.id }}/balance"class="btn btn-success">调整余额</a><ahref="/"class="btn btn-primary">返回用户列表</a></div> {% endif %} {% endblock %} 
在这里插入图片描述

4.6 余额修改模板(update_balance.html)

这里有个输入框,用户可以输入余额变动值,用来调整用户余额:

{% extends "base.html" %} {% block content %} <h2>调整用户余额</h2> {% if user %} <!-- 显示当前用户信息 --><pstyle="font-size: 16px;margin: 10px 0;"> 当前用户:<strong>{{ user.name }}</strong>(ID:{{ user.id }}) </p><pstyle="font-size: 16px;margin: 10px 0;"> 当前余额:<strong>{{ user.balance }} 元</strong></p><!-- 余额变动表单 --><formmethod="post"><divclass="form-group"><labelfor="delta">余额变动值(元)</label><inputtype="number"id="delta"name="delta"step="0.01"requiredplaceholder="正数增加,负数减少(如:50.00 或 -20.50)"><smallstyle="color: #666;display: block;margin-top: 5px;"> 提示:输入正数表示增加余额,输入负数表示减少余额(如输入-10表示减少10元) </small></div><!-- 提交与返回按钮 --><buttontype="submit"class="btn btn-success">确认更新</button><ahref="/user/{{ user.id }}"class="btn btn-primary">返回详情</a></form> {% endif %} {% endblock %} 
在这里插入图片描述

五、系统运行与测试

代码都写完之后,咱们就可以启动系统,测试一下功能能不能正常用了。

5.1 启动步骤

  1. 首先得确保KingbaseES数据库已经启动了,而且DB_CFG里配置的IP、端口、账号密码都是对的。

看到下面这样的输出,就说明Flask服务启动成功了:

* Serving Flask app 'app' * Debug mode: on WARNING: This is a development server. Do not use it in a production deployment. * Running on http://127.0.0.1:5000 Press CTRL+C to quit 

找到项目根目录(就是app.py所在的文件夹),打开命令行,输入下面这个命令:

python app.py 

5.2 功能测试流程

步骤1:初始化表结构
  • 打开浏览器,访问http://127.0.0.1:5000,点击“初始化表结构”按钮,页面会提示“表结构初始化成功”。
  • 这时候大家可以用KingbaseManager工具查一下,TEST库里已经创建好t_user表了。
步骤2:新增用户
  • 点击页面上的“添加新用户”,输入用户名(比如“张三”),再填个初始余额(比如“200”),然后点击“创建用户”,页面会提示“用户创建成功”。
  • 回到首页,就能看到刚才新增的用户数据了。
步骤3:查看用户详情
  • 找到刚才新增的用户,点击用户那一行的“查看”按钮,就能进入详情页,用户的ID、姓名、余额、创建时间都能看到。
步骤4:修改用户余额
  • 在详情页点击“调整余额”,输入变动值(比如“50”,意思是增加50元),然后点击“确认更新”,页面会提示“余额更新成功”。
  • 再回到详情页,就会发现余额已经变成250元了。
步骤5:删除用户
  • 回到首页,找到要删除的用户,点击“删除”按钮,会弹出一个确认框,点击“确定”,页面提示“用户删除成功”。
  • 这时候首页就不会再显示这个用户的数据了。

六、常见问题与解决方案

开发和测试的时候,大家可能会遇到一些问题,我整理了几个常见的,还给出了对应的解决办法:

6.1 数据库连接失败

  • 错误提示数据库连接失败: could not connect to server: Connection refused
  • 原因:要么是KingbaseES数据库没启动,要么是IP或者端口配置错了。
  • 解决方案
    1. 先检查KingbaseES服务有没有启动,可以通过服务管理器或者sys_ctl命令来查看。
    2. 确认一下DB_CFG里的host(远程的话要填实际IP,本地就是127.0.0.1)和port(默认是54321,有些环境可能是5432)对不对。
    3. 还要确保数据库账号密码是对的,而且system账号有操作TEST库的权限。

6.2 建表失败

  • 错误提示初始化失败: permission denied for schema public
  • 原因system账号对public模式没有创建表的权限。
  • 解决方案
    1. 执行完之后,再重新做一次初始化操作就行。

用KingbaseManager登录TEST库,执行下面这个授权SQL:

grantcreateonschemapublicto system;

6.3 余额修改时提示“非数字”

  • 错误提示余额变动值必须为数字!
  • 原因:在输入余额变动值的时候,里面混了非数字字符,比如字母、中文这些。
  • 解决方案:输入的时候注意一下,只填数字、小数点(比如“30.5”)或者负号(比如“-10”)就可以了。

七、项目扩展建议

这个项目目前实现了基础的用户管理功能,大家可以根据自己的实际需求再扩展一下,比如这些方向:

  1. 用户认证:加个登录功能(可以用Flask-Login),这样能防止没授权的人随便访问系统。
  2. 分页查询:要是用户数据特别多,在首页加个分页功能会更方便,用SQL的limitoffset就能实现。
  3. 数据校验:新增用户的时候,加个用户名唯一性校验,先查一下数据库里有没有重名的,避免重复创建。
  4. 日志记录:用logging模块记录数据库的操作日志,后面要是出了问题,排查起来会更方便。
  5. 生产环境部署:要是要放到生产环境用,记得把debug模式关掉,用Gunicorn当WSGI服务器,再配个Nginx做反向代理,这样更稳定。

八、总结

这篇文章从环境准备、架构设计、代码实现到功能测试,把用Python操作KingbaseES数据库,还有搭网页管理系统的过程都讲清楚了。咱们用Flask框架和psycopg2驱动,实现了数据增删改查的全流程,前端用原生HTML/CSS,页面简单又好用。

希望这篇文章能帮大家快速掌握用Python操作国产数据库的技巧,给国产化项目开发提供点参考。

联系博主

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

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

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

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


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

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

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

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


在这里插入图片描述

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

Read more

迅投实盘1:一个简单的下单程序,跑通python实盘全流程

博主使用迅投投研的程序开始要写实盘的代码了,这个系列的博客就是记录使用迅投的各种方法,一边学习一边记录。 迅投把python分为两个版本: 1. 内置python:指的是使用迅投客户端,客户端可以新建python脚本写策略 2. 原生python:使用xtquant包就可以通过本地python操作客户端执行策略 内置python依赖客户端编辑器且无法调试,因此这个系列博主尽可能的使用本地的python,在Pycharm中进行开发。 迅投官方知识库:https://dict.thinktrader.net/ xtquant官方说明文档:https://dict.thinktrader.net/nativeApi/start_now.html 下单的示例程序 程序逻辑说明 这里我们就执行一个最简单的操作,看是否打通了整个流程: 1. 需要先安装好python环境,并且把xtquant的压缩包放到根目录,使用如下代码判断环境是否配置好 import time, datetime, sys from xtquant.xttrader import XtQuantTr

By Ne0inhk
【2025 最新】 Python 安装教程 以及 Pycharm 安装教程(超详细图文指南,附常见问题解决)

【2025 最新】 Python 安装教程 以及 Pycharm 安装教程(超详细图文指南,附常见问题解决)

前言         Python 作为目前最热门的编程语言之一,在数据分析、人工智能、Web 开发等领域应用广泛。而 PyCharm 作为 JetBrains 推出的 Python 集成开发环境(IDE),以其强大的功能和友好的界面成为开发者的首选工具。         本文针对 2025 年最新版 Python(3.13.x)和 PyCharm(202x.x.x),提供Windows 10或11和macOS Sonoma双系统安装教程,从官网下载到环境配置一步到位,同时整理了安装过程中最常见的 10 类问题及解决方案,确保新手也能顺利完成环境搭建。 一、Python 安装教程(2025 最新版) 1. 下载 Python 安装包 步骤 1:访问 Python 官网

By Ne0inhk

Java对接拉卡拉支付完整指南

Java对接拉卡拉支付完整指南 目录 1. 概述 2. 环境准备 3. SDK初始化配置 4. 支付接口实现 5. 回调处理 6. 完整代码示例 7. 注意事项 8. 常见问题 概述 拉卡拉支付是中国领先的第三方支付解决方案提供商。本文档详细介绍如何在Java Spring Boot项目中集成拉卡拉支付SDK,实现收银台订单创建和支付回调处理功能。 功能特性 * ✅ 收银台订单创建(全报文加密) * ✅ 支付回调通知处理 * ✅ 签名验证 * ✅ 订单状态管理 1.环境准备 接入官方sdk <!-- 拉卡拉支付依赖--> <dependency> <groupId>com.lkl.laop.sdk</groupId>

By Ne0inhk
Python中的Dict子类:优雅扩展字典的无限可能

Python中的Dict子类:优雅扩展字典的无限可能

🌟 Python中的Dict子类:优雅扩展字典的无限可能 * 一、📚 字典基础回顾:理解Python的dict * 二、✨ 为什么要创建字典子类? * 三、🔧 创建字典子类的三种方式 * 1. 直接继承dict类 * 2. 使用collections.UserDict * 3. 使用collections.abc.MutableMapping * 四、🎯 实用字典子类案例 * 1. DefaultDict的替代实现 * 2. 类型限制字典 * 3. 自动持久化字典 * 五、📊 不同实现方式的比较 * 六、💡 最佳实践与注意事项 * 七、🚀 结语:扩展字典的无限可能性 在Python的广阔天地中,字典(dict)无疑是最为璀璨的明珠之一。它以其高效的键值对存储方式和灵活的操作特性,成为Python开发者日常编程中不可或缺的工具。然而,当标准字典无法满足我们的特殊需求时,Python为我们提供了创建字典子类的优雅方式,让我们能够扩展字典的功能,打造专属的数据结构。 一、📚 字典基础回顾:理解Python的dict

By Ne0inhk