一、不加密数据库
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
点击“数据库文件”最右侧的...,找到数据库文件
点击确定,就可以看到数据库。