c
c -> c
ChainSQL的操作对象
a.使用前首先在package.json文件中引入"chainsql":"^0.6.5"; 然后执行npm install命令
b.直接执行npm install chainsql --save命令
Example: .
const ChainsqlAPI = require('chainsql').ChainsqlAPI;
const c = new ChainsqlAPI();
c -> c
ChainSQL的操作对象
a.使用前首先在package.json文件中引入"chainsql":"^0.6.5"; 然后执行npm install命令
b.直接执行npm install chainsql --save命令
Example: .
const ChainsqlAPI = require('chainsql').ChainsqlAPI;
const c = new ChainsqlAPI();
c.connect(url);
创建一个新的连接到ChainSQL节点;
如果无法建立连接,就会抛出ReqlDriverError;
Example: 连接指定的路径的主机。
c.connect("ws://192.168.0.162:6006");
c.as({"secret":"xxx","address": "xxx"});
提供操作者的身份;
Example:
c.as({"secret":"ssFw56mwiuVD43CJ81p4dsUXMAnJF","address": "r3p9EUN8hxnbNvCaqrrXY3QnN7ji8bPf5Y"});
c.use(address);
切换表的所有者(即后续操作的上下文),默认表的所有者为操作者;
Example:
c.use("r3p9EUN8hxnbNvCaqrrXY3QnN7ji8bsdf");
c.setRestrict(true/false);
设置是否使用严格模式,默认为非严格模式;在严格模式下,语句共识通过的条件是期望的快照HASH与预期一致
Example:
c.setRestrict(true);
c.submit() → promise
c.submit(options) → promise
c.submit(callback)
c.submit(options)相当于同步调用,可以通过options来指示操作执行的结果等于预期的值时才返回,查询操作带options参数时不起作用;options格式:{expect:"send_success"}或{expect:"validate_success"}或{expect:"db_success"}
示例一:
c.table("marvel").submit()
.then(function(result) {
console.log(result.status);
console.log(result.tx_hash);
}).catch(function(e) {
console.log(e.error);
console.log(e.tx_hash);
};
示例二:
c.table("marvel").submit({expect:"validate_success"});
示例三:
c.table("marvel").submit(function(err, result) {});
c.generateAddress();
创建用户,返回账户信息,包含secret:账户秘钥,account_id:账户地址,public_key:公钥;
c.pay(accountId,count).submit();
为创建的用户转账,新创建的用户在转账成功之后才能正常使用;其中accountId表示转账的用户地址,count转账金额,count最小值20;
Example: 给 accountId
等于 rBuLBiHmssAMHWQMnEN7nXQXaVj7vhAv6Q
的用户转账20.
c.pay("rBuLBiHmssAMHWQMnEN7nXQXaVj7vhAv6Q",20).submit();
c.createTable(tableName, raw, [options]).submit();
创建一个表。ChainSql表是一个JSON文档的集合;
tableName:所创建表名,
raw:创建表的字段名称必须为Json格式数据,例如:
"{'field':'id','type':'int','length':11,'PK':1,'NN':1,'UQ':1,'AI':1}",
"{'field':'name','type':'varchar','length':50,'default':null}",
"{'field':'age','type':'int'}"
options:为表指定其它的参数,目前支持如下参数:
confidential:true/false, 如果为true,表示该表是机密的,所有对该表的操作都是加密的,只有授权的用户才能解密查看
Example: 创建表 "dc_universe"
c.
createTable("dc_universe",[
{'field':'id','type':'int','length':11,'PK':1,'NN':1,'UQ':1,'AI':1},
{'field':'name','type':'varchar','length':50,'default':null},
{'field':'age','type':'int'}]).submit();
c.renameTable(tableName, NewTableName).submit();
修改数据库中表的名字,tableName:表名;NewTableName:新的表名,两个名字都不能为空;
Example: 将表"dc_universe"改为"dc_name".
c.renameTable("dc_universe","dc_name").submit();
c.dropTable(tableName).submit();
从数据库删除一个表。表和它的所有数据将被删除;
Example: 删除表 "dc_universe".
c.dropTable("dc_universe").submit();
c.table(tableName).insert(raw).submit();
向数据库中插入数据。raw类型必须是例子中的json格式的数据类型;
Example: 向表"posts"中插入一条记录.
c.table("posts").insert({name: 'peera',age: 22},{name: 'peerb',age: 21}).submit();
c.table(tableName).get(raw).update(raw).submit();
更新表中数据。如果get添加为空,则更新表中所有记录;其中raw为json格式字符串;
Example: 更新 id
等于 1
的记录.
c.table("posts").get({id: 1}).update({age:'52',name:'lisi'}).submit();
c.table(tableName).get(raw).delete().submit();
从表中删除对应条件的数据,如果get条件为空,则删除所有数据;
Example: 删除id
等于1
的记录.
c.table("comments").get({id: 1}).delete().submit();
c.table("comments").delete({id: 1}).submit();
c.table("comments").delete().submit();
c.table(tableName).get(raw).submit();
从数据库查询数据,后面可以进行其他操作,例如update、delete等;
Example: 查询name
等于aa
的记录.
c.table("posts").get({name: 'aa'}).submit();
c.table(tableName).get(raw).limit({index:0,total:10}).withFields([*]).submit();
对数据库进行分页查询.返回对应条件的数据;
Example: 查询name
等于aa
的前10条记录.
c.table("posts").get({name: 'aa'}).limit({index:0,total:10}).withFields([*]).submit();
c.table(tableName).get(raw).order([{id:1},{name:-1}]).withFields([*]).submit()
对查询的数据按指定字段进行排序;
Example: 按 id 升序,name 的降序排序
c.table("posts").get({name: 'aa'}).order({id:1},{name:-1}).withFields([*]).submit();
c.table(tableName).get(raw).withFields([field1,dield2,...]).submit();
从数据库查询数据,并返回指定字段,必须个get配合使用;
Example: 查询name
等于aa
的记录.
c.table("posts").get({name: 'aa'}).withFields(['name','age']).submit();
c.grant(tableName,user,rightInfo).submit();
向用户授予数据表操作权限;
tableName:授权的表名;
user:所要授权的账户地址;flags(array):所要授权的权限;
rightInfo为授权字符串,例如:{select: true, insert: true, update: true,delete:false};
用户权限有以下几种:Select、Insert、Update、Delete;
Example1: 向用户授予Insert、Delete
操作权限.
c.grant("Table", "rEtepyQeAEgBLqXCaFRwZPK1LHArQfdKYr","{insert:true,delete:true}").submit(SyncCond.validate_success);
Example1: 取消用户Insert、Delete
操作权限.
c.grant("Table", "rEtepyQeAEgBLqXCaFRwZPK1LHArQfdKYr","{insert:false,delete:false}").submit(SyncCond.validate_success);
c.beginTran();
事务开始;
在事务开始和结束之间的insert,update,delete,assert语句会包装在一个原子执行
在事务上下文中,不在支持单个语句的submit
c.table(tableName).get(jsonObj1).assert(jsonObj2);
事务中的断言操作,assert为true则继续,false则回滚事务;
jsonObj1:查询条件;
jsonObj2:断言表达;
Example: 判断id等于1的记录age是否等于52并且name等于lisi,如果是则继续,如果有一个条件不满足或记录不存在,则回滚事务
c.table("posts").get({id: 1}).assert({age:'52',name:'lisi'});
Example: 判断id等于1的记录集的行数是否等于1,如果是则继续,如果不是或表不存在,则回滚事务
c.table("posts").get({id: 1}).assert({$rowcount:'1'});
Example: 判断表posts是否存在,如果有则继续,如果不存在,则回滚事务
c.table("posts").assert({$IsExisted:'1'});
c.rollback();
回滚、撤销事务;
用户明确指示撤销事务,回滚之前的所有本地操作,本次事务不会打包提交到区块链网络
c.commit();
提交事务;
本次事务期间的所有操作都会打包提交到区块链网络
Example:
c.beginTran();
c.table("posts").insert({name: 'peera',age: 22},{name: 'peerb',age: 21});
c.table("posts").get({id: 1}).assert({age:22,name:'peera'});
c.table("posts").get({id: 1}).update({age:'52',name:'lisi'});
c.table("comments").delete({id: 1});
c.commit();
c.getLedger(option,cb)
option = {"ledger_index":LedgerVersion||"validated"}
回调函数cb如:
function(){//do something here};
获取当前区块信息
c.getLedgerVersion(cb)
获取当前的区块高度
回调函数cb如:
function(){//do something here};
c.getTransactions(address,cb)
获取当前账户的所有交易;
回调函数cb如:
function(){//do something here};
c.getTransaction(hash,cb)
获取某个hash下的交易信息;
回调函数cb如:
function(){//do something here};
c.subscribeTable(owner, tablename, callback);
1.订阅某张表
owner为表的所有者地址;
tablename为表名;
Callback回调函数;
Example: 用户订阅TestName
表信息.
c.event.subscribeTable("rsadxc3pw976e3hfaxUijhbR3ye2orJS6x", "TestName",function(){//do something here});
c.unsubcribeTable(owner, tablename);
2.取消订阅某张表
owner为表的所有者地址;
tablename为表名;
Example: 用户取消订阅TestName
表信息.
c.event.unsubcribeTable("rsadxc3pw976e3hfaxUijhbR3ye2orJS6x","TestName");
c.subscribeTx(txid, callback);
3.订阅某个交易
txid:交易Hash
Callback回调函数;
Example: 用户订阅交易Hash信息.
c.event.subscribeTx(txid,function(){//do something here});
c.unsubscribeTx(txid);
4.取消订阅某个交易
txid:交易Hash
Example: 用户取消订阅交易Hash信息.
c.event.unsubscribeTx(txid);
比较运算符
$eq 等于 {<field>:{$eq:<value>}} or {<field>:<value>}
$ne 不等于 {<field>:{$ne:<value>}}
$lt 小于 {<field>:{$lt:<value>}}
$le 小于等于 {<field>:{$le:<value>}}
$gt 大于 {<field>:{$gt:<value>}}
$ge 大于等于 {<field>:{$ge:<value>}}
$in 字段值在指定的数组中 {<field>:{$in:[<value1>,<value2>,...,<valueN>]}}
$nin 字段值不在指定的数组中 {<field>:{$in:[<value1>,<value2>,...,<valueN>]}}
逻辑符
$and 逻辑与 {$and:[{express1},{express2},...,{expressN}]}
$or 逻辑或 {$or:[{express1},{express2},...,{expressN}]}
模糊匹配
$regex like "%value%" { <field>:{$regex: </value/>}}
$regex like "%value" { <field>:{$regex: </^value/>}}
where id > 10 and id < 100
{$and:[{id:{$gt:10}},{id:{$lt:100}}]}
where name = 'peersafe' or name = 'zongxiang'
{$or:[{name:{$eq:'peersafe'}},{name:{$eq:zongxiang}}]}
where (id > 10 and name = 'peersafe') or name = 'zongxiang'
{$or:[{$and:[{id:{$gt:10}},{name:'peersafe'}]},{name:'zongxiang'}]}
where name like '%peersafe%'
{name:{$regex:'/peersafe/'}}
where name like '%peersafe'
{name:{$regex:'/^peersafe/'}}