relational-indexdb已发布npm开源仓库
阿勇的relational-indexdb已发布npm开源仓库,欢迎大家使用哟,源码地址放在了GitHub 别忘了点颗✨✨ 谢谢大家 github.com/AyongNice/r…
下载安装
yarn add relational-indexdb
关注微信公众号: 阿勇学前端
关注抖音: 阿勇学前端
个人搭建chatGpt网站 ayongnice.love/chatgpt/
IndexedDB:
- IndexedDB 是一种客户端存储技术 非关系型数据库,用于在 Web 浏览器中存储和检索大量结构化数据。
- 它提供了一个类似关系型数据库的API,但是数据存储在浏览器中而不是远程服务器上。
- IndexedDB 使用对象存储空间来存储和检索数据,类似于关系型数据库的表。
- 它支持复杂的查询和索引,以及事务操作。
- IndexedDB 在 Web 应用程序中广泛用于离线数据存储、缓存数据和本地数据持久化等场景。
-
虽然index DB是非关系型数据库 但是Ayong为大家封装好了各种方法(updateDataByCursor、queryDataByCursor、deleteDataByCursor) 可以到达关系型数据库 那样的操作效果所以财位组件名字命名为relational-indexdb
当谈到数据库时,有两种主要类型:关系型数据库和非关系型数据库。下面是对它们以及 IndexedDB 的简要介绍:
-
关系型数据库:
-
- 关系型数据库使用表格结构来组织和存储数据。
- 数据以行和列的形式存储在表中,其中每行表示一个记录,每列表示一个属性或字段。
- 数据之间通过关系(主键和外键)建立关联。
- 常见的关系型数据库有 MySQL、Oracle、SQL Server 和 PostgreSQL。
-
非关系型数据库(NoSQL):
-
- 非关系型数据库采用不同的数据模型,如键值对、文档、列族和图形等。
- 它们通常更灵活,适用于处理大量非结构化和半结构化数据。
- 没有固定的表格结构,允许动态添加或删除字段。
- 常见的非关系型数据库有 MongoDB、Cassandra、Redis 和 Elasticsearch。
我们打开浏览器index DB的数据将存储这里
使用说明下面给大家说下所有方法的使用方法
RelationalIndexDB构造函数
| 参数 | 类型 | 描述 |
|---|---|---|
| databaseName | string | 数据库名称 |
| version | number | 数据库版本号 |
| tableName | string | 表名 |
| keyPath | string | 主键 |
| autoIncrement | boolean | 是否自增 |
| indexConfigs | IndexConfigs[] | 索引配置 |
IndexConfigs 表配置字段结介绍
| 字段 | 类型 | 描述 |
|---|---|---|
| name | string | 索引名称,用于标识该索引在对象存储空间中的唯一性 |
| keyPath | string | 索引字段的路径,指定要索引的属性或键路径 |
| unique | boolean | 指示索引的值是否唯一,默认为false |
const tableName = 'myTable';
const version = 1;
const keyPath = 'id';
const tableSchema = [
{name: 'id', keyPath: 'id', unique: true},
{name: 'issue', keyPath: 'issue', unique: false},
{name: 'answer', keyPath: 'answer', unique: false},
];
//在new RelationalIndexDB 示例时候将会创建一个数据表
const indexDB = new RelationalIndexDB('ayong', 1, tableName, keyPath, true, tableSchema);
名次解释
主键
主键(Primary Key)是数据库表中用于唯一标识每个记录的一列或一组列。主键的作用是确保表中的每个记录都具有唯一的标识,以便进行准确的数据检索、更新和删除操作。
主键具有以下特点:
- 唯一性:主键的值在整个表中必须是唯一的,每个记录都必须具有不同的主键值。
- 非空性:主键的值不能为空,每个记录都必须具有非空的主键值。
- 不可更改性:主键值一旦确定,就不能更改。
主键的作用是:
- 唯一标识记录:通过主键,可以唯一地标识和区分表中的每个记录。
- 数据索引:主键通常会自动创建索引,加快数据的检索速度。
- 数据完整性:主键约束可以确保数据的完整性,防止插入重复的记录。
在关系型数据库中,主键可以由单个列或多个列组成。如果是由多个列组成的主键,称为复合主键。主键的选择应该具备唯一性和稳定性,通常使用自增长整数(例如自增ID)作为主键,以确保每个记录都具有唯一的标识。
总之,主键是数据库表中用于唯一标识每个记录的列或列组合。它确保了数据的唯一性和完整性,并提供了数据检索和操作的基础。
主键自增autoIncrement 可能没有写过使用过mysql的前端小伙伴有点陌生
在 IndexedDB 中,autoIncrement 是一个用于指示是否自动递增主键值的属性。当你创建一个存储空间(表)时,可以为其中的主键字段设置 autoIncrement 为 true。
当 autoIncrement 设置为 true 时,IndexedDB 将自动为每个新插入的记录分配一个唯一的递增主键值。每次插入记录时,如果没有显式指定主键值,系统会自动分配一个比上一个插入的记录的主键值更大的值。
这个自增主键值对于确保每个记录都具有唯一标识非常有用,并且可以方便地进行排序和检索。当你需要为每个记录分配唯一的标识符,但又不想手动管理主键值时,autoIncrement 是一个很好的选择。
需要注意的是,autoIncrement 只能应用于主键字段,而且在同一个存储空间中只能有一个字段设置为 autoIncrement。如果你尝试为多个字段设置 autoIncrement,或者将其应用于非主键字段,将会引发错误。
总之,autoIncrement 是 IndexedDB 中的一个属性,用于指示是否自动递增主键值。它简化了记录的唯一标识的分配过程,并提供了便利的排序和检索功能。
索引 indexConfigs数据表字段配置中unique字段解释
在 IndexConfigs 中,unique 是一个用于指示索引是否具有唯一性约束的属性。当你在 IndexedDB 中创建一个索引时,可以为该索引的字段设置 unique 属性。
当 unique 设置为 true 时,IndexedDB 将确保索引中的每个值都是唯一的,即不会有重复的值。如果尝试插入具有重复索引值的记录,将会引发错误。
唯一性约束对于确保数据的一致性和避免重复数据非常有用。它可以防止意外地插入重复的数据,并且在需要按照索引进行查询时提供更高的性能。
需要注意的是,unique 属性只能应用于索引字段,而且在同一个存储空间中可以有多个字段具有唯一索引。这意味着可以为多个字段创建独立的唯一性约束。
总之,unique 是 IndexConfigs 中的一个属性,用于指示索引是否具有唯一性约束。它可以防止插入重复的数据,并提供高效的索引查询功能。
方法methds ⚠️ 所有方法返回值都是proms
createTable(tableName, version, keyPath, autoIncrement, indexConfigs)
新增/创建表。
| 参数 | 类型 | 描述 |
|---|---|---|
| tableName | string | 表名 |
| version | number | 版本号 |
| keyPath | string | 主键 |
| autoIncrement | boolean | 是否自增 |
| indexConfigs | IndexConfigs[] | 索引配置 |
createTable使用代码示例
创建表时候有个特别要注意的地方这也是indexDB要注意的地方 每一次新增一个数据表都要给数据升级一个版本,例如截图我当前数据库有6个表 版本肯定是大于等于6的
const tableName = 'ayongmyTable';
const version = 1;
const keyPath = 'id';
const tableSchema = [
{name: 'id', keyPath: 'id', unique: true},
{name: 'issue', keyPath: 'issue', unique: false},
{name: 'answer', keyPath: 'answer', unique: false},
];
//在new RelationalIndexDB 示例时候将会创建一个数据表
const indexDB = new RelationalIndexDB('ayong', 1, tableName, keyPath, true, tableSchema);
//我们先要在增加一个表就这样使用必须给数据库升级一个版本
const tableName2 = 'ayongmyTable';
const version2 = 2;
const keyPath2 = 'id';
const tableSchema2 = [
{name: 'id', keyPath: 'id', unique: true},
{name: 'issue', keyPath: 'issue', unique: false},
{name: 'answer', keyPath: 'answer', unique: false},
];
indexDB.createTable(tableName2,keyPath2,true,tableSchema2);
addRecord(key)
添加数据
| 参数 | 类型 | 描述 |
|---|---|---|
| tableName | string | 表名 |
| data | Object | 存储数据:数据结构要与表结构相对应,主键不能重复 |
indexDB.addRecord('myTable', { id: '123', useName: 'John Doe', title: '阿勇学前端', level: 100 });
queryRecord(tableName,key)
根据主键查询数据
| 参数 | 类型 | 描述 |
|---|---|---|
| tableName | string | 表名 |
| key | string | 主键值 |
indexDB.deleteRecord('myTable', '123');
deleteRecord(tableName, key)
删除记录。
| 参数 | 类型 | 描述 |
|---|---|---|
| tableName | string | 表名 |
| key | any | 主键值 |
//删除主键 为123 的那条数据
indexDB.updateRecord('myTable', '123');
updateRecord(tableName, key, newData)
更新数据。
| 参数 | 类型 | 描述 |
|---|---|---|
| tableName | string | 表名 |
| key | any | 主键值 |
| newData | any | 新数据对象:要修改的具体字段会与老数据覆盖相同的ke y |
/**
*这示例将会更新myTable表中 主键为 123。这条数据中 表字段 name 修改为 John Smith,更改哪个字段就写入哪个字段的新值就可以了
类似于mysql中的s q l语句 但是要注意 index DB不能执行s q l 他是非关系型数据库
UPDATE myTable SET name = 'John Smith' WHERE id = 123;
*/
indexDB.updateRecord('myTable', '123', { name: 'John Smith' });
batchUpdateRecords(tableName, updatesToUpdate)
| 参数 | 类型 | 描述 |
|---|---|---|
| tableName | string | 表名 |
| updatesToUpdate | updatesToUpdate[] | 要批量修改的列表数组字段详情见下方 |
updatesToUpdate[] 批量修改的列表数组字段详情
| 参数 | 类型 | 描述 |
|---|---|---|
| keyPathValue | string | 要修改的主键值 |
| data | Object | 要修改的字段 |
/**
* 批量更新跟updateRecord 一样 不同的是更新多条
*
**/
indexDB.batchUpdateRecords("myTable", [{
keyPathValue: 1688291753347,
data: {
id: 1688291753347,
name: 'ayong---6666'
}
},
{
keyPathValue: 1688291767078,
data: {
id: 1688291767078,
title: '阿勇学前端'
}
}
])
batchDeleteRecords(tableName, keysToDelete)
批量删除数据。
| 参数 | 类型 | 描述 |
|---|---|---|
| tableName | string | 表名 |
| keysToDelete | any[] | 需要删除的主键值数组 |
const keys = ['123', '456'];
indexDB.batchDeleteRecords('myTable', keys);
deleteTable(tableName)
删除表。
| 参数 | 类型 | 描述 |
|---|---|---|
| tableName | string | 表名 |
indexDB.deleteTable('myTable');
queryRecordsInRange(tableName, indexName, start, end)
范围查询记录。
| 类型 | 描述 | |
|---|---|---|
| tableName | string | 表名 |
| indexName | string | 索引名 |
| start | any | 范围起始值 |
| end | any | 范围结束值 |
//查询主键为id 值在1——20 之间的数据
indexDB.queryRecordsInRange('myTable', 'id', 1, 10).then((record) => {
console.log('Record-----:', record);
})
deleteRecordsInRange(tableName, indexName, start, end)
| 参数 | 类型 | 描述 |
|---|---|---|
| tableName | string | 表名 |
| indexName | string | 索引名 |
| start | any | 范围起始值 |
| end | any | 范围结束值 |
//删除主键为id 值在1——20 之间的数据
indexDB.deleteRecordsInRange('myTable', 'id', 1, 10).then((record) => {
console.log('Record-----:', record);
})
范围修改记录。
| 参数 | 类型 | 描述 |
|---|---|---|
| tableName | string | 表名 |
| indexName | string | 索引名 |
| start | any | 范围起始值 |
| end | any | 范围结束值 |
| newData | any | 要更新的新数据 |
deleteDataByCursor(tableName: string, condition: object): Promise
| 参数 | 类型 | 描述 |
|---|---|---|
| tableName | string | 表名 |
| condition | object | 删除的条件对象 |
/**
这个方法就是筛选符合条件数据 将这条数据删除
* 删除title = 无意义内卷 id:'123 的这条数据 就是符合多条件筛选条件 并操作这条数据
与之前的范围修改数据deleteRecordsInRange batchDeleteRecords 不同的是他们都是以主键为筛选条件操作数据
这个方法可以提供给你可以任意以表结构中筛选任意字段 符合条件后操作数据
它类似于mysql中 s q l 语句 DELETE FROM myTable WHERE title = '无意义内卷' AND id = '123';
*
**/
indexDB.deleteDataByCursor('myTable', { title: '无意义内卷',id:'123' })
.then(() => {
console.log('数据删除成功');
})
.catch((error) => {
console.log('删除数据时发生错误:', error);
});
updateDataByCursor
该方法用于通过游标更新符合条件的数据。
| 参数 | 类型 | 描述 |
|---|---|---|
| tableName | string | 表名 |
| condition | object | 更新的条件对象 |
| updateData | object | 更新的数据对象 |
/**
*如果更改的数据字段中有主键 例如这个表中的主键是id。那你的id 不能跟被的数据重复
它类似于s q l中的
UPDATE myTable SET title = '我要加油', id = '1231231' WHERE title = '无意义内卷' AND id = '123';
**/
indexDB.updateDataByCursor('myTable', { title: '无意义内卷',id:'123' }, { title: '我要加油',id:'1231231' })
.then(() => {
console.log('数据更新成功');
})
.catch((error) => {
console.log('更新数据时发生错误:', error);
});
queryDataByCursor
该方法用于通过游标查询符合条件的数据。
| 参数 | 类型 | 描述 |
|---|---|---|
| tableName | string | 表名 |
| condition | object | 查询的条件对象 |
/**
根据表中多个字段查询数据 ;查询title = '无意义内卷'并且id = '123' 的数据
它类似于s q l中的
SELECT * FROM myTable WHERE title = '无意义内卷' AND id = '123';
**/
indexDB.queryDataByCursor('myTable', { age: 30 })
.then((results) => {
console.log('查询到的数据:', results);
})
.catch((error) => {
console.log('查询数据时发生错误:', error);
});
clearTable(tableName)
| 参数 | 类型 | 描述 |
|---|---|---|
| tableName | string | 表名 |
indexDB.clearTable('myTable');
deleteDatabase()
删除数据库。
indexDB.deleteDatabase();
关注微信公众号: 阿勇学前端
关注抖音: 阿勇学前端
个人搭建chatGpt网站 ayongnice.love/chatgpt/
每天分享前端有趣的技术