|
MariaDB实际上是MySQL的兼容分支, 下面的代码都可以支持。
mysql.client使用MariaDB提供的客户端组件(已内嵌在支持库中)
- import console;
- import mysql.client;
- console.showLoading(" 正在连接测试数据库" )
- var dbClient,err = mysql.client(
- server = "db4free.net"; //数据库服务器,可省略默认为localhost
- uid = "aardio_mysql";//用户名,可省略默认为root
- pwd = "aardio.com";
- );
- if(!dbClient){
- console.log("如果是有人无聊修改了密码,请自行到db4free.net申请免费数据库")
- return console.logPause(err);
- }
- //选择数据库
- dbClient.selectDb("aardio_mysql")
- //查询数据并返回记录集
- var result = dbClient.stepQuery("select version()");
- console.dump(result)
- /*
- dbClient.query(sql,...) 等所有需要格式化SQL语句的函数,
- 内部都是调用 dbClient.format(sql,...) 函数转换 SQL 语句。
- 如果SQL参数后面的格式化参数是一个数组,SQL中的占位符请使用?或??,
- 如果格式化参数是非数组的表参数,SQL中的占位符请使用@开头的命名参数。
- 如果格式化参数不是表,则调用 string.format(sql,...) 格式化。
- dbClient.format()对于数值和布尔值不作转换,
- 字符串会进行安全转义处理(可避免SQL非法注入),buffer会转换为16进制编码。
- 如果参数值是数组则展开为列表,例如 'a','b',
- 如果是嵌套数组则展开为分组列表, 例如('a','b'),('c','d')
- 如果参数值是命名表对象(非数组),则格式化为SQL键值对(键调用dbMysql.escapeId 函数格式化 )。
- */
- //为避免有人乱改测试数据库表结构又没有删除,先删除旧的表
- dbClient.query("DROP TABLE IF EXISTS ??",{library});
- //上面的SQL会格式化为 "DROP TABLE IF EXISTS `library`"
- //执行SQL语句,注意mysql表名、字段名可包含于反引号内(用键盘左上角ESC下方的按键内)
- var ret,err = dbClient.query("CREATE TABLE IF NOT EXISTS `library` (
- `id` int NOT NULL AUTO_INCREMENT,
- `name` VARCHAR(100) NOT NULL,
- `auditing` TINYINT(1) DEFAULT '0',
- `bytes` BLOB,
- `time` DATETIME DEFAULT CURRENT_TIMESTAMP,
- PRIMARY KEY (`id`),
- UNIQUE KEY `id` (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;");
- console.dump(ret,err)
- var dbTable,err = dbClient.listTables()
- for tbl in dbTable.each(){
- console.log("发现数据表:",tbl);
- }
-
- var ret,err = dbClient.query("INSERT `library` VALUES(null,'测试',@num,@str,@time)",{
- num = 123;
- str = raw.buffer("测试:'这是字符串!'命名参数可以自动处理字符串转义");
- time = time();
- } )
- console.dump(ret)
- //如果是占位符对应的格式化参数是嵌套数组则展开为分组列表, 例如('a','b'),('c','d')
- var ret,err = dbClient.query("INSERT `library`(`name`,`auditing`,`bytes`,`time`) VALUES ?",{ {
- {'嵌套数组1',123,"测试xx",time()}
- {'嵌套数组2',123,raw.buffer("测试xxx2"),time()}
- } } )
- console.dump(ret,err);
- var ret,err = dbClient.query("INSERT `library`(`name`,`auditing`,`bytes`,`time`) VALUES('测试2',@num,@str,@time)",{
- num = 123;
- str = "测试2";
- time = time().addday(-2);
- } )
- console.dump(ret,err);
- //如果格式化参数值是数组则展开为列表,例如 'a','b',示例如下:
- dbClient.query("DELETE FROM `library` WHERE `name` IN (?)",{{'嵌套数组1','嵌套数组2'}})
- //查询数据并返回记录集
- var result = dbClient.query("SELECT * FROM `library` WHERE time >=@time",{
- time = tostring(time().addday(-3),"%Y/%m/%d")
- });
- for name,auditing,bytes in result.each(){
- console.log("输出", name,auditing,bytes ); //逐行输出所有记录
- }
- //查询数据并返回全部记录集到一个表
- var result = dbClient.query("SELECT * FROM `library` WHERE time >= (
- SELECT DATE(`time`) FROM `library` ORDER BY `time` DESC LIMIT 0,1
- )");
- console.dumpJson(result.getTable())
- //创建存储过程
- var ret,err = dbClient.query("
- CREATE PROCEDURE demo(IN n int)
- BEGIN
- SET n=123;
- SELECT n;
- END;
- ")
- //调用存储过程
- var ret,err = dbClient.getTable("CALL demo(@n)",{
- n=123 //传入命名参数
- });
- console.dump(ret);
- //移除存储过程
- console.dump( dbClient.query("DROP PROCEDURE IF EXISTS `demo`") );
- //移除数据库
- dbClient.query("DROP TABLE IF EXISTS `library`");
- console.pause();
复制代码 mysql.client 连接数据库的参数参考了sqlServer连接参数的用法,
用sever参数指定数据库服务器、用uid指定数据库用户名、pwd指定用户密码,而可选的参数database可用于指定数据库
注意MySQL用重音号`包含表名(重音号也就是键盘左上角波浪号下面的符号, 英文 backquote,有些人叫反勾号、反引号、倒引号、后引号等等比较乱) , mysql 与 sqlite 一样都支持比较好用的limit语句、replace into语句(MSSQL都不支持 ), sqlite也可以使用重音号`包含表名。参考帖子 MSSQL,MySQL 语法区别,
|
|