【仓颉语言入门 · 第二篇 第 7 课】
【仓颉语言入门 · 第二篇 第 7 课】数据库入门认识 std.database.sql连上 MySQL解析 BMP 文件头时我们自己数偏移、自己定字段边界——那种数据结构由程序自己扛的方式处理单个文件还行可一旦数据变成一个班的花名册文件就捉襟见肘了查一个学生要全文读一遍两个程序同时写还可能互相覆盖。从这一课起我们进入数据库篇。第一步不急着写增删改——先把地基打好认识仓颉的数据库接口std.database.sql配好 MySQL 环境让程序真正连上数据库。能连上后面的事就好办了。⚠️本课实测状态说明本文 API 签名均核对自仓颉 SDK 1.2.0 产物与驱动源码代码可用度高但撰写本文时作者电脑因 Windows 更新msvcrt.dll 兼容性导致仓颉运行时暂时启动崩溃所有text块均为依据接口语义与驱动官方测试用例推算的预期输出尚未逐字实测。环境恢复后会第一时间逐块编译运行、逐字校验并移除本说明。跟练时如遇出入请以你本地实际输出为准并反馈作者。目录第二篇导航第一篇《仓颉语言入门》共 30 课已完结环境搭建 → 语法 → 函数 → 类型系统 → 工程化 → 并发 → 两场实战。第二篇在更高的起点上继续共26 课、4 个模块模块课次内容一、补遗篇0106正则、时间日期、命令行参数、随机数、加密哈希、二进制处理二、数据库篇0715入门与连接、建表、查询、插入、更新删除、预编译防注入、事务、手写 DAO、综合小实战三、进阶硬核篇1622反射、宏基础、deriving 实战、FFI 基础、FFI 进阶、并发容器、对象池四、实战项目篇2326HTTP 基础、HTTP 进阶、多线程日志分析器、简易爬虫正则表达式std.regex时间日期处理std.time命令行参数解析std.argopt随机数与概率std.random加密与哈希std.crypto二进制数据处理std.binary数据库入门认识 std.database.sql连上 MySQL本文建表用代码定义表结构查询SELECT 与结果集遍历插入INSERT、占位符与自增主键更新与删除UPDATE / DELETE预编译与防 SQL 注入事务批量操作的成败一致手写 DAO 数据访问层数据库综合小实战反射在运行时打量类型宏基础std.ast 与 quotederiving 宏实战与 C 互操作基础FFI 调用 C 函数FFI 进阶结构体、指针与编译配置并发容器并发安全的集合对象池与资源复用实战三HTTP 服务端基础实战四HTTP 进阶与 JSON 接口实战五多线程日志分析器实战六简易爬虫一、为什么要进数据库回顾第一篇的文件小工具数据存成 JSON 行每次启动全读进ArrayList改完再整文件写回。数据量小的时候简单美好学生一多痛点立刻冒头痛点文件方案数据库方案查一条全文读到内存逐行比对SELECT ... WHERE id ?服务器直接返回插一条读全文 → 加一行 → 整文件写回INSERT一条语句搞定并发写两个程序同时写后写覆盖先写服务器统一调度不打架程序只负责发 SQL 语句存储、索引、并发这些脏活全交给MySQL 服务器一个独立运行的后台服务┌──────────────┐ SQLTCP 3306 ┌──────────────┐ │ 你的仓颉程序 │ ──────────────────────→ │ MySQL 服务器 │ │ │ ←────────────────────── │ 存数据、执行│ └──────────────┘ 结果/影响行数 └──────────────┘还有一个容易误会的点要先说清标准库std.database.sql里没有任何能连数据库的实现它只定义接口就像插座标准——规定插座长什么样但不发电public interface Driver { func open(url: String, opt: Array(String, String)): Datasource } public interface Datasource { func connect(): Connection } public interface Connection { func prepareStatement(sql: String): Statement prop state: ConnectionState } public interface Statement { func setT(index: Int64, value: T): Unit func query(): QueryResult // 执行 SELECT func update(): UpdateResult // 执行 INSERT/UPDATE/DELETE/建表 }发电的是驱动——实现了这套接口的第三方包。本课用仓颉官方适配组Cangjie-SIG维护的mariadb-driver纯仓颉实现同时兼容 MySQL / MariaDB / TiDB。包名虽叫mariadb连本机 MySQL 毫无压力MariaDB 本就是 MySQL 的同源分支协议一致。本课的目标就一个让下面的程序打印出Connected。建表、查询、增删改留给后面几课慢慢来。二、环境准备一次性配好三样东西后面数据库篇所有课都用这套环境。2.1 装好 MySQL 并建库已装过 MySQL 的同学服务列表里能看到MySQL57/MySQL80且状态 Running跳过安装。没装的到官网 https://dev.mysql.com/downloads/installer/ 下载 Installer只勾MySQL Server一路 Next记住给 root 设置的密码本文示例统一写123456你要换成自己的。然后打开 MySQL 命令行客户端PowerShell 执行mysql -u root -p输入密码建课程专用库CREATEDATABASEcj_demoDEFAULTCHARACTERSETutf8mb4;坑字符集写utf8mb4别写utf8——MySQL 里的utf8是残废版最多 3 字节存生僻字会报错。2.2 装驱动的两个前置依赖mariadb-driver 编译时还需要两样东西OpenSSL 3登录 MySQL 时密码哈希要用。装Win32OpenSSLhttps://slproweb.com/products/Win32OpenSSL.htmlWin64 版。第 5 课装过的同学跳过。stdx 扩展库驱动解析连接 URL 用到stdx.encoding.url。到仓颉官网 https://cangjie-lang.cn 下载与 SDK版本一致的cangjie-stdx-windows-x64-xxx解压到固定位置作者机器上是D:\software\cangjie\cangjie_stdx_libs\stdx并设置系统环境变量CANGJIE_STDX_PATH指向这个目录。小提示之后cjpm update报找不到 stdx 包九成是这个环境变量没设或路径指错——注意指向里面那层stdx目录。2.3 建工程引入驱动cjpm init一个可执行工程cj_mysql_demo把cjpm.toml改成[package] cjc-version 1.2.0 name cj_mysql_demo version 1.0.0 output-type executable [dependencies] mariadb {git https://gitcode.com/Cangjie-SIG/mariadb-driver.git, branch master} [target.x86_64-w64-mingw32] [target.x86_64-w64-mingw32.bin-dependencies] path-option [D:\\software\\cangjie\\cangjie_stdx_libs\\stdx]两处按你机器改cjc-version与本地 SDK 一致path-option改成你的 stdx 路径双反斜杠\\。然后在工程根目录执行cjpm update第一次需要联网拉驱动源码并编译看到 sync success 之类提示就成功了。2.4 第一个数据库程序src/main.cjpackage cj_mysql_demo import std.database.sql.* import mariadb.cdbc; main(): Int64 { // 1. 按名字取出驱动 let driver DriverManager.getDriver(mariadb).getOrThrow() // 2. 连接 URL 连接选项打开数据源 let ds driver.open(mariadb://127.0.0.1:3306, [ (username, root), (password, wangpeng), (database, tumo_governance) ]) // 3. 借一条连接看状态还回去 let conn ds.connect() println(连接状态${conn.isClosed()}) conn.close() 0 }连接状态false看到false仓颉程序就和 MySQL 握上手了。报错的话先翻文末 FAQ。三、五个对象一条调用链回头看 2.4 的代码一次数据库访问就是五个角色接力DriverManager ──getDriver(mariadb)──▶ Driver │ open(url, 选项) ▼ Datasource数据源 │ connect() ▼ Connection连接 │ prepareStatement(sql) ▼ Statement ──query()/update()──▶ 结果对象职责类比DriverManager驱动注册表按名字查驱动快递客服总台Driver一个数据库品牌的驱动某家快递公司Datasource数据源当地分拣站Connection一条网络连接一辆快递车Statement一条可执行的 SQL一个要寄的包裹三个要点驱动是凭空来的我们没写MariaDBDriver()是import mariadb.cdbc.*加载包时驱动源码里的一行包级代码自动把自己注册进了DriverManager。删掉这行 importgetDriver(mariadb)就返回None——这就是为什么必须 import 驱动包。URL 和选项分工URL 只写地址mariadb://主机:端口协议头必须mariadb://用户名、密码、库名放第二参数的元组数组里每项是(选项名, 值)。本课用到username/password/database/ssl.mode四个最后一个disabled是本机关闭加密正式环境再谈。connect 是借close 是还Datasource内部有连接池conn.close()不是断网是把连接还回池子。所以用完必须 close只借不还池子会干涸。连接对象的状态属性state来自枚举ConnectionStateConnecting连接中、Connected正常、Closed已关闭、Broken故障。排障时打印它最直观。四、常用 API 速查连接篇环节API说明查注册DriverManager.drivers()返回已注册驱动名数组取驱动DriverManager.getDriver(mariadb).getOrThrow()import 驱动包后按注册名取开数据源driver.open(mariadb://host:3306, [(k, v), ...])选项username/password/database/ssl.mode借连接ds.connect()从连接池借不是新建 TCP还连接conn.close()还回池子用完必须还看状态conn.stateConnecting / Connected / Closed / Broken五、常见问题 FAQQ1标准库为什么不自带 MySQL 驱动包名叫 mariadb 能连 MySQL 吗std.database.sql只定义接口“插座标准”实现交给生态“电器”这是仓颉官方的分工设计。mariadb-driver 是仓颉官方适配组 Cangjie-SIG 维护的MariaDB 本就是 MySQL 原作者分叉的同源项目两者网络协议兼容TiDB、OceanBase 也兼容——所以这个驱动能连一整族数据库连谁只取决于 URL 里的主机和端口。Q2为什么必须import mariadb.cdbc.*代码里根本没用到包里的名字。import 不只是为了用名字还会触发驱动的自注册见第三节第一个要点。不 importDriverManager里就没有 mariadb 这个驱动getDriver返回NonegetOrThrow()当场抛异常。Q3连接报错怎么排查按出现频率排① MySQL 服务没启动② 密码写错或没改课文里的123456③ 端口不是 3306④CANGJIE_STDX_PATH没配导致驱动编译不过⑤ OpenSSL 的 DLL 不在 PATH。排障时先把conn.isClosed()打出来看。六、课后练习前 3 题必做第 4 题选做。本课练习都围绕连接这一件事不需要写任何 SQL。第 1 题必做查驱动注册表在 2.4 程序的基础上把println那行改成打印驱动注册表的内容运行确认 mariadb 驱动确实被自动注册了。提示用第三节提到的DriverManager.drivers()直接字符串插值打印即可。main(): Int64 { println(已注册的驱动${DriverManager.drivers()}) 0 }期望输出已注册的驱动[mariadb]第 2 题必做亲眼看一次连接失败把程序里的密码故意改错比如wrong-password运行观察报错看完把密码改回来确认恢复正常。这道题的目的以后你写数据库程序时第一次报错大概率就是密码或端口不对——提前见过报错的样子就不慌了。第 3 题必做借两条连接在 2.4 程序的基础上连续connect()两次分别打印两条连接的状态最后把两条都close()。提示两条连接分别用conn1、conn2两个变量接住打印两行状态即可。let conn1 ds.connect() let conn2 ds.connect() println(连接 1${conn1.isClosed()}) println(连接 2${conn2.isClosed()}) conn1.close() conn2.close()期望输出连接 1false 连接 2false下节预告连接跑通了但库里只有一个空的cj_demo连表都没有。下一课建表用代码定义表结构——认识 SQL 的 DDL用仓颉代码把students表建出来为查询和增删改备好容器。系列说明本系列基于 Windows 平台 CIDE 仓颉 SDK1.2.0编写。本文 API 均核对自 SDK 与驱动源码运行输出待环境恢复后逐字实测更新如遇 SDK 版本差异导致的细节出入以你本地版本为准欢迎评论区交流。 遇到问题扫码联系作者跟着课程练习时如果在 SDK 安装、环境变量配置、编译报错或调试上卡住欢迎扫码加作者企业微信直接咨询请备注仓颉课程离线环境下图片可能加载不出来也可以在 CIDE 菜单Help ▸ 联系作者 / Contact中查看同一张二维码应用内置兜底图无需联网。 工具下载本系列全程使用的仓颉 IDE ——CIDE免费开源、社区版GitCode 仓库 / 安装包下载https://gitcode.com/wp_upala/cide打开页面后进入发行版Releases两种包任选其一安装版下载CIDE-版本-x64-Setup.exe双击安装适合日常长期使用免安装版Portable下载CIDE-版本-x64-Portable.zip解压到任意目录即用不写注册表、不留安装痕迹拷到 U 盘也能在别的电脑直接运行包内附《使用说明.txt》。适合先试用、或在受限电脑上学习本系列课程。仓颉 SDK 请前往仓颉编程语言官网下载https://cangjie-lang.cn

相关新闻

Python基础语法练习题解读:从易错点到实战方案

Python基础语法练习题解读:从易错点到实战方案

可以从 Python 基础语法练习题的五个关键维度来展开。咱们先聊聊那些熟悉又容易踩坑的细节。1. 内容整体设计与思路拆解1.1 核心需求解析Python 基础语法练习题,这个名字看着简单,但真正想把它练扎实,比用框架做几个网页门槛高得多。它考察的…

2026/10/18 7:44:06 阅读更多 →
Java读取配置文件的几种高效方法

Java读取配置文件的几种高效方法

在开发项目的过程之中, 有些参数或者像数据这样的情况, 是存在需要经常被进行改动的可能的。举例来说吧, 例如说是数据库的配置情况、ftp的路径信息、还有落地文件的路径信息等这些内容。针对这一类经常需要被去修改的数据内容, 我们就需要去做一件事情, 那就是把它们给写入在一…

2026/10/18 7:44:06 阅读更多 →
GEO优化实战:深圳头部团队如何提升AI搜索可见度

GEO优化实战:深圳头部团队如何提升AI搜索可见度

2026年3月的深圳,GEO优化这个词在市场营销圈里的热度,已经和当年私域流量爆发时不相上下。我在过去四个多月里,陆续接触了大湾区十来家正在做GEO优化的企业,有跨境电商、智能硬件、也有B2B工业品出海的,说实话最能拉开…

2026/10/18 7:44:06 阅读更多 →

最新新闻

【实战】手把手教你搭建企业级Model Context Protocol (MCP)服务:从Spring AI到TaoToken统一通道

【实战】手把手教你搭建企业级Model Context Protocol (MCP)服务:从Spring AI到TaoToken统一通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 10:22:42 阅读更多 →
专科生论文能用AI写吗?8类AI工具从开题到答辩全流程指南

专科生论文能用AI写吗?8类AI工具从开题到答辩全流程指南

最近好几个专科的学弟学妹跑来问我同一个问题:“论文真的能靠AI写吗?”。我的回答一直是:能,但你要把它当助手,而不是替身。这篇稿子不藏私,我把这些年自己写论文、帮别人改论文时真正用过、也确实解决问题…

2026/10/18 10:22:42 阅读更多 →
DeepSeek R1实战指南:访问路径、提示词技巧与自动化脚本

DeepSeek R1实战指南:访问路径、提示词技巧与自动化脚本

简介:这份PDF指南聚焦DeepSeek R1的完整使用路径,面向需要借助大模型提升数据分析、内容创作与工作效率的开发者、数据科学家、设计师等群体。内容系统覆盖七大获取方式:官网及App、硅基流动、秘塔搜索、Cursor、Groq、国家超算中心&#xff…

2026/10/18 10:22:42 阅读更多 →
银联银行卡BIN数据实战:支付路由与风控画像的底层逻辑

银联银行卡BIN数据实战:支付路由与风控画像的底层逻辑

简介:这份资源为银联官方2020年4月25日发布的银行卡BIN数据整理包,面向支付系统开发、金融风控建模、银行卡识别与清算对账等场景的工程师与数据分析人员。原始数据已由作者整理为可直接导入的SQL文件,共9868条记录,字段涵盖银行卡…

2026/10/18 10:22:42 阅读更多 →
通信对抗核心机制:干信比、处理增益与干扰容限详解

通信对抗核心机制:干信比、处理增益与干扰容限详解

简介:面向通信对抗原理课程学习者,这份西电通信对抗原理作业PDF是围绕课程核心知识整理的复习与参考材料,适合需要梳理“通信对抗”概念框架、备战期末或完成综合作业的本科生及自学读者。内容系统覆盖了通信对抗的定义与主被动分类&#xff…

2026/10/18 10:22:42 阅读更多 →
告别木偶Agent:用分层任务拆解构建可靠智能体系统

告别木偶Agent:用分层任务拆解构建可靠智能体系统

做Agent开发这几年,我踩过最大的坑就是亲手造出一个又一个木偶Agent——demo阶段看起来什么都会,工具调用行云流水,一丢到真实场景就崩得稀碎。后来我把这些翻车案例翻来覆去地复盘,发现根源几乎一致:大多数人都在用一…

2026/10/18 10:21:42 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →