【库】table表转内存数据库操作

光庆 6月前 1832

请下载最新版,已升级支持多线程访问同一数据库。

import console; 
import godking.tableToDB

// 构造一个数据表
var tab = {fields={"姓名","年龄"}}
for(i=1;10;1){
    table.push(tab,{姓名='员工'++i;年龄=math.random(1,100)})
}
//创建内存数据库
var db = godking.tableToDB(tab,,"table");
var t = db.getTable("select * from [table] where 年龄>50 order by 年龄,姓名");
console.dump("界面线程访问的数据:",'\n',t,'\n')
//传入线程中进行访问
thread.invokeAndWait(
	function(db){
		import godking.tableToDB
		db = godking.tableToDB(db);
		var t = db.getTable("select * from [table] where 年龄>50 order by 年龄,姓名");
		import console
		console.dump("工作线程访问的数据:",'\n',t,'\n');
		db.insert({{姓名='光庆';年龄=18}});
	},db
)
//返回界面线程进行访问
var t = db.getTable("select * from [table] where 年龄=18");
console.dump("界面线程访问工作线程中插入的数据:",'\n',t,'\n')

//创建另外一个内存数据库,多个数据库并存,数据独立。
var tab = {fields={"姓名","年龄"}}
for(i=1;10;1){
    table.push(tab,{姓名='新员工'++i;年龄=math.random(10,20)})
}
var db1 = godking.tableToDB(tab,,"table");
var t = db1.getTable("select * from [table] order by 年龄,姓名");
console.dump("另外一个新的数据库:",'\n',t,'\n')

db.close();
db1.close();
console.pause(true);

各种table转内存数据库的方法
import console; 
import godking.tableToDB

// ============================================================
// 构造一个字典表
// ============================================================

// 创建方法1:直接指定字段表。
var 字段表 = {"姓名","年龄"};
var 字典型数据表,数组型数据表 = {},{};
for(i=1;5;1){
    table.push(字典型数据表,{姓名='字典员工'++i;年龄=math.random(1,100)})
    table.push(数组型数据表,{'数组员工'++i;math.random(1,100)})
}
var db = godking.tableToDB(,字段表,); //直接指定字段表。
db.insert(字典型数据表); // 支持插入字典型数据表,数据表中可不包含字段表。
db.insert(数组型数据表); // 支持插入数组型数据表。
console.dump(db.getTable())
db.close();

// 创建方法2:通过字典型数据表的fields成员指定字段表。
var 字典型数据表,数组型数据表 = {},{};
for(i=1;5;1){
    table.push(字典型数据表,{姓名='字典员工'++i;年龄=math.random(1,100)})
    table.push(数组型数据表,{'数组员工'++i;math.random(1,100)})
}
字典型数据表.fields = {"姓名","年龄"};
var db = godking.tableToDB(字典型数据表,,); //通过数据表指定。
db.insert(字典型数据表); // 支持插入字典型数据表,数据表中可不包含字段表。
db.insert(数组型数据表); // 支持插入数组型数据表。
console.dump(db.getTable())
db.close();

// 创建方法3:通过数组型数据表的fields成员指定字段表。
var 字典型数据表,数组型数据表 = {},{};
for(i=1;5;1){
    table.push(字典型数据表,{姓名='字典员工'++i;年龄=math.random(1,100)})
    table.push(数组型数据表,{'数组员工'++i;math.random(1,100)})
}
数组型数据表.fields = {"姓名","年龄"};
var db = godking.tableToDB(数组型数据表,,); //通过数据表指定。
db.insert(字典型数据表); // 支持插入字典型数据表,数据表中可不包含字段表。
db.insert(数组型数据表); // 支持插入数组型数据表。
console.dump(db.getTable())
db.close();

// 创建方法4:通过字典型数据表成员1的keys获取。
var 字典型数据表,数组型数据表 = {},{};
for(i=1;5;1){
    table.push(字典型数据表,{姓名='字典员工'++i;年龄=math.random(1,100)})
    table.push(数组型数据表,{'数组员工'++i;math.random(1,100)})
}
var db = godking.tableToDB(字典型数据表,,); 
// 将字典型数据表的成员1的keys设置为字段表,此时字段表已被aardio进行排序。
// 因为字段顺序并非设计时指定,所以不建议在这种情况下插入数组型数据表,以免数据错乱。
db.insert(字典型数据表); // 支持插入字典型数据表,数据表中可不包含字段表。
console.dump(db.getTable())
db.close();


// ============================================================
// 构造一个数组表
// ============================================================

// 创建方法1:通过数组型数据表的成员1的成员数量,自动生成"Fn"格式的字段表。
var 字典型数据表,数组型数据表 = {},{};
for(i=1;5;1){
    table.push(字典型数据表,{F1='字典员工'++i;F2=math.random(1,100)})
    table.push(数组型数据表,{'数组员工'++i;math.random(1,100)})
}
var db = godking.tableToDB(数组型数据表,,);
db.insert(字典型数据表); // 支持插入字典型数据表,但此时字段必须为"Fn"格式。
db.insert(数组型数据表); // 支持插入数组型数据表。
console.dump(db.getTable())
db.close();

// 创建方法2:通过指定字段数量,自动生成"Fn"格式的字段表。
var 字典型数据表,数组型数据表 = {},{};
for(i=1;5;1){
    table.push(字典型数据表,{F1='字典员工'++i;F2=math.random(1,100)})
    table.push(数组型数据表,{'数组员工'++i;math.random(1,100)})
}
var db = godking.tableToDB(,2,); //指定字段数量。
db.insert(字典型数据表); // 支持插入字典型数据表,但此时字段必须为"Fn"格式。
db.insert(数组型数据表); // 支持插入数组型数据表。
console.dump(db.getTable())
db.close();

console.pause(true);


最新回复 (14)
  • playboyeve 6月前
    0 2
  • grok 6月前
    0 3
    妥妥的服了。。
  • 小光芒 6月前
    0 4
    简化版linQ是吧
  • netfox 6月前
    0 5
    此楼层已删除
  • 光庆 6月前
    1 6
    netfox 已经用上了

  • Xmzzz 5月前
    0 7

  • Xmzzz 4月前
    0 8

    楼主有没有考虑更新支持多线程呢?使用发现 tableToDB 没支持多线程读,所以使用过程中修改了库中的其中一行

     this.db = ..sqlite("file:memdb1?mode=memory&cache=shared");

    然后再多线程时候通过

    import sqlite;
    var newConn = sqlite("file:memdb1?mode=memory&cache=shared");
    var sfmt = "xxxx"
    newConn.exec(sfmt);

    读取库。在处理大量匹配请求时候,多线程是首选。上面只是初步支持抛砖引玉,封装的时候可以考虑更多

  • daiweisc 4月前
    0 9
    牛,学习
  • 光庆 4月前
    0 10
    Xmzzz 楼主有没有考虑更新支持多线程呢?使用发现 tableToDB 没支持多线程读,所以使用过程中修改了库中的其中一行 this.db = ..sqli ...
    已更新,谢谢建议。
  • Xmzzz 4月前
    0 11

    V5

  • Xmzzz 4月前
    0 12
     界面线程访问的数据:
            {
    [1]={年龄=62;姓名="员工8"};
    fields={[1]="姓名";[2]="年龄"}
    }table: 042DF2E8
    
    
    thread id:8288
    thread error:文件:...nstall\aardio\lib\godking\tableToDB.aardio
    错误行号:#48
    错误:
    table [table] already exists
    SQL错误或数据库不存在(SQLITE_ERROR)
    ---------------------------------------------------
    调用栈:
            [kernel]: in function 'error'
            D:\Install\aardio\lib\sqlite\base.aardio:542: in function 'checkResult'
            D:\Install\aardio\lib\sqlite\base.aardio:141: in function 'exec'
            ...nstall\aardio\lib\godking\tableToDB.aardio:49: in function 'tableToDB'
            [string "import console; ..."]:16: in function 'func'
            ...:\Install\aardio\lib\preload\thread.aardio:308: in function <...:\Install\aardio\lib\preload\thread.aardio:306>界面线程访问工作线程中插入的数据:
            {
    [1]={年龄=18;姓名="员工2"};
    fields={[1]="姓名";[2]="年龄"}
    }table: 0429F2C0
    
    另外一个新的数据库:
            {
    [1]={年龄=11;姓名="新员工1"};
    [2]={年龄=11;姓名="新员工4"};
    [3]={年龄=11;姓名="新员工6"};
    [4]={年龄=11;姓名="新员工9"};
    [5]={年龄=13;姓名="新员工5"};
    [6]={年龄=16;姓名="新员工7"};
    [7]={年龄=18;姓名="新员工10"};
    [8]={年龄=19;姓名="新员工3"};
    [9]={年龄=19;姓名="新员工8"};
    [10]={年龄=20;姓名="新员工2"};
    fields={[1]="姓名";[2]="年龄"}
    }table: 0429D4E8
    
    请按任意键继续 ...

    运行示例报错了。库的代码逻辑应该是分支没走对。

    我删除了库重新更新还是这样报错。

    我猜代码行可能是这样的

     if tvs[["_DBID"]] { // 克隆相同内存访问权限的共享数据库

    这么跑示例就没错了。

  • 光庆 4月前
    0 13
    Xmzzz &nbsp;界面线程访问的数据: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs ...
    已修复,谢谢
  • 瞌睡蟲子 4月前
    0 14

    参数1不传fields的话,查出来数据不对

  • 光庆 4月前
    0 15
    瞌睡蟲子 参数1不传fields的话,查出来数据不对

    是的,不传就认为是数组。已经优化升级,请下载新版本测试。

返回