• [产品公告] 凝聚行业共识、树立运维标杆,《金融行业GaussDB运维白皮书》震撼发布
    凝聚行业共识、树立运维标杆,《金融行业GaussDB运维白皮书》震撼发布,欢迎查阅。
  • [问题求助] varchar类型,插入的字符、字节符合要求,提示表插入数据失败,是不是bug?
    varchar类型,插入的字符、字节符合要求,提示表插入数据失败,是不是bug?
  • [分享交流] 2025华为全联接大会,大家希望看到哪些内容
    2025华为全联接大会,大家希望看到哪些内容
  • [技术干货] 集思广益下,说说存储过程与函数的区别,及使用存储过程的优点
    含义不同:    存储过程是SQL语句和可控制流程语句的预编译集合;    函数是有一个或多个SQL语句组成的子程序;使用条件不同:    存储过程:可以在单个存储过程中执行一系列SQL语句。而且可以从自己的存储过程内引入其他存储过程,这可以简化一系列复杂的语句;    函数:自定义函数有着诸多限制,有许多语句不能使用,例如临时表。执行方式不同:    存储过程:存储过程可以返回参数,如记录集,存储过程声明时不需要返回类型    函数:函数只能返回值或表对象,声明时需要描述返回类型,且函数中必须包含一个有效return语句。 存储过程优点:1.存储过程极大的提高SQL语言和灵活性,可以完成复杂的运算2.可以保障数据的安全性和完整性3.极大的改善SQL语句的性能,在运行存储过程之前,数据库已对其进行语法和句法分析,并给出优化执行优化方案。这种已经编译好的过程极大地改善了SQL语句性能。4.可以降低网络的通信量,客户端通过调用存储过程只需要存储过程名和相关参数即可,与传输SQL语句相比自然数据量少很多。存储过程和匿名块的区别:1.存储过程是经过预编译并存储在数据库中的,可以重复使用;而匿名块是未存储在数据库中,从应用程序缓存区擦除后,除非应用重新输入代码,否则无法重新执行。2.匿名块无需命名,存储过程必须申明名字。 集思广益下,欢迎补充。
  • [数据库类] openGauss数据库服务器异常断电后无法启动,求助怎么修复
    显示gscgroup_app.cfg文件缺失或者大小不一致,这种怎么解决[app@localhost log]$ gs_ctl start -D /data/opengauss/data/master/ [2025-09-13 12:15:52.262][50224][][gs_ctl]: gs_ctl started,datadir is /data/opengauss/data/master [2025-09-13 12:15:52.803][50224][][gs_ctl]: waiting for server to start....0 LOG:  [Alarm Module]can not read GAUSS_WARNING_TYPE env.0 LOG:  [Alarm Module]Host Name: localhost 0 LOG:  [Alarm Module]Host IP: localhost. Copy hostname directly in case of taking 10s to use 'gethostbyname' when /etc/hosts does not contain <HOST IP>0 LOG:  [Alarm Module]Cluster Name: dbCluster 0 LOG:  [Alarm Module]Invalid data in AlarmItem file! Read alarm English name failed! line: 570 WARNING:  failed to open feature control file, please check whether it exists: FileName=gaussdb.version, Errno=2, Errmessage=No such file or directory.0 WARNING:  failed to parse feature control file: gaussdb.version.0 WARNING:  Failed to load the product control file, so gaussdb cannot distinguish product version.2025-09-13 12:15:52.943 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  when starting as multi_standby mode, we couldn't support data replicaton.2025-09-13 12:15:52.943 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  base_page_saved_interval is 400, ori is 400.2025-09-13 12:15:52.976 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  [Alarm Module]can not read GAUSS_WARNING_TYPE env.2025-09-13 12:15:52.976 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  [Alarm Module]Host Name: localhost 2025-09-13 12:15:52.976 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  [Alarm Module]Host IP: localhost. Copy hostname directly in case of taking 10s to use 'gethostbyname' when /etc/hosts does not contain <HOST IP>2025-09-13 12:15:52.976 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  [Alarm Module]Cluster Name: dbCluster 2025-09-13 12:15:52.976 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  [Alarm Module]Invalid data in AlarmItem file! Read alarm English name failed! line: 572025-09-13 12:15:52.982 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  loaded library "security_plugin"2025-09-13 12:15:52.984 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] WARNING:  could not create any HA TCP/IP sockets2025-09-13 12:15:52.999 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  InitNuma numaNodeNum: 1 numa_distribute_mode: none inheritThreadPool: 0.2025-09-13 12:15:52.999 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  reserved memory for backend threads is: 220 MB2025-09-13 12:15:52.999 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  reserved memory for WAL buffers is: 128 MB2025-09-13 12:15:53.000 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  Set max backend reserve memory is: 348 MB, max dynamic memory is: 8139 MB2025-09-13 12:15:53.000 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  shared memory 3288 Mbytes, memory context 8487 Mbytes, max process memory 12288 Mbytes2025-09-13 12:15:53.000 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  shared memory that key is 5432001 is owned by pid 489662025-09-13 12:15:53.287 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [CACHE] LOG:  set data cache  size(402653184)2025-09-13 12:15:53.354 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [SEGMENT_PAGE] LOG:  Segment-page constants: DF_MAP_SIZE: 8156, DF_MAP_BIT_CNT: 65248, DF_MAP_GROUP_EXTENTS: 4175872, IPBLOCK_SIZE: 8168, EXTENTS_PER_IPBLOCK: 1021, IPBLOCK_GROUP_SIZE: 4090, BMT_HEADER_LEVEL0_TOTAL_PAGES: 8323072, BktMapEntryNumberPerBlock: 2038, BktMapBlockNumber: 25, BktBitMaxMapCnt: 5122025-09-13 12:15:53.404 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  gaussdb: fsync file "/data/opengauss/data/master/gaussdb.state.temp" success2025-09-13 12:15:53.404 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  create gaussdb state file success: db state(STARTING_STATE), server mode(Normal), connection index(1)2025-09-13 12:15:53.451 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  max_safe_fds = 974, usable_fds = 1000, already_open = 162025-09-13 12:15:53.457 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  the configure file /home/app/software/openGauss/etc/gscgroup_app.cfg doesn't exist or the size of configure file has changed. Please create it by root user!2025-09-13 12:15:53.457 [unknown] [unknown] localhost 139895330818752 0[0:0#0]  0 [BACKEND] LOG:  Failed to parse cgroup config file.[2025-09-13 12:15:58.810][50224][][gs_ctl]:  gaussDB state is Coredump[2025-09-13 12:15:58.811][50224][][gs_ctl]: stopped waiting[2025-09-13 12:15:58.811][50224][][gs_ctl]: could not start serverExamine the log output.
  • [问题求助] idle in transaction timeout
    idle in transaction timeout 这个guc参数设置后,是否需要重启实例才能生效。
  • [问题求助] gaussdb的自动统计信息收集策略是什么样的?(涉及重要系统国产替换,请尽量详细回答,感谢!!!)
    定时触发收集?还是实时监测表的数据变化,达到某个阈值之后触发收集?实时监测表的数据变化,是由什么东西来完成?这个东西是实时监测吗?还是间隔一段时间批量扫描表?如果是表结构变化,比如增删字段,能够触发统计信息收集吗?gaussdb是否支持分区级别的统计信息拷贝?分区级别的统计信息锁定?与统计信息自动收集相关的参数有哪些呢?比如我新建了一张表,往里面插入了1行数据,gaussdb会立马识别到表的统计信息需要更新,然后进行更新吗?如果我一张表凌晨3点有几百条数据,到了早上9点有上百万条数据,统计信息却没有正确更新,一般是什么原因导致的?
  • [问题求助] OpenGauss如何选择兼容类型
    创建OpenGauss库可以指定兼容类型吗?默认好像是兼容Oracle的,新增非空字段并设置默认''会失败 
  • [案例共创] 【案例共创】基于华为开发者空间云开发环境和GaussDB数据库—员工工资管理系统实战
    基于华为开发者空间云开发环境和GaussDB数据库—员工工资管理系统实战案例介绍本案例基于 华为开发者空间 提供的云开发环境和 GaussDB数据库,模拟企业员工工资管理的场景。通过创建员工信息表,结合SQL语句实现 员工数据的新增、查询、修改、删除 以及 工资的统计与分析,帮助初学者快速掌握数据库在实际业务中的应用。与传统本地环境相比,开发者空间提供了 在线IDE 与 一键连接数据库 的能力,使得数据库实验不再依赖本地环境配置,极大地方便了学习与实践。案例内容环境准备:在华为开发者空间创建GaussDB数据库实例并完成连接配置。表结构设计:创建员工信息表(包含ID、姓名、部门、年龄、工资等字段)。基础操作:通过SQL语句实现增、删、改、查操作。统计分析:利用聚合函数实现工资平均值、最高工资、部门工资总和等简单统计。应用拓展:结合业务场景,模拟人力资源对员工数据的日常管理。一、概述1.1 案例介绍在企业管理中,员工工资信息属于核心数据之一。人力资源部门需要经常执行数据的 新增、修改、删除,并进行各种 统计分析。本案例通过一个 员工工资管理系统雏形,演示如何使用GaussDB数据库完成以下功能:创建员工表,保存员工的基本信息。插入员工数据,实现批量录入。查询员工工资信息。修改某位员工的工资。删除离职员工的信息。对工资数据进行统计(如平均值、最高值、总和)。通过本案例,读者不仅能够快速掌握数据库基础操作,还能模拟企业实际业务,理解数据库在生产中的应用价值。1.2 适用对象数据库初学者:想要快速上手SQL语句及数据库操作。在校学生:需要做数据库相关实验或课程设计。企业开发人员:希望了解GaussDB数据库在企业数据管理中的应用。科研人员/数据分析师:需要在安全可靠的环境中进行数据处理与分析。1.3 案例时间整体耗时:约 1-2小时(含环境准备与实验操作)。环境搭建:10-20分钟(创建GaussDB实例、配置连接)。表结构设计与创建:10分钟。数据增删改查练习:30分钟。工资统计与分析:20分钟。总结与拓展:10分钟。通过1-2小时的学习与动手实践,用户即可掌握 数据库表设计、SQL基础操作 以及 简单的数据分析。1.4 案例流程整个案例按照从环境准备到功能实现的逻辑展开,具体步骤如下:环境准备登录华为开发者空间,进入工作台。创建GaussDB数据库实例,配置数据库用户与密码。在云开发环境中通过gsql工具或在线IDE连接数据库。表结构设计创建员工信息表 EMPLOYEE,包含:员工ID、姓名、部门、年龄、工资等字段。数据操作(CRUD)新增(Insert):插入员工基本信息和工资数据。查询(Select):按条件查询员工工资、部门平均工资等。修改(Update):调整员工工资或更新部门信息。删除(Delete):删除离职员工数据。统计分析使用聚合函数(AVG、SUM、MAX、MIN)进行工资统计。统计各部门工资总额与平均工资,支持简单的人力资源分析场景。结果展示与总结在控制台输出SQL执行结果。分析数据库操作对实际业务的意义。1.5 资源总览为顺利完成本案例,需准备以下资源与环境:软件与工具华为开发者空间(DevCloud)GaussDB数据库实例(支持SQL标准语法)gsql命令行工具或在线IDE数据库表EMPLOYEE(员工表)ID:员工编号(主键)NAME:员工姓名DEPT:部门名称AGE:年龄SALARY:工资实验数据模拟若干员工数据(5-10条即可),覆盖不同部门与工资水平,便于后续统计分析。时间与技能要求实验时间:1-2小时技能要求:掌握基础SQL语句(SELECT、INSERT、UPDATE、DELETE)二、GaussDB云数据库领取与配置2.1 领取免费版GaussDB🎉 GaussDB在线试用版免费开放报名活动时间:2025年6月21日 - 2025年12月31日名额:限量1000个,先到先得!📌 报名流程:提交报名申请,1-3个工作日内完成审核并以短信通知结果。审核通过后,登录开发者空间工作台,即可看到 GaussDB免费试用 提示,点击“立即开通”即可体验。填写GaussDB数据库开通参数:虚拟私有云:进入控制台创建,直接使用默认参数即可。安全组:选择默认安全组。管理员密码:自行设置并妥善保存,后续连接数据库时需使用该密码。绑定弹性公网IP(EIP)如果需要远程访问数据库,必须绑定 公网EIP(EIP需购买,按需计费 0.33 元/小时)。操作方法:点击数据库实例名称,进入 GaussDB基本信息 页面进行绑定。登录GaussDB登录结果如下三、员工工资管理系统实战这是一个基于Flask和GaussDB开发的员工工资管理系统,提供员工信息的管理、工资数据的统计分析等功能。系统采用前后端分离的架构,前端使用HTML、JavaScript和CSS,并结合Tailwind CSS提供现代化的用户界面。3.1新建GaussDB数据库在连接好 GaussDB 数据库后,第一步就是创建 员工信息表,用于存储员工的基本信息和工资数据。数据库配置创建数据库CREATE DATABASE employee_db; 创建用户CREATE USER postgres WITH PASSWORD 'your_password'; GRANT ALL PRIVILEGES ON DATABASE employee_db TO postgres; 修改app.py中的数据库连接配置DB_CONFIG = { 'host': 'xxx', #已删除,替换为自己的地址 'port': '5432', 'database': 'employee_db', 'user': 'postgres', 'password': '123456' } SQl为:CREATE TABLE EMPLOYEE ( ID INT PRIMARY KEY NOT NULL, NAME VARCHAR(50) NOT NULL, DEPT VARCHAR(50) NOT NULL, AGE INT, SALARY DECIMAL(10,2), JOIN_DATE DATE ); 字段名数据类型说明约束IDINT员工编号主键,唯一,不为空NAMEVARCHAR(50)员工姓名不为空DEPTVARCHAR(50)所属部门不为空AGEINT年龄可为空SALARYDECIMAL(10,2)工资可为空JOIN_DATEDATE入职日期可为空ID 设置为主键,保证每位员工编号唯一。SALARY 类型为 DECIMAL(10,2),可存储带两位小数的工资金额。JOIN_DATE 可用于后续统计员工入职时间或计算工龄。表结构设计简单明了,满足基本工资管理需求,同时便于后续扩展功能(如部门统计、入职年份分析等)。3.2 增加员工在员工表 EMPLOYEE 创建完成后,可以通过 INSERT 语句 将员工信息录入数据库。-- 插入单条员工记录 INSERT INTO EMPLOYEE (ID, NAME, DEPT, AGE, SALARY, JOIN_DATE) VALUES (1, '张三', '研发部', 28, 8500.00, '2023-06-15'); -- 插入多条员工记录 INSERT INTO EMPLOYEE (ID, NAME, DEPT, AGE, SALARY, JOIN_DATE) VALUES (2, '李四', '财务部', 32, 9000.00, '2022-03-10'), (3, '王五', '市场部', 26, 7200.00, '2024-01-05'), (4, '赵六', '研发部', 30, 8800.00, '2021-11-20'); 单条插入:适合录入单个员工信息。批量插入:适合一次性录入多名员工,效率更高。字段顺序:INSERT INTO 中列出的字段顺序需与 VALUES 中的值顺序对应。数据类型匹配:确保每列数据类型与表设计一致(如工资为 DECIMAL、年龄为 INT)。效果图如下3.3 编辑员工在员工信息录入完成后,企业往往需要根据实际情况 调整员工信息,例如修改工资、部门或者姓名。打开员工工资管理系统或连接到数据库。选择需要编辑的员工,例如按 员工ID 或 姓名 查找目标员工。在编辑界面或命令行中修改对应字段,例如:调整工资更新部门更正姓名或年龄信息提交修改后,系统会提示操作成功。效果图如下3.4 删除员工在员工管理过程中,当员工离职或信息需要清理时,可以通过 删除功能 将员工记录从数据库中移除。打开员工工资管理系统或连接到数据库。按 员工ID 或 姓名 查找需要删除的员工记录。选择 删除操作,确认删除。系统会提示删除成功,员工信息从数据库中彻底移除。3.5 工资统计在员工工资管理系统中,除了日常的增删改查操作,企业还需要对工资数据进行 统计与分析,帮助管理层做决策。打开系统的 工资统计模块 或通过数据库查询工资信息。可根据不同需求选择统计维度,例如:全公司统计:平均工资、最高工资、最低工资、工资总额。部门统计:按部门计算平均工资、部门总工资。员工个体:查看某位员工的工资历史或变化趋势。系统会根据选择的统计条件生成结果,并可通过表格或图表展示。四.总结本案例通过 华为开发者空间云开发环境 与 GaussDB数据库,完整演示了一个员工工资管理系统的设计与实现流程。通过动手实践,读者能够深刻理解和掌握数据库在企业业务中的应用价值。总结如下几点:快速上手数据库操作利用GaussDB提供的云环境,省去了本地环境配置的繁琐步骤。通过创建数据库和表、执行增删改查操作,初学者可以快速掌握SQL基础语法和数据库管理流程。业务场景模拟能力提升模拟企业员工管理场景,包括员工信息录入、修改、删除及工资统计分析。通过统计功能(如平均工资、部门总工资),能够理解数据库在实际业务决策中的作用。数据管理规范与安全意识设置主键保证员工ID唯一性,使用合适的数据类型存储工资、年龄等信息,培养规范化的数据管理意识。云环境与权限管理让用户体验到数据库安全性的重要性。可拓展性与实践价值表结构设计简洁明了,同时支持后续扩展,如增加考勤管理、绩效评价、入职年份分析等模块。对初学者来说,这是一个从理论到实践的完整案例;对企业开发人员来说,也能借鉴该流程搭建基础管理系统。总之,通过本案例,用户不仅掌握了 SQL操作与数据库管理基础,还能够在实际业务场景中应用所学知识,为进一步开发更复杂的企业管理系统奠定坚实基础。✅ 实践建议:完成本案例后,可以尝试增加更多功能模块,如员工绩效统计、工资趋势图分析,进一步提升数据库应用能力。我正在参加【案例共创】第6期 开发者空间-基于云开发环境和GaussDB构建应用 https://bbs.huaweicloud.com/forum/thread-0229189398343651003-1-1.html
  • [案例共创] 【案例共创】华为云GaussDB企业级电商订单分析系统开发案例
    案例介绍本案例指导开发者如何免费领取并使用GaussDB云数据库完成企业级电商订单分析系统开发。案例内容一、概述1. 案例介绍GaussDB是华为自主创新研发的分布式关系型数据库。该产品支持分布式事务,同城跨AZ部署,数据0丢失,支持1000+的扩展能力,PB级海量存储。同时拥有云上高可用,高可靠,高安全,弹性伸缩,一键部署,快速备份恢复,监控告警等关键能力,能为企业提供功能全面,稳定可靠,扩展性强,性能优越的企业级数据库服务。本案例指导开发者如何免费领取并使用GaussDB云数据库完成企业级电商订单分析系统开发。华为开发者空间是为全球开发者打造的专属开发者空间,致力于为每位开发者提供一台云主机、一套开发工具和云上存储空间,汇聚昇腾、鸿蒙、鲲鹏、GaussDB、欧拉等华为各项根技术的开发工具资源,并提供配套案例指导开发者 从开发编码到应用调测,基于华为根技术生态高效便捷的知识学习、技术体验、应用创新。本案例以某电商企业订单处理系统升级为背景,基于华为云GaussDB构建高并发、高可靠、高安全的订单分析系统。系统需要满足以下核心需求:实时处理能力:支持每秒1000+订单写入,毫秒级查询响应数据持久性:实现跨AZ容灾,RPO=0,RTO<10秒安全合规:满足等保三级要求,支持国密算法加密弹性扩展:支持按需扩缩容,适应大促期间流量波动2. 适用对象个人开发者高校学生3. 案例时间本案例总时长预计60分钟。4. 案例流程说明:GaussDB云数据库领取与配置;GaussDB云数据库的连接使用;释放资源。二、技术架构设计2.1 架构拓扑   2.2 核心组件GaussDB数据库:采用GaussDB云数据库OBS存储:存储原始日志和备份数据DMS服务:实现订单消息的可靠传输实时分析模块:基于GaussDB的HTAP能力实现实时聚合三、开发实施步骤3.1 环境准备1. 创建GaussDB云数据库参考案例:华为开发者空间-GaussDB云数据库领取与使用指导# 通过华为云控制台创建分布式实例 规格选择:gaussdb.opengauss.xe.dn.s6.xlarge.x864.ha 配置参数: - 存储类型:企业级SSD - 安全组:开放3306端口(仅允许应用服务器IP访问) - 高可用模式:同城跨AZ部署 进入开发工具(可以看见已经创建好的实例,没有的话我们新建一个)。 创建实例。 点击立即创建。  开通云数据库GaussDB  第一次开通会弹出DAS产品隐私说明提示,点击同意并继续。    找到我们创建的数据库实例。然后登录。可以选择已有连接登录或自定义登录。 登录后进入首页,可以自由新建我们的用户数据库。    进入后可以查看库管理界面。 2. 配置OBS存储桶# 创建专用存储桶 桶名:ecommerce-logs 权限设置:私有(仅GaussDB实例可访问) 生命周期策略:30天后自动转冷存储 3. 初始化数据库-- 创建订单核心表 CREATE TABLE orders ( order_id BIGINT PRIMARY KEY, user_id BIGINT NOT NULL, order_time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, total_amount DECIMAL(12,2), status VARCHAR(20) CHECK (status IN ('pending','paid','shipped','completed')) ) WITH (orientation = column, compression = medium); -- 创建时间序列索引 CREATE INDEX idx_order_time ON orders USING BRIN (order_time);优化后的GaussDB建表语句及配套SQL:-- 创建订单核心表(企业级优化版) CREATE TABLE orders ( order_id BIGINT PRIMARY KEY, user_id BIGINT NOT NULL, order_time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, total_amount DECIMAL(12,2), status VARCHAR(20) CHECK (status IN ('pending','paid','shipped','completed')), -- 审计字段 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) PARTITION BY RANGE (order_time) INTERVAL ('1 MONTH') ( PARTITION p202508 VALUES LESS THAN ('2025-09-01'), PARTITION p202509 VALUES LESS THAN ('2025-10-01') ) WITH ( orientation = row, -- 行存储更适合OLTP场景 encryption = 'sm4', -- 国密算法加密 storage_policy = 'HOT' -- 冷热数据分离 ); -- 创建复合索引 CREATE INDEX idx_orders_user_status ON orders(user_id, status); CREATE INDEX idx_orders_time ON orders(order_time); -- 配置审计策略 CREATE AUDIT POLICY order_audit FOR SELECT, INSERT, UPDATE, DELETE ON orders WHERE total_amount > 10000; -- 审计大额交易 -- 配置自动备份策略 ALTER TABLE orders SET ( autovacuum_enabled = true, timescaledb.compress, timescaledb.compress_orderby = 'order_time', timescaledb.compress_segmentby = 'user_id' ); 扩展后的多表创建及批量插入数据的SQL示例:---------------开始执行--------------- -- 创建用户表 CREATE TABLE users ( user_id BIGINT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, phone VARCHAR(20), register_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, vip_level INT DEFAULT 0, status VARCHAR(10) DEFAULT 'active' CHECK (status IN ('active', 'inactive', 'banned')) ); -- 创建商品分类表 CREATE TABLE categories ( category_id INT PRIMARY KEY, category_name VARCHAR(100) NOT NULL, parent_id INT DEFAULT 0, level INT DEFAULT 1 ); -- 创建商品表 CREATE TABLE products ( product_id BIGINT PRIMARY KEY, product_name VARCHAR(200) NOT NULL, category_id INT NOT NULL, price DECIMAL(12,2) NOT NULL, stock_quantity INT DEFAULT 0, status VARCHAR(10) DEFAULT 'active' CHECK (status IN ('active', 'inactive', 'deleted')), CONSTRAINT fk_category FOREIGN KEY(category_id) REFERENCES categories(category_id) ); -- 创建订单核心表 CREATE TABLE orders ( order_id BIGINT PRIMARY KEY, user_id BIGINT NOT NULL, order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, total_amount DECIMAL(12,2), status VARCHAR(20) CHECK (status IN ('pending','paid','shipped','completed','cancelled')), payment_time TIMESTAMP, shipping_address TEXT, CONSTRAINT fk_user FOREIGN KEY(user_id) REFERENCES users(user_id) ); -- 创建订单明细表 CREATE TABLE order_items ( order_item_id BIGINT PRIMARY KEY, order_id BIGINT NOT NULL, product_id BIGINT NOT NULL, quantity INT NOT NULL CHECK (quantity > 0), price DECIMAL(12,2) NOT NULL, subtotal DECIMAL(12,2), CONSTRAINT fk_order FOREIGN KEY(order_id) REFERENCES orders(order_id), CONSTRAINT fk_product FOREIGN KEY(product_id) REFERENCES products(product_id) ); -- 创建支付表 CREATE TABLE payments ( payment_id BIGINT PRIMARY KEY, order_id BIGINT NOT NULL, payment_method VARCHAR(20) NOT NULL, payment_amount DECIMAL(12,2) NOT NULL, payment_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, payment_status VARCHAR(20) DEFAULT 'success' CHECK (payment_status IN ('pending', 'success', 'failed', 'refunded')), transaction_id VARCHAR(100), CONSTRAINT fk_order_payment FOREIGN KEY(order_id) REFERENCES orders(order_id) ); -- 创建物流表 CREATE TABLE logistics ( logistics_id BIGINT PRIMARY KEY, order_id BIGINT NOT NULL, shipping_company VARCHAR(50), tracking_number VARCHAR(100), shipping_time TIMESTAMP, delivery_time TIMESTAMP, status VARCHAR(20) DEFAULT 'pending' CHECK (status IN ('pending', 'shipped', 'in_transit', 'delivered', 'failed')), CONSTRAINT fk_order_logistics FOREIGN KEY(order_id) REFERENCES orders(order_id) ); -- 创建用户行为日志表(用于分析) CREATE TABLE user_behavior_logs ( log_id BIGINT PRIMARY KEY, user_id BIGINT NOT NULL, action_type VARCHAR(20) NOT NULL CHECK (action_type IN ('view', 'click', 'add_to_cart', 'purchase', 'search')), product_id BIGINT, action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, ip_address VARCHAR(45), device_info VARCHAR(200), CONSTRAINT fk_user_behavior FOREIGN KEY(user_id) REFERENCES users(user_id), CONSTRAINT fk_product_behavior FOREIGN KEY(product_id) REFERENCES products(product_id) ); -- 创建日销售汇总表 CREATE TABLE daily_sales_summary ( summary_date DATE PRIMARY KEY, total_orders INT NOT NULL DEFAULT 0, total_sales DECIMAL(15,2) NOT NULL DEFAULT 0, total_customers INT NOT NULL DEFAULT 0, avg_order_value DECIMAL(10,2) NOT NULL DEFAULT 0, last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP );数据填充---------------开始插入数据--------------- -- 插入用户数据 INSERT INTO users (user_id, username, email, phone, register_time, vip_level, status) VALUES (1001, '张三', 'zhangsan@example.com', '13800138001', '2024-01-01 10:30:00', 1, 'active'), (1002, '李四', 'lisi@example.com', '13800138002', '2024-01-05 14:22:33', 2, 'active'), (1003, '王五', 'wangwu@example.com', '13800138003', '2024-01-10 09:15:20', 0, 'active'), (1004, '赵六', 'zhaoliu@example.com', '13800138004', '2024-01-15 16:45:10', 1, 'active'), (1005, '钱七', 'qianqi@example.com', '13800138005', '2024-01-20 11:20:05', 3, 'active'), (1006, '孙八', 'sunba@example.com', '13800138006', '2024-01-25 13:40:30', 0, 'inactive'), (1007, '周九', 'zhoujiu@example.com', '13800138007', '2024-02-01 08:55:12', 2, 'active'), (1008, '吴十', 'wushi@example.com', '13800138008', '2024-02-05 17:30:45', 1, 'active'), (1009, '郑十一', 'zhengshiyi@example.com', '13800138009', '2024-02-10 10:10:10', 0, 'active'), (1010, '王十二', 'wangshier@example.com', '13800138010', '2024-02-15 15:25:35', 2, 'banned'); -- 插入商品分类数据 INSERT INTO categories (category_id, category_name, parent_id, level) VALUES (1, '电子产品', 0, 1), (2, '手机', 1, 2), (3, '电脑', 1, 2), (4, '平板', 1, 2), (5, '服装', 0, 1), (6, '男装', 5, 2), (7, '女装', 5, 2), (8, '鞋帽', 5, 2), (9, '家居', 0, 1), (10, '家具', 9, 2), (11, '厨具', 9, 2), (12, '家纺', 9, 2); -- 插入商品数据 INSERT INTO products (product_id, product_name, category_id, price, stock_quantity, status) VALUES (2001, '华为Mate60 Pro', 2, 6999.00, 50, 'active'), (2002, 'iPhone 15 Pro', 2, 7999.00, 30, 'active'), (2003, '小米14', 2, 3999.00, 80, 'active'), (2004, 'MacBook Pro 16寸', 3, 18999.00, 20, 'active'), (2005, '联想拯救者Y9000P', 3, 9999.00, 40, 'active'), (2006, 'iPad Pro 12.9寸', 4, 9299.00, 25, 'active'), (2007, '男士纯棉T恤', 6, 99.00, 200, 'active'), (2008, '女士连衣裙', 7, 199.00, 150, 'active'), (2009, '运动鞋', 8, 299.00, 100, 'active'), (2010, '沙发', 10, 2999.00, 15, 'active'), (2011, '不粘锅套装', 11, 399.00, 60, 'active'), (2012, '四件套', 12, 499.00, 70, 'active'), (2013, '华为Watch GT4', 2, 1488.00, 45, 'active'), (2014, 'AirPods Pro', 2, 1899.00, 35, 'active'), (2015, '男士牛仔裤', 6, 159.00, 120, 'active'); -- 插入订单数据 INSERT INTO orders (order_id, user_id, order_time, total_amount, status, payment_time, shipping_address) VALUES (3001, 1001, '2024-01-15 10:30:45', 6999.00, 'completed', '2024-01-15 10:35:20', '北京市海淀区中关村大街1号'), (3002, 1002, '2024-01-16 14:22:33', 18999.00, 'shipped', '2024-01-16 14:25:10', '上海市浦东新区张江高科园区88号'), (3003, 1001, '2024-01-17 09:15:20', 398.00, 'paid', '2024-01-17 09:18:05', '北京市海淀区中关村大街1号'), (3004, 1003, '2024-01-18 16:45:10', 299.00, 'shipped', '2024-01-18 16:48:30', '广州市天河区体育西路123号'), (3005, 1004, '2024-01-19 11:20:05', 12997.00, 'completed', '2024-01-19 11:23:15', '深圳市南山区科技园南路456号'), (3006, 1005, '2024-01-20 13:40:30', 499.00, 'pending', NULL, '杭州市西湖区文三路789号'), (3007, 1006, '2024-01-21 08:55:12', 199.00, 'cancelled', NULL, '南京市鼓楼区中山路321号'), (3008, 1007, '2024-01-22 17:30:45', 9299.00, 'completed', '2024-01-22 17:33:20', '成都市武侯区天府大道555号'), (3009, 1008, '2024-01-23 10:10:10', 259.00, 'shipped', '2024-01-23 10:12:40', '武汉市江汉区建设大道222号'), (3010, 1009, '2024-01-24 15:25:35', 1488.00, 'paid', '2024-01-24 15:28:10', '西安市雁塔区科技路777号'), (3011, 1010, '2024-01-25 09:30:15', 7999.00, 'completed', '2024-01-25 09:33:05', '重庆市渝北区金开大道888号'), (3012, 1001, '2024-01-26 14:20:25', 1899.00, 'shipped', '2024-01-26 14:23:40', '北京市海淀区中关村大街1号'), (3013, 1002, '2024-01-27 11:15:30', 399.00, 'completed', '2024-01-27 11:18:20', '上海市浦东新区张江高科园区88号'), (3014, 1003, '2024-01-28 16:40:50', 2999.00, 'paid', '2024-01-28 16:43:35', '广州市天河区体育西路123号'), (3015, 1004, '2024-01-29 10:05:40', 9999.00, 'completed', '2024-01-29 10:08:15', '深圳市南山区科技园南路456号'); -- 插入订单明细数据 INSERT INTO order_items (order_item_id, order_id, product_id, quantity, price, subtotal) VALUES (4001, 3001, 2001, 1, 6999.00, 6999.00), (4002, 3002, 2004, 1, 18999.00, 18999.00), (4003, 3003, 2007, 2, 99.00, 198.00), (4004, 3003, 2015, 1, 159.00, 159.00), (4005, 3004, 2009, 1, 299.00, 299.00), (4006, 3005, 2001, 1, 6999.00, 6999.00), (4007, 3005, 2002, 1, 7999.00, 7999.00), (4008, 3006, 2012, 1, 499.00, 499.00), (4009, 3007, 2008, 1, 199.00, 199.00), (4010, 3008, 2006, 1, 9299.00, 9299.00), (4011, 3009, 2007, 1, 99.00, 99.00), (4012, 3009, 2015, 1, 159.00, 159.00), (4013, 3010, 2013, 1, 1488.00, 1488.00), (4014, 3011, 2002, 1, 7999.00, 7999.00), (4015, 3012, 2014, 1, 1899.00, 1899.00), (4016, 3013, 2011, 1, 399.00, 399.00), (4017, 3014, 2010, 1, 2999.00, 2999.00), (4018, 3015, 2005, 1, 9999.00, 9999.00); -- 插入支付数据 INSERT INTO payments (payment_id, order_id, payment_method, payment_amount, payment_time, payment_status, transaction_id) VALUES (5001, 3001, 'alipay', 6999.00, '2024-01-15 10:35:20', 'success', 'ALI202401151035201234'), (5002, 3002, 'wechat', 18999.00, '2024-01-16 14:25:10', 'success', 'WX202401161425101234'), (5003, 3003, 'credit_card', 357.00, '2024-01-17 09:18:05', 'success', 'CC202401170918051234'), (5004, 3004, 'alipay', 299.00, '2024-01-18 16:48:30', 'success', 'ALI202401181648301234'), (5005, 3005, 'wechat', 12997.00, '2024-01-19 11:23:15', 'success', 'WX202401191123151234'), (5006, 3008, 'credit_card', 9299.00, '2024-01-22 17:33:20', 'success', 'CC202401221733201234'), (5007, 3009, 'alipay', 258.00, '2024-01-23 10:12:40', 'success', 'ALI202401231012401234'), (5008, 3010, 'wechat', 1488.00, '2024-01-24 15:28:10', 'success', 'WX202401241528101234'), (5009, 3011, 'credit_card', 7999.00, '2024-01-25 09:33:05', 'success', 'CC202401250933051234'), (5010, 3012, 'alipay', 1899.00, '2024-01-26 14:23:40', 'success', 'ALI202401261423401234'), (5011, 3013, 'wechat', 399.00, '2024-01-27 11:18:20', 'success', 'WX202401271118201234'), (5012, 3014, 'credit_card', 2999.00, '2024-01-28 16:43:35', 'success', 'CC202401281643351234'), (5013, 3015, 'alipay', 9999.00, '2024-01-29 10:08:15', 'success', 'ALI202401291008151234'); -- 插入物流数据 INSERT INTO logistics (logistics_id, order_id, shipping_company, tracking_number, shipping_time, delivery_time, status) VALUES (6001, 3001, '顺丰速运', 'SF1234567890', '2024-01-15 14:30:00', '2024-01-16 10:15:00', 'delivered'), (6002, 3002, '京东物流', 'JD9876543210', '2024-01-16 16:00:00', '2024-01-17 14:20:00', 'delivered'), (6003, 3003, '中通快递', 'ZT1234567890', '2024-01-17 11:30:00', '2024-01-19 16:45:00', 'delivered'), (6004, 3004, '圆通速递', 'YT1234567890', '2024-01-18 18:00:00', '2024-01-20 11:30:00', 'delivered'), (6005, 3005, '顺丰速运', 'SF2345678901', '2024-01-19 13:00:00', '2024-01-20 15:40:00', 'delivered'), (6006, 3008, '京东物流', 'JD8765432109', '2024-01-22 19:30:00', '2024-01-23 16:20:00', 'delivered'), (6007, 3009, '中通快递', 'ZT2345678901', '2024-01-23 12:00:00', '2024-01-25 14:15:00', 'delivered'), (6008, 3012, '圆通速递', 'YT2345678901', '2024-01-26 16:00:00', NULL, 'in_transit'), (6009, 3014, '顺丰速运', 'SF3456789012', '2024-01-28 18:30:00', NULL, 'shipped'), (6010, 3015, '京东物流', 'JD7654321098', '2024-01-29 12:00:00', NULL, 'shipped'); -- 插入用户行为日志数据 INSERT INTO user_behavior_logs (log_id, user_id, action_type, product_id, action_time, ip_address, device_info) VALUES (7001, 1001, 'view', 2001, '2024-01-14 15:30:00', '192.168.1.101', 'iPhone14,1 iOS16.2'), (7002, 1001, 'view', 2002, '2024-01-14 16:15:00', '192.168.1.101', 'iPhone14,1 iOS16.2'), (7003, 1001, 'add_to_cart', 2001, '2024-01-14 16:30:00', '192.168.1.101', 'iPhone14,1 iOS16.2'), (7004, 1001, 'purchase', 2001, '2024-01-15 10:30:45', '192.168.1.101', 'iPhone14,1 iOS16.2'), (7005, 1002, 'view', 2004, '2024-01-15 13:20:00', '192.168.1.102', 'MacBookPro18,3 macOS13.1'), (7006, 1002, 'add_to_cart', 2004, '2024-01-15 13:45:00', '192.168.1.102', 'MacBookPro18,3 macOS13.1'), (7007, 1002, 'purchase', 2004, '2024-01-16 14:22:33', '192.168.1.102', 'MacBookPro18,3 macOS13.1'), (7008, 1001, 'view', 2007, '2024-01-16 20:15:00', '192.168.1.101', 'iPhone14,1 iOS16.2'), (7009, 1001, 'view', 2015, '2024-01-16 20:30:00', '192.168.1.101', 'iPhone14,1 iOS16.2'), (7010, 1001, 'add_to_cart', 2007, '2024-01-16 20:45:00', '192.168.1.101', 'iPhone14,1 iOS16.2'), (7011, 1001, 'add_to_cart', 2015, '2024-01-16 20:50:00', '192.168.1.101', 'iPhone14,1 iOS16.2'), (7012, 1001, 'purchase', NULL, '2024-01-17 09:15:20', '192.168.1.101', 'iPhone14,1 iOS16.2'), (7013, 1003, 'view', 2009, '2024-01-17 15:30:00', '192.168.1.103', 'Mi11 Android13'), (7014, 1003, 'add_to_cart', 2009, '2024-01-17 15:45:00', '192.168.1.103', 'Mi11 Android13'), (7015, 1003, 'purchase', 2009, '2024-01-18 16:45:10', '192.168.1.103', 'Mi11 Android13'), (7016, 1004, 'view', 2001, '2024-01-18 20:00:00', '192.168.1.104', 'iPad13,8 iPadOS16.2'), (7017, 1004, 'view', 2002, '2024-01-18 20:15:00', '192.168.1.104', 'iPad13,8 iPadOS16.2'), (7018, 1004, 'add_to_cart', 2001, '2024-01-18 20:30:00', '192.168.1.104', 'iPad13,8 iPadOS16.2'), (7019, 1004, 'add_to_cart', 2002, '2024-01-18 20:35:00', '192.168.1.104', 'iPad13,8 iPadOS16.2'), (7020, 1004, 'purchase', NULL, '2024-01-19 11:20:05', '192.168.1.104', 'iPad13,8 iPadOS16.2'); -- 插入日销售汇总数据 INSERT INTO daily_sales_summary (summary_date, total_orders, total_sales, total_customers, avg_order_value) VALUES ('2024-01-15', 1, 6999.00, 1, 6999.00), ('2024-01-16', 1, 18999.00, 1, 18999.00), ('2024-01-17', 1, 357.00, 1, 357.00), ('2024-01-18', 1, 299.00, 1, 299.00), ('2024-01-19', 1, 12997.00, 1, 12997.00), ('2024-01-20', 0, 0.00, 0, 0.00), ('2024-01-21', 0, 0.00, 0, 0.00), ('2024-01-22', 1, 9299.00, 1, 9299.00), ('2024-01-23', 1, 258.00, 1, 258.00), ('2024-01-24', 1, 1488.00, 1, 1488.00), ('2024-01-25', 1, 7999.00, 1, 7999.00), ('2024-01-26', 1, 1899.00, 1, 1899.00), ('2024-01-27', 1, 399.00, 1, 399.00), ('2024-01-28', 1, 2999.00, 1, 2999.00), ('2024-01-29', 1, 9999.00, 1, 9999.00); ---------------数据插入完成--------------- 数据特点说明用户数据:包含10个用户,具有不同的注册时间、VIP等级和状态商品分类:包含3个大类(电子产品、服装、家居)和9个子类商品数据:包含15个商品,涵盖不同品类和价格区间订单数据:包含15个订单,展示不同状态(已完成、已发货、已支付、待支付、已取消)订单明细:展示了一个订单包含多个商品的情况支付数据:包含不同支付方式和支付状态物流数据:包含不同物流公司和配送状态用户行为日志:记录了用户的浏览、加购和购买行为,可用于分析用户行为路径日销售汇总:展示了每日销售情况的统计数据这些示例数据涵盖了电商系统的主要业务场景,可以用于测试系统功能、性能优化和数据分析。数据设计考虑了真实业务场景中的各种情况,包括:用户购买多种商品同一用户多次购买不同支付方式和物流状态用户从浏览到购买的完整行为路径不同价格区间的商品销售情况您可以根据需要调整数据量或添加更多维度的数据来满足特定的测试或演示需求。运行结果如图:    3.2 应用开发参考案例:本地VSCode基于华为开发者空间云开发环境完成小程序开发参考案例:开发者空间 - 云开发环境使用指导完成本地服务安装启动和在Visual Studio中安装Remote-SSH插件。 在VS中安装插件并启动如图。 成功远程链接。  1. Java连接示例(Spring Boot)@Configuration public class GaussDBConfig { @Bean public DataSource dataSource() { HikariDataSource ds = new HikariDataSource(); ds.setJdbcUrl("jdbc:postgresql://gaussdb-host:3306/ecommerce"); ds.setUsername("admin"); ds.setPassword("SecurePass123!"); ds.setMaximumPoolSize(20); return ds; } } @Service public class OrderService { @Autowired private JdbcTemplate jdbcTemplate; public void createOrder(Order order) { jdbcTemplate.update( "INSERT INTO orders (order_id, user_id, total_amount) VALUES (?, ?, ?)", order.getId(), order.getUserId(), order.getTotalAmount() ); } } 2. 实时分析模块(Python)from gaussdb import connect import pandas as pd # 连接GaussDB conn = connect( host='gaussdb-host', port=3306, user='analyst', password='AnalyticsPass!', database='ecommerce' ) # 实时销售额统计 def get_realtime_sales(): query = """ SELECT TO_CHAR(order_time, 'YYYY-MM-DD HH24') AS hour, SUM(total_amount) AS total_sales FROM orders WHERE order_time > NOW() - INTERVAL '1 hour' GROUP BY hour ORDER BY hour """ return pd.read_sql(query, conn) 四、性能优化实践4.1 慢查询优化原始查询:SELECT * FROM orders WHERE user_id = 12345; 优化方案:创建复合索引CREATE INDEX idx_user_status ON orders (user_id, status); 启用分区表CREATE TABLE orders_partitioned ( LIKE orders INCLUDING ALL ) PARTITION BY RANGE (order_time); 五、总结本案例通过整合GaussDB的分布式架构、HTAP能力、企业级安全特性,构建了满足电商核心业务需求的高性能订单处理系统。实践表明:列式存储+压缩技术可降低存储成本30%以上并行查询优化使复杂分析查询性能提升8倍自动故障转移机制保障业务连续性达到99.99%国密算法加密满足金融级数据安全要求通过华为云GaussDB与OBS、DMS等服务的深度集成,企业可快速构建从数据采集、存储、分析到灾备的完整数据链路,有效支撑业务创新与数字化转型。 “我正在参加【案例共创】第6期 开发者空间-基于云开发环境和GaussDB构建应用  cid:link_4”
  • [案例共创] 【案例共创】基于华为开发者空间云开发环境+GaussDB实现在线考试系统
    案例介绍本案例选择Flask作为后端服务,并借助开发者空间云开发环境提供的免费GaussDB数据库和HCE2.0开发环境进行本地部署,便捷地提供了一种能够保障题库安全的在线考试系统。案例内容一、概述1.1 案例介绍Flask是一个用Python编写的轻量级Web应用框架。它被称为“微框架”,核心功能简单,提供了构建Web应用所需的最少工具。华为开发者空间,是为全球开发者打造的专属开发者空间,致力于为每位开发者提供一台云开发环境、一套开发工具和云上存储空间,汇聚昇腾、鸿蒙、鲲鹏、GaussDB、欧拉等华为各项根技术的开发工具资源,并提供配套案例指导开发者 从开发编码到应用调测,基于华为根技术生态高效便捷的知识学习、技术体验、应用创新。GaussDB是华为自主创新研发的分布式关系型数据库。该产品支持分布式事务,同城跨AZ部署,数据0丢失,支持1000+的扩展能力,PB级海量存储。同时拥有云上高可用,高可靠,高安全,弹性伸缩,一键部署,快速备份恢复,监控告警等关键能力,能为企业提供功能全面,稳定可靠,扩展性强,性能优越的企业级数据库服务.本案例借助开发者空间云开发环境,通过Flask与开发者空间提供的免费GaussDB数据库实例对接,直接使用 SQL 语句对GaussDB 数据库实例进行操作,完成一个现代化 Web 应用构建。1.2 适用对象企业个人开发者高校学生1.3 案例时间本案例总时长预计40分钟。1.4 案例流程   说明:申请华为云开发者空间的GaussDB数据库;进行华为云开发者空间的云开发环境进行文件创建与编辑;启用Flask Web 服务,适配GaussDB,在GaussDB在线操作页面建表于插入题目数据。1.5 资源总览本案例预计花费0.33元。资源名称规格单价(元)时长(分钟)华为开发者空间 - 云开发环境鲲鹏通用计算增强型 kc1 | 2vCPUs | 4G | HCE2.0免费40华为开发者空间 - 生态版GaussDB单副本集中式版 | 4 vCPUs | 16G | HCE OS 64bit (200GB)免费40弹性公网IP按需计费 5Mbit/s0.33元/时40 二、案例准备工作2.1 配置云开发环境根据案例《开发者空间 - 云开发环境使用指导》,请查看下面链接,配置云开发环境,并通过vscode链接工具登录云开发环境。本地VSCode基于华为开发者空间云开发环境完成小程序开发2.1 领取免费版GaussDB免费领取GaussDB在线试用版(2025年06月 21日 - 2025年 12月 31日),有1000个名额,数量有限,链接如下:免费领取GaussDB在线试用版(1-3工作日内报名审核通过后会有短信通知)(1)报名申请审核通过后,进入开发者空间工作台,会有GaussDB免费试用提示,点击立即开通即可。(2)填写GaussDB数据库开通参数:虚拟私有云:如下图到控制台创建,采用默认参数即可。安全组:采用默认安全组。管理员密码:自定义设置,保存好后续使用。(3)设置完后点击开通,开通成功后如下图提示:(4)开通成功后,点击立即前往进入GaussDB数据库实例页面,等待状态切换为"正常",如下图所示: (5)绑定弹性公网EIP,如果需要远程操作数据库必须要绑定公网EIP(EIP需购买,按需计费0.33元/小时,以控制台为准)点击数据库实例名称,进入GaussDB的基本信息界面: 点击绑定弹性公网IP,若开发者没有购买,则需要购买弹性公网IP。购买时选择按需计费,购买成功后截图如下:回到数据库基本信息界面,再次绑定公网IP,绑定成功截图如下:2.2 验证云开发环境与GaussDB互通通过xshell或windows命令终端登录云开发环境,测试GaussDB能否连接,如下是通  2.3 登录GaussDB数据库回到云数据库控制台,登录数据库:点击登录,再点击同意并继续输入密码,点击测试连接,再次点击登录,即可登录成功2.3.1 新建数据库登录成功后,点击新建数据库输入数据库名称 test 点击 确定 按钮,数据库创建成功: 2.3.2 创建数据库表点击 SQL操作,点击SQL查询库名选择test,Schema选择 public ,执行以下SQL语句,创建表:CREATE TABLE t_question (    id SERIAL PRIMARY KEY,    question_text TEXT NOT NULL,    option_a VARCHAR(255) NOT NULL,    option_b VARCHAR(255) NOT NULL,    option_c VARCHAR(255) NOT NULL,    option_d VARCHAR(255) NOT NULL,    correct_answer CHAR(1) NOT NULL);创建表成功:向表中插入测试题目和答案INSERT INTO t_question (question_text, option_a, option_b, option_c, option_d, correct_answer)VALUES    ('华为云的旗舰数据库服务是什么?', 'RDS for MySQL', 'GaussDB', 'DWS', 'TaurusDB', 'B'),    ('在华为云上,用于管理容器化应用的PaaS服务叫什么?', 'CCE', 'ECS', 'OBS', 'ELB', 'A'),    ('华为云上用于对象存储的服务名称是?', 'SFS', 'EVS', 'OBS', 'VPC', 'C');执行SQL,插入成功:查询表中数据:SELECT *FROM t_question删除指定题目:DELETE FROM t_questionWHERE id = 1;再执行查询的SQL语句:SELECT *FROM t_question可以看到已成功删除id为1的数据。 三、 Flask部署与Python驱动安装通过本地IDE连接云开发环境,参考使用VSCode连接云开发环境通过VSCode连接成功后,打开终端 3.1 创建项目虚拟环境因为业务场景的Python开发,多数都是构建一个大型应用程序,并且不希望各种组件的各种版本之间相互冲突,所以需要设置一个虚拟环境。先需要更新下载源。执行如下命令 sudo yum -y updatesudo yum -y upgradepip3 install virtualenv -i https://repo.huaweicloud.com/repository/pypi/simple/         #安装virtualenvpython3 -m venv myenv          #创建虚拟环境source myenv/bin/activate       #激活环境 环境激活后,用户名前会有(myenv)字样,如上图所示。3.2 安装Flask Web 框架。安装之前,需要更新下pip。python3 -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simplepip3 install flask -i https://pypi.tuna.tsinghua.edu.cn/simple3.3 安装GaussDB数据库对应的Python驱动GaussDB数据库对应的Python驱动为psycopg2。即Flask Web 框架允许通过psycopg2驱动,连接GaussDB数据库,并操作数据对象。不建议直接用pip去安装psycopg2驱动。1.从华为云GaussDB数据库官方文档中下载驱动。wget https://dbs-download.obs.cn-north-1.myhuaweicloud.com/GaussDB/1750076538851/GaussDB_driver.zipunzip GaussDB_driver.zipcd GaussDB_driver/Centralized/Hce2.0_arm_64/tar zxvf GaussDB-Kernel_505.2.1_Hce_64bit_Python.tar.gz 解压后有两个文件夹:psycopg2:psycopg2库文件。lib:lib库文件。2.使用root用户将psycopg2复制到python安装目录下的site-packages文件夹下。sudo cp psycopg2 $(python3 -c 'import site; print(site.getsitepackages()[0])') -r3.修改psycopg2目录权限为755。sudo chmod 755 $(python3 -c 'import site; print(site.getsitepackages()[0])')/psycopg2 -R4.将psycopg2目录添加到环境变量$PYTHONPATH,并使之生效。export PYTHONPATH=$(python3 -c 'import site; print(site.getsitepackages()[0])'):$PYTHONPATH5.将解压后的上述lib目录,配置在环境变量LD_LIBRARY_PATH中。本案例对应的lib目录是/home/xxx/GaussDB_driver/Centralized/Hce2.0_arm_64/lib,读者根据自己实际情况做修改export LD_LIBRARY_PATH=/home/xxx/GaussDB_driver/Centralized/Hce2.0_arm_64/lib:$LD_LIBRARY_PATH6.复制驱动到 python 的 site-packagessudo cp -r /home/developer/GaussDB_driver/Centralized/Hce2.0_arm_64/psycopg2 \    /usr/lib/python3.9/site-packages/7.修改权限sudo chmod -R 755 /usr/lib/python3.9/site-packages/psycopg2注意:如果引入psycopg2报找不到libpq.so.5.5,是因为环境变量LD_LIBRARY_PATH没有包含libpq.so.5.5的目录路径,由于上述步骤5用export设置的临时环境变量,所以在新的会话中需要重新设置LD_LIBRARY_PATH指定之前解压的驱动lib目录3.4 通过本地IDE创建Flask Web工程在IDE里终端窗口创建web项目并进入。mkdir ~/testcd ~/test3.5 创建test项目的Web应用(1)在test的项目目录里,创建app.py文件和子目录templates以及templates下的index.html app.py:文件作为考试系统的后端,与GaussDB进行通信,对前端index.html提供数据index.html:用来展示题目与选项 (2)把以下代码复制粘贴到app.py,注意修改为自己的GaussDB的ip、账号、密码、数据库from flask import Flask, render_template, request, jsonifyimport psycopg2import psycopg2.extrasapp = Flask(__name__)# Database connection configurationdb_config = {    'host': 'your_gaussdb_host',    'user': 'your_user',    'password': 'your_password',    'database': 'test',    'port': 8000}def get_db_connection():    """Establish database connection"""    conn = psycopg2.connect(**db_config)    return conn@app.route('/')def index():    """Home route: Display all exam questions"""    conn = get_db_connection()    cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)    cursor.execute('SELECT * FROM t_question')    questions = cursor.fetchall()    cursor.close()    conn.close()    return render_template('index.html', questions=questions)@app.route('/submit_all_answers', methods=['POST'])def submit_all_answers():    """Submit all answers route: Check if user answers are correct"""    answers = {}  # Dictionary to store question IDs and user answers    correct_count = 0    # Loop through all the answers in the form data    for question_index in range(1, len(request.form) // 2 + 1):        question_id = request.form[f"question_id_{question_index}"]        user_answer = request.form.get(f"answer_{question_index}")        conn = get_db_connection()        cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)        cursor.execute('SELECT correct_answer FROM t_question WHERE id = %s', (question_id,))        result = cursor.fetchone()        if result:            correct_answer = result['correct_answer']            if user_answer == correct_answer:                correct_count += 1        cursor.close()        conn.close()    return jsonify({        'message': f'You answered {correct_count} questions correctly!',        'correct_count': correct_count    })if __name__ == '__main__':    app.run(debug=True, host='0.0.0.0', port=8080)(3)把以下代码复制粘贴到index.html中<!DOCTYPE html><html><head>    <title>在线考试系统</title>    <style>        body {            font-family: Arial, sans-serif;            background-color: #f4f7fa;            margin: 0;            padding: 0;        }        .container {            max-width: 900px;            margin: 50px auto;            background-color: #fff;            padding: 20px;            border-radius: 8px;            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);        }        h1 {            text-align: center;            color: #333;        }        .question-container {            border-bottom: 1px solid #ccc;            margin-bottom: 20px;            padding-bottom: 15px;        }        .question-container p {            font-size: 18px;            margin: 10px 0;        }        .question-container label {            display: block;            font-size: 16px;            margin-bottom: 8px;        }        .question-container input[type="radio"] {            margin-right: 10px;        }        .submit-btn {            background-color: #4CAF50;            color: white;            padding: 12px 24px;            border: none;            border-radius: 5px;            cursor: pointer;            font-size: 16px;        }        .submit-btn:hover {            background-color: #45a049;        }    </style></head><body>    <div class="container">        <h1>在线考试</h1>        <form action="/submit_all_answers" method="post">            {% for question in questions %}            <div class="question-container">                <p><strong>{{ loop.index }}. {{ question.question_text }}</strong></p>                <input type="hidden" name="question_id_{{ loop.index }}" value="{{ question.id }}">                <label><input type="radio" name="answer_{{ loop.index }}" value="A"> A. {{ question.option_a }}</label>                <label><input type="radio" name="answer_{{ loop.index }}" value="B"> B. {{ question.option_b }}</label>                <label><input type="radio" name="answer_{{ loop.index }}" value="C"> C. {{ question.option_c }}</label>                <label><input type="radio" name="answer_{{ loop.index }}" value="D"> D. {{ question.option_d }}</label>            </div>            {% endfor %}            <div style="text-align: center;">                <input type="submit" value="提交所有答案" class="submit-btn">            </div>        </form>    </div></body></html>(4)然后在终端中运行python3 app.py  在浏览器中打开http://127.0.0.1:8080即可看到在线考试页面  四、释放资源1. 删除虚拟私有云VPC进入虚拟私有云控制台,点击全选按钮,点击“删除”,会弹出关联资源列表的对话框,删除子网和弹性公网IP2. 删除弹性公网IP EIP进入弹性公网IP控制台,首先解绑弹性公网IP,然后删除。3. 删除GaussDB数据库实例进入GaussDB控制台,点击“更多 -> 删除实例”。注意:删除的实例会被移至回收站,但达到回收站策略设置的天数后,该实例会被永久删除,请谨慎操作。 至此,基于华为开发者空间云开发环境+GaussDB实现在线考试系统案例已全部完成。我正在参加【案例共创】第6期 开发者空间-基于云开发环境和GaussDB构建应用  cid:link_3
  • [技术干货] 【知识点集合】GaussDB基本数据类型汇总
    GaussDB(华为高斯数据库)支持多种基本数据类型,以下是其主要数据类型的分类和列举:数值类型整数类型SMALLINT:2字节有符号整数(-32,768 到 32,767)INTEGER/INT:4字节有符号整数(-2,147,483,648 到 2,147,483,647)BIGINT:8字节有符号整数(-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807)精确数值类型NUMERIC/DECIMAL:用户指定精度的精确数值,可变长度NUMBER(p,s):高精度数值类型,p为精度,s为小数位数浮点类型REAL:4字节单精度浮点数DOUBLE PRECISION/FLOAT8:8字节双精度浮点数字符类型CHARACTER/CHAR(n):固定长度字符串,n为字符数CHARACTER VARYING/VARCHAR(n):可变长度字符串,最大长度nTEXT:可变长度无限制字符串CLOB:字符大对象,用于存储大量文本数据二进制数据类型BINARY/BYTEA:二进制字符串(“字节数组”)BLOB:二进制大对象,用于存储大量二进制数据日期时间类型DATE:日期(年-月-日)TIME/TIME WITHOUT TIME ZONE:时间(时:分:秒)TIME WITH TIME ZONE:带时区的时间TIMESTAMP/TIMESTAMP WITHOUT TIME ZONE:日期和时间TIMESTAMP WITH TIME ZONE:带时区的日期和时间INTERVAL:时间间隔布尔类型BOOLEAN:TRUE/FALSE值枚举类型ENUM:用户定义的枚举类型,从预定义值集合中取值JSON类型JSON:存储JSON格式数据JSONB:二进制存储的JSON数据,支持索引数组类型GaussDB支持创建数组类型,如INTEGER[]、TEXT[]等特殊类型UUID:通用唯一标识符XML:存储XML数据GEOMETRY:空间数据类型(如果支持空间扩展)伪类型用于函数声明而不表示实际存储的数据类型,如:ANYANYELEMENTTRIGGER等GaussDB作为基于PostgreSQL开发的数据库,其数据类型系统与PostgreSQL高度兼容,同时针对企业级应用进行了优化和扩展。具体版本的数据类型支持可能略有差异,建议参考对应版本的官方文档获取最准确的信息。
  • [案例共创] 【案例共创】 基于华为开发者空间云开发环境和GaussDB数据库—爬取小说存入GaussDB数据库实战
    基于华为开发者空间云开发环境和GaussDB数据库—爬取小说存入GaussDB数据库实战案例介绍本案例演示如何在华为开发者空间的远程云开发环境中,使用 Python 爬取网络小说数据,并将数据存入 GaussDB 云数据库。通过该实践,开发者能够掌握以下技能:配置并使用云开发环境进行 Python 项目开发;使用爬虫技术抓取网页小说内容;数据清洗与结构化处理;连接并操作 GaussDB 数据库,实现小说数据存储;实现基础的数据查询和管理功能。通过此案例,开发者可快速搭建一个完整的数据采集与存储流程,并体验云端开发与数据库结合的高效开发模式。案例内容本案例内容包括:在华为开发者空间创建云开发环境并配置 Python 运行环境;安装爬虫所需的第三方库,如 requests、BeautifulSoup 等;申请并连接 GaussDB 数据库实例;编写爬虫脚本抓取小说章节及内容;将抓取的小说数据存入 GaussDB 数据库;在数据库中验证数据存储和查询结果。最终效果:成功抓取指定网站小说内容;数据结构化存储在 GaussDB 数据库中;可通过 SQL 查询小说、摘要信息。一、概述在互联网内容获取和数据分析中,爬虫技术 是获取结构化数据的主要手段之一。而现代云开发环境与数据库服务,为爬虫项目提供了高效、稳定、安全的执行平台。本案例通过 Flask 无关的纯爬虫 + 数据库操作方式,展示如何在云端环境完成小说数据的抓取与存储。使用 GaussDB 数据库,开发者无需担心本地数据库配置、权限问题或数据备份,同时结合云开发环境,支持团队协作和远程操作。1.1 案例介绍本案例将演示以下操作流程:使用 Python 爬取指定小说网站的章节标题与内容;对抓取内容进行清洗,剔除无用标签和广告文本;将小说数据以结构化形式存入 GaussDB 数据库,包括章节号、标题、正文和更新时间;使用 SQL 验证数据完整性和正确性。通过实践,开发者可以快速搭建一个简单的 云端小说数据库管理系统,为后续的阅读分析、内容推荐或搜索功能提供基础数据。1.2 适用对象个人开发者,尝试云端爬虫与数据库存储项目;高校学生,学习 Python 爬虫、数据清洗及数据库操作实践;中小团队,验证云开发环境在数据采集和存储方面的应用效率。1.3 案例时间预计总时长:约 50 分钟云开发环境配置:10 分钟GaussDB 数据库准备:10 分钟Python 爬虫编写与调试:20 分钟数据存入 GaussDB 与验证:10 分钟1.4 案例流程1.5 资源总览资源名称规格费用使用时长云开发环境鲲鹏通用计算增强型 kc1免费50分钟GaussDB 数据库4 vCPUs / 16G免费50分钟公网 EIP5Mbit/s0.8元/GB按流量计费Python库requests, bs4, psycopg2免费-二、案例准备工作2.1 配置云开发环境1.登录华为开发者空间;2.选择创建远程云开发环境;3.创建开发环境创建远程开发环境时需要填写以下信息:环境名称(必填):支持字母、数字和下划线,长度不超过 15 个字符,且不能以数字开头。开放端口(可选):默认为 22 端口,可额外开放 8080-8089 范围内的端口。默认账号(必填):默认为 developer,可自定义,需为 4~16 位小写字母,禁止使用系统保留用户名(如 root、agent)。密码(必填):需为 8~32 位字符,且至少包含 大写字母、小写字母、数字、特殊字符(~!@#$%^*-_=+?) 中的三种类型。4.将服务开机5.安装 CLI 工具包hdspace.exe 是一款面向开发者的命令行工具(CLI),用于在 PC 端对 开发者空间云开发环境 进行创建与管理。借助该工具,开发者不仅可以快速建立与云开发环境的隧道连接,还能实现远程操作,例如:上传/下载文件编写与编辑代码编译与执行程序下载方式在 Web 端进入已创建的云开发环境,点击 【远程连接】 → 【立即下载】,即可将 hdspace.exe 工具包下载到本地。6.配置环境变量以 Windows 11 为例,配置步骤如下:在任务栏搜索框输入 “环境变量”,或在 控制面板 → 系统和安全 → 系统 → 高级系统设置 中找到 环境变量 入口。在弹出的窗口中,找到 系统变量 下的 Path,点击 编辑。在 Path 配置界面中,点击 新建,输入 hdspace.exe 所在目录的路径。确认保存设置并退出。完成上述操作后,用户即可在 任意命令行窗口(如 CMD、PowerShell)中直接使用 hdspace.exe 命令。安装成功截图如下常用命令如下含义命令云开发环境顶层帮助hdspace devenv --help开发者空间配置帮助hdspace config --help开发者空间版本帮助hdspace version --help云开发环境列表帮助hdspace devenv list --help创建云开发环境帮助hdspace devenv create --help启动云开发环境帮助hdspace devenv start –help关闭云开发环境帮助hdspace devenv close --help删除云开发环境帮助hdspace devenv delete --help建立隧道帮助hdspace devenv start-tunnel --help7.获取并配置 AK/SK在使用 CLI 工具操作云开发环境前,需要完成 身份认证。这依赖于 AK(Access Key) 与 SK(Secret Key):AK(Access Key):访问密钥的唯一 ID,用于标识用户身份,通常可在网络传输中公开。SK(Secret Key):秘密密钥,仅用户与服务端持有,用于生成请求签名,确保请求合法性并防止未授权访问。配置 AK/SK 等价于在 CLI 工具中完成身份认证,从而使开发者能够通过命令行安全地管理和操作云开发环境。8.获取 AK/SK在下载的文件中可找到 AK/SK,格式类似如下:配置 AK/SK在命令行中执行以下命令:hdspace config根据提示依次输入 AK 和 SK:输入 AK 后回车输入 SK(注意:SK 输入时不会显示回显),并再次输入确认配置完成后,CLI 工具即可正常使用身份认证信息访问云开发环境。9.查看可用云开发环境信息2.2 领取GaussDB数据库目前可以免费领取GaussDB在线试用版(2025年 06月 21日 - 2025年 12月 31日)。当报名申请审核通过后,进入 开发者空间工作台。此时页面会1.显示 GaussDB 免费试用 提示,点击 立即开通 即可完成开通操作。若需远程访问数据库实例,必须为其绑定弹性公网 EIP(EIP 需单独购买,按需计费,价格约为 0.33 元/小时)。在控制台中,点击目标数据库实例名称,即可进入 GaussDB 基本信息 页面:2.登录GaussDB数据库回到云数据库控制台,登录数据库:填写密码后测试成功:3.成功登录页面如下4.点击绑定弹性公网IP,就可远程使用。三、爬取小说存入GaussDB数据库实战GaussDB是华为自主创新研发的分布式关系型数据库。该产品支持分布式事务,同城跨AZ部署,数据0丢失,支持1000+的扩展能力,PB级海量存储。同时拥有云上高可用,高可靠,高安全,弹性伸缩,一键部署,快速备份恢复,监控告警等关键能力,能为企业提供功能全面,稳定可靠,扩展性强,性能优越的企业级数据库服务。1.创建GaussD数据库-- 确保使用 public schema SET search_path TO public; -- 创建小说表 CREATE TABLE IF NOT EXISTS public.novel ( id VARCHAR(36) PRIMARY KEY, -- UUID 主键,由应用端生成 title VARCHAR(100) NOT NULL, -- 小说标题 content TEXT NOT NULL -- 小说正文 ); 2.python链接GaussD数据库# GaussDB 连接信息,请根据你的实际信息修改 GAUSSDB_CONFIG = { "host": "your_gaussdb_host", "port": 5432, "database": "your_db", "user": "your_user", "password": "your_password" } 3.核心代码def main(): try: # 连接数据库 conn = psycopg2.connect(**GAUSSDB_CONFIG) cursor = conn.cursor() print("成功连接 GaussDB!") # 创建小说表 cursor.execute(""" CREATE TABLE IF NOT EXISTS public.novel ( id VARCHAR(36) PRIMARY KEY, title VARCHAR(100) NOT NULL, content TEXT NOT NULL ); """) print("小说表创建成功(如果不存在)") # 插入数据 insert_query = "INSERT INTO public.novel (id, title, content) VALUES (%s, %s, %s) ON CONFLICT (id) DO NOTHING;" cursor.executemany(insert_query, novel_data) conn.commit() print("小说数据已成功存入数据库!") except Exception as e: print("操作失败:", e) finally: if cursor: cursor.close() if conn: conn.close() print("数据库连接已关闭。") if __name__ == "__main__": main() 4.爬虫主要代码# 给请求指定一个请求头来模拟chrome浏览器 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'} server = 'XXXX' # 地址 book = 'XXX' # 定义DB mysql = MyPymysqlPool("dbMysql") # 获取章节内容 def get_contents(chapter): req = requests.get(url=chapter) html = req.content html_doc = str(html, 'gbk') bf = BeautifulSoup(html_doc, 'html.parser') texts = bf.find_all('div', id="content") # 获取div标签id属性content的内容 \xa0 是不间断空白符 &nbsp; content = texts[0].text.replace('\xa0' * 4, '\n') return content # 主方法 def main(): res = requests.get(book, headers=headers) html = res.content html_doc = str(html, 'gbk') # 使用自带的html.parser解析 soup = BeautifulSoup(html_doc, 'html.parser') # 获取所有的章节 a = soup.find('div', id='list').find_all('a') print('总章节数: %d ' % len(a)) for each in a: try: chapter = server + each.get('href') content = get_contents(chapter) chapter = each.string write_db(chapter, content) except Exception as e: print(e) mysql.dispose() if __name__ == '__main__': main() 5.GaussDB数据库情况。通过本次实战,我们完成了从模拟爬取小说数据到存入 GaussDB 数据库的完整流程。实践过程中,我们掌握了以下要点:GaussDB 的优势与使用支持分布式事务、PB级存储和高可用部署,保证数据安全与扩展能力。使用 public schema 创建表,合理设计主键(UUID)和字段类型,确保数据唯一性与完整性。Python 连接数据库与操作使用 psycopg2 连接 GaussDB,并通过事务控制确保数据一致性。利用 ON CONFLICT DO NOTHING 避免重复插入报错,提高脚本健壮性。爬虫模拟与数据处理模拟爬取章节内容并清洗 HTML 标签,实现章节正文的规范化存储。将每条小说数据生成 UUID 并插入数据库,实现与表结构一致的数据管理。实战心得通过模拟爬虫与数据库存储的结合,理解了爬取、清洗、存储数据的完整流程。对企业级数据库的设计与操作有了直观的认识,为后续大规模数据管理与分析奠定基础。总之,本次实战不仅验证了 GaussDB 的稳定性与高效性,也为小说数据爬取、清洗和存储提供了完整的流程示例,可作为类似场景的参考模板。我正在参加【案例共创】第6期 开发者空间-基于云开发环境和GaussDB构建应用 https://bbs.huaweicloud.com/forum/thread-0229189398343651003-1-1.html
  • [案例共创] 【案例共创】基于远程开发环境部署Flask与开发者空间GaussDB的实践应用构建在线TODO清单(保姆级指南实战案例)
    基于远程开发环境部署Flask与开发者空间GaussDB的实践应用构建在线TODO清单(保姆级指南实战案例)案例介绍本案例将演示如何在华为开发者空间的远程云开发环境中部署 Flask 应用,并与 GaussDB 数据库 对接,实现一个基础的 TODO 清单 Web 应用。通过该实践,开发者能够掌握以下技能:在云开发环境中快速搭建 Flask 项目;配置并连接 GaussDB 数据库;使用 Flask ORM 完成数据库建表与数据操作;实现一个可运行的 TODO 清单应用。这种结合方式能够帮助开发者快速上手 Web 开发,并体验华为开发者空间提供的一站式开发环境。案例内容本案例将演示如何在华为开发者空间的远程云开发环境中部署 Flask 应用,并与 GaussDB 数据库 对接,实现一个基础的 TODO 清单 Web 应用。通过该实践,开发者能够掌握以下技能:在云开发环境中快速搭建 Flask 项目;配置并连接 GaussDB 数据库;使用 Flask ORM 完成数据库建表与数据操作;实现一个可运行的 TODO 清单应用。这种结合方式能够帮助开发者快速上手 Web 开发,并体验华为开发者空间提供的一站式开发环境。一、概述在现代 Web 应用开发中,快速迭代与云端部署 已成为常态。传统的本地开发环境虽然灵活,但在协作效率、资源配置以及数据库运维方面往往存在一定的局限。为了解决这些问题,越来越多的开发者开始借助 远程开发环境 与 云数据库服务 来完成应用构建。Flask 作为一个轻量化的 Python Web 框架,因其简单、灵活、可扩展的特性,广泛应用于原型验证和小型应用开发。而华为开发者空间所提供的 GaussDB 云数据库 与 云开发环境,为开发者提供了一体化的开发体验:无需繁琐配置,即可在云端完成代码编写、数据库对接和应用部署。本案例将通过构建一个 TODO 清单应用,演示如何在远程云开发环境中部署 Flask,并与 GaussDB 结合,实现一个完整的从环境搭建到应用落地的流程。通过该实践,开发者不仅能够熟悉 Flask 与数据库交互的核心方法,还能深入体验基于华为云生态的高效开发模式。1.1 案例介绍Flask 是一个轻量级 Python Web 框架,以简洁、灵活著称,非常适合快速构建小型应用或原型系统。本案例结合 Flask 与 GaussDB,通过远程开发环境完成从环境搭建到应用部署的全流程操作。最终效果:在浏览器访问 Flask 服务;可在页面中创建和查看 TODO 任务;数据持久化存储在 GaussDB 数据库中。1.2 适用对象中小企业希望快速验证产品原型;个人开发者尝试云端开发与数据库应用;高校学生学习 Flask 与数据库交互实践。1.3 案例时间预计总时长:约 40 分钟。1.4 案例流程1.在华为开发者空间申请云开发环境;2.配置 Flask 运行环境并安装依赖包;3.申请并绑定 GaussDB 数据库实例;4.在 Flask 中配置数据库连接;5。启动 Flask Web 服务并完成 TODO 清单应用测试。1.5 资源总览资源名称规格费用使用时长云开发环境鲲鹏通用计算增强型 kc1免费40分钟GaussDB 数据库4 vCPUs / 16G免费40分钟公网 EIP5Mbit/s0.8元/GB按流量计费二、案例准备工作2.1 配置云开发环境1.登录华为开发者空间;2.选择创建远程云开发环境;3.创建开发环境创建远程开发环境时需要填写以下信息:环境名称(必填):支持字母、数字和下划线,长度不超过 15 个字符,且不能以数字开头。开放端口(可选):默认为 22 端口,可额外开放 8080-8089 范围内的端口。默认账号(必填):默认为 developer,可自定义,需为 4~16 位小写字母,禁止使用系统保留用户名(如 root、agent)。密码(必填):需为 8~32 位字符,且至少包含 大写字母、小写字母、数字、特殊字符(~!@#$%^*-_=+?) 中的三种类型。4.将服务开机5.安装 CLI 工具包hdspace.exe 是一款面向开发者的命令行工具(CLI),用于在 PC 端对 开发者空间云开发环境 进行创建与管理。借助该工具,开发者不仅可以快速建立与云开发环境的隧道连接,还能实现远程操作,例如:上传/下载文件编写与编辑代码编译与执行程序下载方式在 Web 端进入已创建的云开发环境,点击 【远程连接】 → 【立即下载】,即可将 hdspace.exe 工具包下载到本地。6.配置环境变量以 Windows 11 为例,配置步骤如下:在任务栏搜索框输入 “环境变量”,或在 控制面板 → 系统和安全 → 系统 → 高级系统设置 中找到 环境变量 入口。在弹出的窗口中,找到 系统变量 下的 Path,点击 编辑。在 Path 配置界面中,点击 新建,输入 hdspace.exe 所在目录的路径。确认保存设置并退出。完成上述操作后,用户即可在 任意命令行窗口(如 CMD、PowerShell)中直接使用 hdspace.exe 命令。安装成功截图如下常用命令如下含义命令云开发环境顶层帮助hdspace devenv --help开发者空间配置帮助hdspace config --help开发者空间版本帮助hdspace version --help云开发环境列表帮助hdspace devenv list --help创建云开发环境帮助hdspace devenv create --help启动云开发环境帮助hdspace devenv start –help关闭云开发环境帮助hdspace devenv close --help删除云开发环境帮助hdspace devenv delete --help建立隧道帮助hdspace devenv start-tunnel --help7.获取并配置 AK/SK在使用 CLI 工具操作云开发环境前,需要完成 身份认证。这依赖于 AK(Access Key) 与 SK(Secret Key):AK(Access Key):访问密钥的唯一 ID,用于标识用户身份,通常可在网络传输中公开。SK(Secret Key):秘密密钥,仅用户与服务端持有,用于生成请求签名,确保请求合法性并防止未授权访问。配置 AK/SK 等价于在 CLI 工具中完成身份认证,从而使开发者能够通过命令行安全地管理和操作云开发环境。8.获取 AK/SK在下载的文件中可找到 AK/SK,格式类似如下:配置 AK/SK在命令行中执行以下命令:hdspace config根据提示依次输入 AK 和 SK:输入 AK 后回车输入 SK(注意:SK 输入时不会显示回显),并再次输入确认配置完成后,CLI 工具即可正常使用身份认证信息访问云开发环境。9.查看可用云开发环境信息2.2 领取GaussDB数据库目前可以免费领取GaussDB在线试用版(2025年 06月 21日 - 2025年 12月 31日)。当报名申请审核通过后,进入 开发者空间工作台。此时页面会1.显示 GaussDB 免费试用 提示,点击 立即开通 即可完成开通操作。若需远程访问数据库实例,必须为其绑定弹性公网 EIP(EIP 需单独购买,按需计费,价格约为 0.33 元/小时)。在控制台中,点击目标数据库实例名称,即可进入 GaussDB 基本信息 页面:2.登录GaussDB数据库回到云数据库控制台,登录数据库:填写密码后测试成功:3.成功登录页面如下4.点击绑定弹性公网IP,就可远程使用。三、在线TODO清单应用搭建3.1 项目背景功能分析这是一个基于Flask框架和GaussDB数据库构建的在线TODO清单网站,提供简洁美观的界面和完整的任务管理功能。功能特点📝 添加任务:创建新的待办事项,支持标题和详细描述✅ 完成任务:一键标记任务为已完成/未完成🗑️ 删除任务:轻松移除不需要的任务📋 任务列表:按创建时间倒序显示所有任务💬 消息提示:操作反馈及时显示📱 响应式设计:适配各种屏幕尺寸🎨 现代UI:采用Tailwind CSS构建的简洁美观界面项目结构GaussDB/ ├── app.py # 主应用程序文件 ├── requirements.txt # 项目依赖 ├── .env # 环境变量配置 ├── .gitignore # Git忽略规则 ├── templates/ # HTML模板目录 │ └── index.html # 主页面模板 └── README.md # 项目说明文档 3.2 GaussDB数据库样例数据如下: (1, '学习GaussDB基础', '了解GaussDB的基本概念和架构', FALSE), (2, '创建TODO应用', '使用Flask和GaussDB构建简单的TODO应用', FALSE), (3, '配置数据库连接', '确保应用能够正确连接到GaussDB', TRUE), (4, '测试SQL执行', '验证各种SQL语句在GaussDB中的执行情况', FALSE), (5, '解决权限问题', '修复创建表和序列时的权限错误', FALSE); 完整的GaussDB数据库执行命令如下:-- GaussDB schema 权限问题解决方案 -- 1. 检查当前连接使用的schema SELECT current_schema(); -- 2. 查看可用的schema列表 SELECT nspname FROM pg_namespace; -- 3. 尝试切换到public schema(如果有权限) SET search_path TO public; -- 4. 在public schema中创建todo表 CREATE TABLE public.todo ( id INT NOT NULL PRIMARY KEY, title VARCHAR(100) NOT NULL, description TEXT, completed BOOLEAN NOT NULL DEFAULT FALSE, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); -- 5. 插入样例数据 INSERT INTO public.todo (id, title, description, completed) VALUES (1, '学习GaussDB基础', '了解GaussDB的基本概念和架构', FALSE), (2, '创建TODO应用', '使用Flask和GaussDB构建简单的TODO应用', FALSE), (3, '配置数据库连接', '确保应用能够正确连接到GaussDB', TRUE), (4, '测试SQL执行', '验证各种SQL语句在GaussDB中的执行情况', FALSE), (5, '解决权限问题', '修复创建表和序列时的权限错误', FALSE); -- 6. 验证插入结果 SELECT * FROM public.todo; -- 使用说明: -- 1. 执行此脚本前,请确保您有权限访问和使用public schema -- 2. 如果切换schema失败,请联系数据库管理员授予适当的权限 -- 3. 如果仍然无法创建表,可能需要管理员在特定schema中为您创建表结构 这份脚本主要用于解决 GaussDB 中 schema 权限不足 导致的建表问题。流程包括:首先检查当前连接所使用的 schema,并查看可用的 schema 列表;若有权限则切换到 public schema,在其中创建 todo 表并插入示例数据;最后通过查询验证插入结果。使用时需确保用户具备 public schema 的访问与操作权限,如仍遇到权限限制,则需联系数据库管理员授予相应权限或由管理员在目标 schema 下预建表结构。3.3 todo清单构建创建并使用一个简单的 TODO 清单表,以实现任务管理的基本功能。主要步骤包括:选择合适的 schema、创建表结构、插入示例数据以及验证数据。选择或切换 schema通过 current_schema() 查看当前连接的 schema,使用 SET search_path TO public; 切换到 public schema(前提是具有权限)。创建 TODO 表表结构设计包括 id(主键)、title、description、completed 状态、created_at 和 updated_at 时间戳等字段,支持记录任务详情及状态跟踪。插入示例数据向 todo 表中插入若干任务条目,用于后续的测试和展示。验证与查询通过 SELECT * FROM public.todo; 检查数据是否成功写入,并可根据 completed 状态或其他字段进行筛选和排序,实现基本的任务管理功能。这种方法不仅便于快速搭建实验性 TODO 应用,也为后续通过应用程序(如 Flask)对 GaussDB 的访问提供了数据基础。增加数据删除数据更新数据GaussDB数据库信息在本节中,我们通过 GaussDB 成功构建了一个简单的 TODO 清单表,实现了任务的增删改查操作。首先,确保使用具有权限的 schema(如 public),然后创建包含任务 ID、标题、描述、状态和时间戳等字段的表结构。接着,通过插入示例数据完成初始填充,并通过查询验证数据的正确性。同时展示了增、删、改操作的实际效果,使得用户能够直观了解 GaussDB 对任务数据的管理能力。整体流程为后续基于应用程序(如 Flask)构建完整的 TODO 应用打下了坚实的数据基础,也体现了 GaussDB 在日常开发中灵活、高效的数据库操作能力。四.心得通过本案例的实践,我们可以获得以下几点重要心得与经验:4.1 云开发环境的优势与体验快速搭建与即开即用华为开发者空间提供的云开发环境无需复杂的本地配置,只需创建环境并启动,即可开始编码与调试。这对于中小团队或个人开发者尤其方便,能够节省环境配置时间,并避免“环境不一致”问题。一体化的开发体验在同一平台下完成代码开发、数据库管理、依赖安装和远程调试,极大提升了开发效率。同时,CLI 工具 hdspace.exe 提供了命令行管理、文件上传下载、隧道连接等功能,使得远程操作更加灵活便捷。云端协作与可扩展性通过云开发环境,团队成员可以共享同一开发环境,实现代码与数据的一体化管理。环境资源可按需扩展,例如增加计算或存储能力,非常适合原型验证和小型项目开发。4.2 GaussDB 数据库的使用体会权限管理与 schema 问题GaussDB 默认 schema 权限可能会影响建表和数据操作。通过切换到 public schema 或联系管理员授予权限,可以顺利完成数据库建表、插入数据和查询操作。这提醒开发者在云数据库使用中,应充分了解权限体系与 schema 管理策略。数据操作便捷无论是通过 SQL 脚本插入样例数据,还是在 Flask 应用中进行增删改查,GaussDB 的执行效率和稳定性表现良好。在实际应用中,开发者可以快速验证数据操作,保证前端应用的响应速度和数据一致性。云数据库安全与远程访问绑定弹性公网 EIP 后可实现远程访问,结合 AK/SK 配置可确保操作安全。开发者在生产环境中应注意安全策略,例如限制 IP、启用访问控制和加密连接,确保数据安全。4.3 Flask 与数据库结合的实践经验轻量级快速开发Flask 框架以简洁著称,非常适合快速构建原型应用。在本案例中,通过少量代码就完成了 TODO 清单的页面展示、任务增删改查以及数据持久化,体现了 Flask 的灵活性。ORM 与数据库交互在实际开发中,可以使用 Flask 的 ORM(如 SQLAlchemy)进行数据库操作,使数据操作更加直观、可维护。通过本案例,我们掌握了基本的 ORM 映射与查询方法,为后续复杂应用打下基础。前后端分离与响应式设计本案例采用 Tailwind CSS 构建界面,简洁美观且自适应不同设备。结合 Flask 提供的数据接口,可进一步扩展为前后端分离的 Web 应用,实现更丰富的功能。4.4 总结与经验分享小型应用原型验证本案例演示了如何在 40 分钟内完成一个完整的 TODO 清单应用,从环境搭建到数据库对接,再到应用部署,充分体现了云开发环境的高效性和可操作性。注意权限与配置在使用云数据库时,应提前了解 schema 权限、AK/SK 配置及公网访问策略,避免在开发过程中因权限问题导致操作受限。可拓展性与实践价值本案例可以作为其他小型 Web 应用的模板,例如博客系统、在线笔记、任务管理工具等。开发者可在此基础上进一步扩展功能,例如用户登录、任务分类、提醒机制等。云开发与本地开发结合尽管云开发环境方便快捷,但在处理大规模数据或复杂计算时,本地开发环境仍有其优势。建议开发者根据项目需求灵活选择开发方式,云端和本地相结合,以提高开发效率。通过本案例,开发者不仅掌握了 Flask 与 GaussDB 的基础使用方法,也积累了远程云开发环境实践经验,为后续更复杂 Web 应用开发奠定了坚实基础。我正在参加【案例共创】第6期 开发者空间-基于云开发环境和GaussDB构建应用 https://bbs.huaweicloud.com/forum/thread-0229189398343651003-1-1.html
  • [问题求助] 物化视图后续版本是否可以支持自动刷新
    物化视图后续版本是否可以支持自动刷新
总条数:1630 到第
上滑加载中