一、不加密数据库

sqlite数据库的使用步骤

1、引入sqlite

import sqlite;

2、创建数据库

var db = sqlite("/intro1.db");

在项目根目录下

3、创建表

if( not db.existsTable("工作日志表") 
    db.exec( "CREATE TABLE [工作日志表]( 姓名,工作地点,时间);" );
}  

创建表的同时创建主键

if( not db.existsTable("tableName2") ){ 
    
    //创建单主键表 
    db.exec( "CREATE TABLE tableName(title PRIMARY KEY, length, tm);" ) 
    
    //创建双主键表
    db.exec( "CREATE TABLE tableName2(title,length,tm,  constraint pk_tableName2 PRIMARY KEY (title,length) );") 
}

4、创建预处理命令

var cmd = db.prepare("INSERT INTO [工作日志表] VALUES ( @姓名,@工作地点,@时间 );")

或者

var cmd = db.prepare("REPLACE INTO film VALUES (@title,@length,@year, 'Jodie Foster');" ) 

replace into是insert into的增强版。在向表中插入数据时,我们经常会遇到这样的情况:1、首先判断数据是否存在;2、如果不存在,则插入;3、如果存在,则更新。

MySQL 中如何实现这样的逻辑呢?MySQL 中有更简单的方法: replace into

replace into t(id, update_time) values(1, now());
或
replace into t(id, update_time) select 1, now();

插入多条

db.exec( "REPLACE INTO tableName2 VALUES @values;",{
    values  = {
        { 'Contact', 32, time.now() },
        { 'Contact', 16, time.now() }
    }
}) 

REPLACE INTO 必须要设置所有无默认值字段的值,如果要在插入冲突时修改部分字段,请用下面的方法

db.exec("
    INSERT OR IGNORE INTO tableName (title,length,tm) VALUES (@title,@length,@tm);  
    UPDATE tableName SET tm=@tm WHERE title=@title",{
        title = 'Silence of the Lambs, The';
        length = 123;
        tm = "456"
    } ) 

获取字段名 

var cmd = db.prepare("SELECT * FROM [film] ") 
var columns = cmd.getColumns();    
//显示所有字段名
console.dump(columns);

//获取全部数据表
var dataTable = cmd.getTable();
//这样也可以取到所有字段名
console.dump(dataTable.fields);

释放预处理命令对象 

cmd.finalize();

5、插入数据

cmd.step( {
    姓名 = "小王";
    工作地点 = "上海";
    时间 = time.now();
} );

函数唯一的表参数首尾的 { } 可以省略

cmd.step(
     title = "标题11111";
    length = 4;
    year = time.now();    
)

//上面的代码等价于下面的代码
cmd.reset();
cmd.bind.parameterAtNames( 
    ["title"] = "标题";
    ["length"] = 4;
    ["year"] = time.now();
);
cmd.step();

6、查询一条数据

var result  = db.stepQuery("SELECT * FROM [工作日志表] WHERE ??",{ {
        姓名 = mainForm.editUser.text; 
    } } )

查询多条请改用 db.each() 或者 db.getTable() 函数

查询并遍历查询结果

for rowid,title, length, year, starring in db.each("SELECT rowid,* FROM film") {
    /*
    for 语句的第一个返回值如果为 null 就会退出循环,
    如果数据库返回的第一个字段可能为空,那么可以把 SQLite 默认就有的索引字段 rowid 放在最前面
    */
    console.log( rowid,title, length, year, starring  ) 
}

SQLite 默认就有的索引字段 rowid。

也可以用 getTable 一次取出所有的数据

var dataTable = db.getTable("SELECT rowid,number,text FROM [each-tab]")

然后遍历

for i,v in table.eachIndex(dataTable){
    //应当使用专门用于遍历数组的 table.eachIndex 创建迭代器
    winform.edit.print(v.rowid,v.number,v.text)
}

7、删除语句

db.exec("DELETE FROM ?? WHERE title=?;",{ "film","要删除的标题"} )

8、修改语句

db.exec("UPDATE film SET title = @title,length=@length WHERE title = @oldTitle;",{
    title = "新的标题123";
    length = #"新的标题";
    oldTitle = "标题";
} );

 

9、删除表

db.exec("DROP TABLE film" );

 

示例代码:

import win.ui;
/*DSG{{*/
mainForm = win.form(text="test1";right=757;bottom=467)
mainForm.add(
button={cls="button";text="查询";left=297;top=7;right=396;bottom=42;z=2};
editResult={cls="edit";left=12;top=61;right=400;bottom=491;edge=1;multiline=1;z=3};
editUser={cls="edit";text="小王";left=14;top=11;right=282;bottom=40;edge=1;multiline=1;z=1}
)
/*}}*/


import sqlite;
var db = sqlite("/intro1.db");//打开数据库连接,参数指定硬盘文件路径
//创建数据表
if( not db.existsTable("工作日志表") /*是否已存在指定的表*/ ) {  
    /*
    sqlite 可以象 MSSQL 那样将表名等标识符放在方括号里(避免表名是保留字等),
    也可以将 MYSQL 那样将表示放在反引号里(键盘左上角波浪线下面的符号),
    也可以按 ANSI SQL 约定放在双引号里,更可以放在单引号里。
    
    SQL里面一般应当用单引号包含字符串( 各种数据库都支持的标准写法 )
    双引号在 ANSI SQL 中规定用来包含表名 - 一个容易让人误解的规定,所以 MSSQL 用了中括号,而 MYSQL 用了反引号。
    */
    db.exec( "CREATE TABLE [工作日志表]( 姓名,工作地点,时间);" );
}  

//创建预处理命令,用 @ 字符作为 SQL 命名参数的前缀
var cmd = db.prepare("INSERT INTO [工作日志表] VALUES ( @姓名,@工作地点,@时间 );")

//执行命令语句,插入测试数据,并指定 SQL 命名参数
cmd.step(
    姓名 = "小张";
    工作地点 = "北京";
    时间 = time.now();
); 

//插入测试数据,函数唯一的表参数首尾的 { } 可以省略
cmd.step( {
    姓名 = "小王";
    工作地点 = "上海";
    时间 = time.now();
} );

cmd.step( {
    姓名 = "小周";
    工作地点 = "武汉";
    时间 = time.now();
} );
cmd.step( {
    姓名 = "小徐";
    工作地点 = "武汉";
    时间 = time.now();
} );

//响应按钮事件
mainForm.button.oncommand = function(id,event){
    
    //查询一条数据,查询多条请改用 db.each() 或者 db.getTable() 函数
    var result  = db.stepQuery("SELECT * FROM [工作日志表] WHERE ??",{ {
        姓名 = mainForm.editUser.text; 
    } } )
    /* 
    SQL语句中 @ 字符开始的命名参数使用参数表的名值对元素格式化,
    SQL语句中 ? 或 ?? 占位符使用参数表的数组元素格式化, 
    
    其中 ?? 格式化为标识符,其他占位符格式化为参数值。
    ??占位符用于格式化的参数如果是一个表,表中的键值对以 AND 为分隔符,并将数组值转换为IN语句。
    */

    if(result){
        mainForm.editResult.print( result.姓名 );
        mainForm.editResult.print( result.工作地点 );
        mainForm.editResult.print( result.时间 );
    }
}

mainForm.show();
return win.loopMessage();

二、加密数据库

1、引入加密数据库

import sqlite.aes128

2、打开加密数据库

var sqlConnection = sqlite.aes128("/dbAes128.db","输入密钥") 

3、创建表 

if( not sqlConnection.existsTable("film") ){  
    sqlConnection.exec( "CREATE TABLE film(title, length, year, starring);")  
}  

4、创建预处理命令

var cmd = sqlConnection.prepare("INSERT INTO film values (@title,@length,@year, 'Jodie Foster');" )

5、插入数据

cmd.step( {
    "title":"标题";
    "length":4;
    "year":time.now();
} );

释放

cmd.finalize();

6、查询并遍历

for title, length, year, starring in sqlConnection.each("SELECT * FROM film") {
    console.log( title, length, year, starring  ) 
}

三、使用navicat查看数据库

打开navicat,点击连接,选择sqlite

点击“数据库文件”最右侧的...,找到数据库文件

点击确定,就可以看到数据库。

 

posted on 2023-06-14 14:37  周文豪  阅读(941)  评论(3编辑  收藏  举报