aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 15303|回复: 3

备份sqlite内存数据库到文件

[复制链接]

42

主题

80

回帖

950

积分

荣誉会员

积分
950
发表于 2016-8-10 21:46:55 | 显示全部楼层 |阅读模式

  1. io.open()

  2. import sqlite
  3. namespace sqlite{
  4.         sqlite3_backup_init = _dll.api("sqlite3_backup_init","pointer(pointer pDest, STRING zDestName, pointer pSource, STRING zSourceName )" )
  5.         sqlite3_backup_step = _dll.api("sqlite3_backup_step","int(pointer sqlite3_backup, int)" )
  6.         sqlite3_backup_finish = _dll.api("sqlite3_backup_finish","int(pointer sqlite3_backup)" )
  7.        
  8.         //sqlite3_backup_remaining = _dll.api("sqlite3_backup_remaining","int(pointer sqlite3_backup)" )
  9.         //sqlite3_backup_pagecount= _dll.api("sqlite3_backup_pagecount","int(pointer sqlite3_backup)" )        
  10. }
  11. class memorySqlite{
  12.         ctor(){
  13.                 this = ..sqlite(":memory:")
  14.         };
  15.         backupToFile = function(path){
  16.                 var p = ..sqlite.sqlite3_backup_init( ..sqlite(path).db, "main" , this.db, "main"   )
  17.                 var ret = ..sqlite.sqlite3_backup_step(p,-1)
  18.                 assert( ret == 101, ..sqlite.err_message[ret])
  19.                 return ..sqlite.sqlite3_backup_finish(p) == 0;
  20.         }
  21. }

  22. // 生成内存数据库
  23. var db = memorySqlite();
  24. // 生成测试数据
  25. db.exec("CREATE TABLE user( username TEXT )");
  26. for(i=1;100;1){
  27.         db.exec("INSERT INTO user VALUES ( @username )",{
  28.                 username = tostring(i) ++ string.random(3);
  29.         })       
  30. }
  31. // 备份内存数据库
  32. db.backupToFile("\test.data")

  33. // 查看备份结果
  34. var dbTest = sqlite("\test.data")
  35. for rowid, username  in dbTest.each("SELECT rowid, * from [user]") {
  36.         io.print( rowid, username)
  37. }

  38. execute("pause")

复制代码

2

主题

34

回帖

452

积分

培训班

积分
452
发表于 2016-8-24 09:57:12 | 显示全部楼层
import sqlite
namespace sqlite{
}
在外面重写库名字空间也可以,学习了

170

主题

2184

回帖

1万

积分

管理员

积分
13236
发表于 2017-12-31 00:44:25 | 显示全部楼层
感谢cad提供的代码,
但是真要加到标准库,这几句代码是不行的。
我已经改了加到标准库里去了(代码在下面),然后还要逐个写函数文档。

单独为sqlite(":memory:") 写个类, 我觉得标准库就不要加这个了,
sqlite(":memory:") 这个编辑器可以自动完成的,经常输入一下多好,可以多学知识。
封装太多了,一换别的编程语言,什么知识都没有,全被开发工具学去了。

其实sqlite本来就是个内存数据库,如果是要搞个":memory:"最后又写到文件里,
有没有考虑直接用个数组什么的来处理呢?!数据库的目的是持久化,不用持久化就用不上他了
class backup{
   
ctor(src,dst,srcName,dstName){
        
if( type(dst) == type.string ) {
            
var err;
            dst,err = ..sqlite(dst)
            
if(!dst) return null,err;
            
            
this.freeDstDb = dst;
        };
        
if(!src[["db"]]) error("源数据库错误",2);
        
if(!dst[["db"]]) error("目的数据库错误",2);
        
        
this.handle = dll.sqlite3_backup_init(dst.db,dstName:"main",src.db,srcName:"main");
        
if(!this.handle ){
            
var msg,err = ..sqlite.lasterr(dst.db);
            
if(this.freeDstDb)this.freeDstDb.close();
            
return null,msg,err;
        }
        
        ..table.gc(
this,"finish");
    };
    step =
function(pages){
        
if(pages===null) pages = -1;
        
var err = dll.sqlite3_backup_step(this.handle,pages);
        
if( err ) {
            
if( err == ..sqlite.DONE ) this.finish();
            
else ..sqlite.checkResult(err);
        }
        
return err;
    };
    remaining =
function(){
        
return dll.sqlite3_backup_remaining(this.handle);
    };
    count =
function(){
        
return dll.sqlite3_backup_pagecount(this.handle);
    };
    eachStep =
function(n){
        
if(n===null) n = 1;
        
var count = this.count();
        
return function(){
            
if( 0 == this.step(n) ){
               
return this.remaining(),count;
            };
        }
    }
    finish =
function(){
        
if(this.handle){
            
var err = dll.sqlite3_backup_finish(this.handle,pages);
            
if( err ) ..sqlite.checkResult(err);
            
            
if(this.freeDstDb)this.freeDstDb.close();
            
this.handle = null;
            
return err;
        }
    }
   
}

170

主题

2184

回帖

1万

积分

管理员

积分
13236
发表于 2017-12-31 01:09:06 | 显示全部楼层
想了想,还是拿出这部分代码来,
创建了一个单独的库 sqlite.backup,用起来也不会太麻烦。
    import sqlite;
   
import console
   
   
var db = sqlite(":memory:");
    db.exec(
"CREATE TABLE user( id  INTEGER PRIMARY KEY )");
   
for(i=1;10) db.exec("INSERT INTO user VALUES (NULL)" )     
   
   
// 备份内存数据库
    import sqlite.backup;
   
var backup = sqlite.backup(db,"\backup.data")
    backup.step();
   
   
// 查看备份结果
    var dbTest = sqlite("\backup.data")
    console.dumpJson( dbTest.getTable(
"SELECT  * from [user]") )
    console.pause();
      

而且这个用法有一个好处,
源数据库,目标数据库可以随便换

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2024-4-15 04:04 , Processed in 0.059689 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2023 Tencent Cloud.

快速回复 返回顶部 返回列表