
本教程将指导您如何在TypeScript应用中,特别是使用`sqlite3`库时,将从SQLite数据库查询到的原始数据行高效且类型安全地反序列化为预定义的TypeScript类实例。文章重点讲解了`sqlite3.all()`方法的异步特性、Promise的正确使用方式,以及如何迭代并映射数据库返回的行数据以构建类型化的对象数组,确保数据处理的健壮性和可维护性。
在现代TypeScript应用开发中,与数据库交互是常见任务。从数据库中检索数据后,我们通常希望将其转换为应用程序中定义的、具有明确结构的TypeScript对象或接口实例,以利用TypeScript的类型检查优势,提高代码的可读性、可维护性和健壮性。
然而,像sqlite3这样的数据库驱动程序,其查询方法(例如all())通常返回的是原始的、松散类型的数据行数组。直接使用这些原始数据往往会导致类型不明确,甚至运行时错误。此外,数据库操作本质上是异步的,这要求我们采用适当的异步编程模式来处理结果。本教程将以sqlite3为例,详细讲解如何克服这些挑战,实现从SQLite查询结果到TypeScript类型化对象的无缝反序列化。
sqlite3库中的all()方法用于执行SQL语句并获取所有匹配的行。然而,它并不是一个同步方法,它不会立即返回查询结果。根据node-sqlite3的API文档,all()方法提供的是一个回调式API:它接受一个回调函数作为参数,当查询完成时,该回调函数会被调用,并传入可能发生的错误和查询结果行。
值得注意的是,all()方法本身的返回值是Statement对象,这允许进行链式调用,但它并不是我们期望的数据结果。因此,直接在all()调用之后尝试访问结果是无效的,因为查询可能尚未完成。
为了在TypeScript/J*aScript环境中优雅地处理这种异步行为,我们应该将其封装在一个Promise中,或者使用async/await语法糖。
MarketingBlocks AI
AI营销助理,快速创建所有的营销物料。
27
查看详情
假设我们有一个名为Obj的TypeScript接口或类,它代表了数据库中ObjTable表的结构:
interface Obj {
id: number;
name: string;
amount: number;
}我们的目标是编写一个函数,能够从ObjTable中读取所有行,并将它们转换为Obj类型的数组。
由于sqlite3.all()是异步的,我们需要使用Promise来封装它,以便能够以同步的方式处理其结果(例如使用.then()或await)。
import * as sqlite3 from 'sqlite3';
// 假设 db 是已初始化的 sqlite3 数据库实例
const db = new sqlite3.Database(':memory:'); // 示例:使用内存数据库
// 创建表(为完整示例提供)
export const CreateObjTable = (): Promise<void> => {
return new Promise((resolve, reject) => {
const query = db.prepare(`
CREATE TABLE IF NOT EXISTS ObjTable
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
amount INTEGER
)
`);
query.run((err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
});
};
// 获取所有 Obj 对象的函数
export const GetAllObjs = (): Promise<Obj[]> => {
const query = db.prepare("SELECT * FROM ObjTable");
return new Promise((resolve, reject) => {
let objs: Obj[] = []; // 初始化一个空数组来存储类型化的对象
// 调用 query.all(),并传入回调函数
query.all((err, rows) => {
if (err) {
// 如果发生错误,拒绝 Promise
return reject(err);
}
// 确保 rows 是一个数组,并正确迭代
// rows 的类型通常是 any[],我们需要将其断言为 Obj[] 或在内部手动映射
for (const row of rows as any[]) { // 使用 for...of 迭代数组元素
objs.push({
id: row.id,
name: row.name,
amount: row.amount,
} as Obj); // 将原始行数据映射到 Obj 类型
}
// 查询成功且数据映射完成,解决 Promise 并返回类型化数组
resolve(objs);
});
});
};为了提供完整的上下文,以下是包含表创建、数据插入和数据查询的完整示例:
import * as sqlite3 from 'sqlite3';
// 定义数据模型
interface Obj {
id: number;
name: string;
amount: number;
}
// 假设 db 是已初始化的 sqlite3 数据库实例
// 实际应用中,你可能从外部配置或单例模式获取 db 实例
const db = new sqlite3.Database(':memory:', (err) => {
if (err) {
console.error('Error opening database', err.message);
} else {
console.log('Connected to the SQLite database.');
}
});
// 创建 ObjTable 表
export const CreateObjTable = (): Promise<void> => {
return new Promise((resolve, reject) => {
db.run(`
CREATE TABLE IF NOT EXISTS ObjTable
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
amount INTEGER
)
`, (err) => {
if (err) {
reject(err);
} else {
console.log('ObjTable created or already exists.');
resolve();
}
});
});
};
// 插入示例数据
export const InsertObj = (name: string, amount: number): Promise<void> => {
return new Promise((resolve, reject) => {
db.run(`INSERT INTO ObjTable (name, amount) VALUES (?, ?)`, [name, amount], function(err) {
if (err) {
reject(err);
} else {
console.log(`A row has been inserted with rowid ${this.lastID}`);
resolve();
}
});
});
};
// 获取所有 Obj 对象的函数
export const GetAllObjs = (): Promise<Obj[]> => {
return new Promise((resolve, reject) => {
const objs: Obj[] = []; // 初始化一个空数组来存储类型化的对象
db.all("SELECT id, name, amount FROM ObjTable", (err, rows: any[]) => {
if (err) {
return reject(err); // 如果发生错误,拒绝 Promise
}
// 迭代查询结果,将原始行数据映射到 Obj 类型
for (const row of rows) {
objs.push({
id: row.id,
name: row.name,
amount: row.amount,
});
}
resolve(objs); // 查询成功且数据映射完成,解决 Promise
});
});
};
// 示例使用
async function main() {
try {
await CreateObjTable();
await InsertObj('Item A', 100);
await InsertObj('Item B', 250);
await InsertObj('Item C', 75);
const allObjs = await GetAllObjs();
console.log('Retrieved Objects:', allObjs);
// 验证类型安全
allObjs.forEach(obj => {
console.log(`ID: ${obj.id}, Name: ${obj.name}, Amount: ${obj.amount}`);
// obj.nonExistentProperty = 'error'; // 这会在编译时报错,体现了类型安全
});
} catch (error) {
console.error('An error occurred:', error);
} finally {
db.close((err) => {
if (err) {
console.error('Error closing database', err.message);
} else {
console.log('Database connection closed.');
}
});
}
}
main();将SQLite查询结果反序列化为TypeScript类型化对象是构建健壮、可维护应用程序的关键一步。通过深入理解sqlite3.all()等方法的异步特性,并结合Promise的封装、for...of的正确迭代以及明确的类型映射,我们可以有效地将原始数据库数据转换为我们应用程序所需的强类型结构。遵循本教程中的指导和最佳实践,将有助于您在TypeScript项目中实现高效且类型安全的数据库交互。
以上就是TypeScript中将SQLite查询结果反序列化为类型化对象的教程的详细内容,更多请关注其它相关文章!
# 将其
# 微博营销推广公司模式
# 外贸网站建设骗局案例
# 磐安建设工程招标网站
# 江北普通网站建设
# wh网站建设
# 浙江宁波网站优化价格
# 充电器推广营销策略论文
# 宝山区定制网站建设
# 靠谱网站建设源码
# 网站专业建设价钱
# 这是
# 行数
# 数据结构
# 转换为
# 是一个
# javascript
# 的是
# 迭代
# 查询结果
# 回调
# 异步
# 应用开发
# sql注入
# ai
# 回调函数
# app
# typescript
# node
# js
# java
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
腾讯QQ邮箱官方入口 QQ邮箱网页版登录平台
如何在CSS中使用absolute实现登录弹窗居中_transform translate结合
支付宝登录刷脸不是本人如何解决
iPhone 13 mini如何清理Safari缓存_iPhone 13 mini浏览器缓存清理方法
PHP安全加载非公开目录图片与动态内容类型处理指南
从J*a应用程序中导出MySQL表数据的技术指南
《兴业银行》注册登录方法
ToDesk远程摄像头功能使用方法_ToDesk远程视频画面查看设置教程
QQ网页版入口导航 QQ网页版在线访问通道
漫蛙manwa2网页版书签同步链接_漫蛙manwa多设备登录入口
怎样设置开机后自动运行某个程序_Windows启动文件夹与任务计划【自动化】
Google Cloud Functions 时区处理指南:理解与最佳实践
Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧
C++ switch case字符串_C++如何实现字符串switch匹配
顺丰快递单号查询寄件人 顺丰寄件人查询入口
《长生:天机降世》火塔小怪大全
优化2xN网格最大路径和的动态规划算法实践
Excel如何快速找到并断开外部数据源链接_Excel外部数据源断开方法
iPhone14无法连接蓝牙设备如何解决
PHP中获取HTTP响应状态消息:方法与限制
曝《丝之歌》DLC有望开发!开发商还有神秘新企划
J*aScript调试技巧_性能分析与内存快照
Mac如何开启画中画模式_Mac Safari浏览器视频画中画功能
php如何实现多域名共享session_php存储session到redis与跨域读取配置
TikTok笔记文字无法编辑如何解决 TikTok笔记文字编辑优化方法
PHP中实现JSON数据数组分页的教程
AO3中文入口稳定分享_AO3官网HTTPS看文详解
windows10怎么设置电源按钮_windows10按下电源键功能修改
t3出行如何使用微信支付
composer licenses 命令:如何检查项目依赖的许可证?
C#解析并修改XML后保存 如何确保格式与编码的正确性
德邦快递收费标准详解
《随手记》备份数据方法
知乎APP怎么查看自己被邀请的问题_知乎APP邀请回答记录查看与参与方法
使用VS Code作为你的个人知识管理系统
包子漫画官网链接官方地址 包子漫画在线观看官网首页入口
金牛福袋获取攻略
猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法
抖音火山版注销账号抖音会注销吗 抖音火山版与抖音账号注销关系
如何配置VS Code作为您Git操作的默认编辑器
TikTok收藏夹无法删除视频如何解决 TikTok收藏管理优化方法
性能与资源监视器快捷打开
edge浏览器怎么修改语言为中文_Edge界面语言切换教程
Windows Audio服务启动失败怎么办_电脑没声音的终极服务修复法【修复】
如何查询国外邮政编码_国外邮政编码查询的多种有效途径
word文档中的分隔符有哪些不同类型和用途_Word分隔符类型与用途方法
Highcharts雷达图径向轴数值标签实现教程
汽水音乐车机版官网5.0 汽水音乐车机版5.0版本下载入口
TikTok网页版实时观看入口 TikTok网页版短视频在线浏览
b站怎么查看视频的码率_b站视频码率查看方法
2025-11-14
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。