用户:
Nomen查看:1189 回复:22 评论:50 创建时间:2023-05-08T08:42:50
大好我Nomen,为了扩充我的Box3-Tools仓库,突然想到Nomen SQL有着如此多的缺陷:体积冗大,效率低下,难以理解,不利于开发和二次开发,(才不是懒得写),所以我在此基础上(实际上是重写)写了一个Nomen SQL二代,即NomenSQLite
NomenSQLite由class管理,有着容易理解的API和一定的可扩展范围,最重要的是
它有着创新的协同管理系统,在节省资源的同时实现了多表格同时管理,互相不受到污染,并且快速启动,只需要简单的写一个对象,即可快速管理表格的结构,非常利于二次开发
这意味着所有的操作都超级方便!萌新也能理解!!
本体只有约90行,十分轻量
class NomenSQLite {
constructor() {
if (NomenSQLite.instance) return NomenSQLite.instance;
NomenSQLite.instance = this;
}
static launched = false;
static async launch(config, action, callback) {
if (!config) throw new Error('请传入配置参数后重试');
if (!this.instance) this.instance = new NomenSQLite();
else return this.instance;
this.tables = config || {};
this._data = {};
if (!Object.keys(this.tables).length) this._data = null;
Object.keys(this.tables).forEach(v => {
if (Array.isArray(this.tables[v]) && this.tables[v].length) {
this._data[v] = [];
this.tables[v].forEach(r => {
if (typeof r.name == "string" && Object.values(this.DataType).includes(r.type)) {
this._data[v].push({ name: r.name, type: r.type, notnull: r.notnull || false });
}
})
}
})
console.log(JSON.stringify(this._data));
if (!Object.keys(this._data).length) return this.instance;
let errMessage = null;
if (typeof action == "string" && action.includes('create')) {
for (let i = 0; i < Object.keys(this._data).length; i++) {
let eString = `CREATE TABLE IF NOT EXISTS "${Object.keys(this._data)[i]}"
(${this._data[Object.keys(this._data)[i]].reduce((p, c) => {
let str = `"${c.name}" ${c.type} ${c.notnull ? 'NOT NULL' : ''}`;
return p ? p.concat(',', str) : str;
}, false)})`;
try { await this.instance._exec(eString); } catch (err) {
errMessage.concat(err);
}
}
}
this.launched = true;
if (typeof callback == "function") callback(null, errMessage);
return this.instance;
}
_exec(cmd) {
return (typeof cmd == 'string') ? db.sql([cmd]) : new Promise(resolve => resolve(new TypeError('传入参数有误,预期应该为string')))
}
getAllTables() {
return Object.keys(NomenSQLite._data);
}
async getAllTablesInDatabase() {
return (await this._exec(`SELECT * FROM sqlite_master`)).map(v => v.name)
}
operate(name) {
let t = this;
if (typeof name == "string" && NomenSQLite.launched) return {
select(column, value) {
return t._exec(`SELECT * FROM "${name}" ${column == "*" ? `` : (`WHERE "${column}" = ` + `"${value}"`)}`)
},
remove(column, value) {
return t._exec(`DELETE FROM "${name}" ${column == "*" ? `` : (`WHERE "${column}" = ` + `"${value}"`)}`)
},
insert(value) {
if (Object.prototype.toString.call(value) == '[object Object]' && Object.keys(value).length) {
let eString = `(${Object.keys(value).map(v => `"${v}"`).join(',')}) VALUES(${Object.values(value).map(v => `"${v}"`).join(',')})`;
return t._exec(`INSERT INTO "${name}" ${eString}`);
} else return null;
},
update(column, value) {
if (Object.prototype.toString.call(value) == '[object Object]' && Object.keys(value).length && typeof column == "string" && column.includes('=')) {
let eArr = [];
Object.entries(value).forEach(([k, v]) => eArr.push(`"${k}" = "${v}"`));
let aString = `${column == "*" ? "" : 'WHERE "' + column.split('=')[0] + '"="' + column.split('=')[1] + '"'}`;
console.log(`UPDATE "${name}" SET ${eArr} ${aString}`)
return t._exec(`UPDATE "${name}" SET ${eArr} ${aString}`);
} else return null;
}
}
return {};
}
static instance = null;
static LaunchAction = {
CREATE_OR_LAUNCH: 'createlaunch',
LAUNCH: 'launch'
}
static DataType = {
NUMBER: 'INTEGER',
FLOAT: 'REAL',
TEXT: 'TEXT',
NULL: 'NULL',
BLOB: 'BLOB'
}
}
附有一段示例代码
const tablesData = {
'Nomenawa': [ // 表格名字-数据[]
{ name: 'coin', type: NomenSQLite.DataType.NUMBER, notnull: true }, // 一个数据,名字为coin,类型为NUMBER,不得为null
{ name: 'bag', type: NomenSQLite.DataType.TEXT, notnull: false }
],
'Nomenawa2': [ // 可以是第二个表格
{ name: 'coin2', type: NomenSQLite.DataType.NUMBER, notnull: true },
{ name: 'bag2', type: NomenSQLite.DataType.TEXT, notnull: false }
], // 这意味着你可以无限创建更多的表格!并且有着超级高的自由度
};
(async () => {
let Nomen = await NomenSQLite.launch(tablesData, // 容易理解和修改的表格数据结构,传入一个对象
NomenSQLite.LaunchAction.CREATE_OR_LAUNCH, // 启动的方式,CREATE_OR_LAUNCH意思是启动的时候初始化表格,LAUNCH表示仅启动
(value, error) => { console.log(error) } // 一个callback,如果出现错误就会从第二个参数传出来
);
let NomenTable = Nomen.operate('Nomenawa'); // 初始化Nomenawa这个表格的管理器
await NomenTable.insert({ coin: 18, bag: 'a bag!3' }); // 插入一个键-值对对象作为数据
await NomenTable.update('coin=18', { bag: 'a bag!114' }) // 更新这个数据,第一个参数需要是一个字符串
console.log(JSON.stringify(await NomenTable.select('coin',18))) // 获取coin为18的数据
console.log(JSON.stringify(await NomenTable.select('*'))) // 获取该表格中所有的数据
await NomenTable.remove('coin', 18) // 删除coin为18的所有数据
console.log(Nomen.getAllTables()) // 获取所有受到管理的表格
console.log(await Nomen.getAllTablesInDatabase()) // 获取数据库中所有的表格(即使它不受到NomenSQLite管理)
let Nomenawa2 = Nomen.operate('Nomenawa2'); // 更多的表格,更多的操作,即刻开始你的数据便捷开发之旅!
})()
赶紧开始你的SQL开发之旅吧!
------------------
Box3-Tools正在征集有意义、有参考价值的代码与片段!加入Nomen小队,获得大佬的帮助或帮助他人!
神岛吉吉喵
点赞2
评论
光速大师球
没找到(阿吉会0.000000000001秒瞬移)
找=抓
看看:https://shequ.codemao.cn/community/539795
tql,如果需要的话可以直接发在仓库上做github page搞成网站
发了呀:)
超光速大师球
失敗
𝙲ℴ𝗌𝔦𝒹ₑ𝑟我一直好奇为什么要用class()明明不需要实例sql啊()一个object充当一个模块不好吗( )
点赞0
评论
懂了()代码习惯
为了方便管理,而且为了单例化,而且有一个单向的启动过程,无法被跳过,在代码中这个类被实例化过,可以找一下
就是不允许用new复制一个?(草()
因为数据库启动是一个单向的过程,防止你们乱用或根本不启动
邢()
给个寻路代码吧(滑跪ing)
点赞0
评论
有道理,我会发在Box3-Tools上的
发了,可以直接去看src/模板代码/3D寻路/index.js
哪里看(?)
发个帖子行吗(雾)
https://github.com/helloyork/Box3-Tools/blob/main/src/%E6%A8%A1%E6%9D%BF%E4%BB%A3%E7%A0%81/3D%E5%AF%BB%E8%B7%AF/index.js
github.com/helloyork/Box3-Tools/blob/main/src/模板代码/3D寻路/index.js
烟魂你先不要加太多啊awa我都奔溃了...
我都写了5761行代码嘤嘤嘤
点赞0
评论
pull到这里:https://github.com/helloyork/Box3-Tools;我正在为你准备一个github page作为网站
github.com/helloyork/Box3-Tools
烟魂好了嘛庫???
点赞0
评论
好了,稍微改了改,现在只有256行了,省去了维护的麻烦,你可以去box3-tools.rth1.me这里来看网站
原来五六千行太冗大了,并且不利于维护,所以采用了异步加载模式,从仓库内获取仓库结构.json,然后根据结构创建分区,然后在分区内从仓库异步加载每个模块的代码就行
顺便改了一下样式,这下你不介意我把我的名字加到网站的贡献列表里了吧
嗯……加了个代码高亮,看起来不错
只是想问一下,你要加入Nomen小队吗?
可以吧...
q:2418207411
我没Q啊
莫得办法
许久未见,甚是想念。可爱的Nomen,近来可好?
点赞3
评论
许久未见,别来无恙。亲爱的fc,我过的很好,你呢?
临近中考,百感交织,早已是常态。但仍然很高兴,你能够以一个全新的身份再次出现在我的视野中。
若尝感叹,昨日乐土,今日浮聚,愿在此献薄力,卫生态。若能救社区于沉浮之中,自是感慨。但,可惜,可惜。
文学性仍如此之高(
怎奈我精力大不如前,且迫于学业,未能做出些许贡献,甚是可惜,只好自叹无能罢了。
有文化)文化人
大佬这个怎么解决:https://shequ.codemao.cn/community/548352
Nomen神奇的引路人:
【萌新向:妈妈再也不用担心我不会写SQL辣】https://shequ.codemao.cn/community/539624
【 NomenSQLitePro1.0:表格字段自动更新 - 为开发者提供的便捷调试工具】https://shequ.codemao.cn/community/539869
【 NomenPostgre-Base:神岛首个PG数据库动态多表格轻量级便携式管理器】https://shequ.codemao.cn/community/539700点赞1
评论
有没有Kook
你就加这个吧:) 在线的:) 链接:https://kook.top/K46ecW
kook.top/K46ecW
谢谢