# aardio 范例: sqlite 库 - 存取表对象



```aardio
//sqlite 库 - 存取表对象
import sqlite
import console;
 
//创建测试数据库
var db = sqlite("/tableParameter.db")
if( not db.existsTable("dataTable") ) {
	db.exec( "CREATE TABLE dataTable( name TEXT PRIMARY KEY,info BLOB);" );//指定 name 字段为主键 
}  
 
//用 REPLACE 语句添加数据,如果存在相同主键数据则覆盖
var cmd = db.prepare("REPLACE INTO [dataTable] VALUES ( @name,@info );")

/*
注意在 sqlite.format() 函数中，参数如果是表通常会被格式化为 SQL 语句。
而在预处理命令中，一个参数值如果是表对象，aardio 会直接将其作为 aardio 表存储到 SQLite。

下面执行批处理命令，利用 @info 参数值存入了一个 aardio 表对象。
*/
cmd.step( 
	name = "相同名称"; 
	info = {
		a = 123;
		b = {
			d = "测试";
		}
	}
);

cmd.step( 
	name = "不同名称"; 
	info = {
		a = 456;
		b = {
			d = "测试2";
		}
	}
);

cmd.step( 
	name = "_tostring"; 
	/*
	如果表对象定义了 _tostring 元方法则调用 tostring 转为字符串。
	时间对象则使用 "%Y-%m-%d %H:%M:%S" 格式化为字符串。
	*/
	info = time();
);


cmd.step( 
	name = "结构体"; 
	info = {
		//未定义 _tostring 元方法的静态结构体会被转换为二进制 buffer
		float array[3] = [1,2,3]
	}
);

/*
查询数据, prepare 的第二个参数如果是表，
表中的名值对会自动生成为 WHERE 条件语句,多个条件会使用 AND 连接。
*/
cmd.prepare("SELECT * FROM [dataTable] ",{
	name = "不同名称"; //可使用键值对指定查询条件
} )

//上面的代码实际会被解析为下面的代码
cmd.prepare("SELECT * FROM [dataTable] WHERE ??",{ {
	name = "不同名称"; //可使用键值对指定查询条件
} } )

console.log("自动生成的 SQL 语句",cmd.sql );
console.more();

var result = cmd.stepQuery(); //执行查询
console.dumpJson(result); //显示查询结果

cmd.finalize();//释放预处理语句
console.more();

//查询数据 返回所有符合条件的行记录数组
//----------------------------------------------- 
var dataTable = db.getTable("SELECT * FROM [dataTable] ")
console.dumpJson(dataTable);

//还原结构体
var structObject = raw.convert(dataTable[3].info,{
	flaot array[3]
})
console.log( structObject.structObject)

//----------------------------------------------- 
db.exec("DROP TABLE dataTable "); //删除表
db.close(); //关闭数据库

console.pause();
   

```

