Raw字段解析¶
建表¶
示例¶
建表交易Raw字段示例:
{
"Raw": [
{
"field": "id",
"type": "int",
"length": 11,
"PK": 1,
"NN": 1,
"UQ": 1,
"index": 1
},
{
"field": "age",
"type": "int"
},
{
"field": "name",
"type": "varchar",
"length": 64
},
{
"field":"pay_money",
"type":"decimal",
"length":16,
"accuracy":4
},
{
"field":"create_time",
"type":"date",
"default":"2018-09-09"
},
{
"field":"update_time",
"type":"datetime",
"default":"2018-09-09 11:12:13"
},
{
"field":"tx_hash",
"type":"varchar",
"length":64
}
]
}
说明¶
- 在建表交易中,Raw字段用来描述表的结构
- 如果想要向表中插入交易hash,需要预留hash字段,如上例中的 tx_hash(名称非固定)
- Raw字段是一个数组,数组中每个元素是对表中一个字段的描述,包括列名,数据类型,数据长度,约束,索引等。 具体见下表:
域 | 类型 | 值 |
field | 字符串 | 列名。 |
type | 字符串 | 列的数据类型,可选值有int/float/double/decimal/varchar/blob/text/datetime |
length | 整数 | 列的数据长度。 |
default | 整数或字符串 | 字段默认值,在插入一行记录,字段不予赋值时默认填充的值 |
PK | 整数 | 主键(Primary Key),值为1表示为列创建主键约束。 |
NN | 整数 | 非空(Not Null),值为1表示列的值不能为空(NULL)。 |
UQ | 整数 | 唯一(Unique),值为1表示为列创建唯一约束。 |
index | 整数 | 索引,值为1表示为列建立索引。 |
FK | 整数 | 外键,值为1表示为列创建外键约束。必须配合REFERENCES使用。 |
REFERENCES | 对象 | 设置对其它表的外键引用,值的格式为{“table”: “tablename”, “field”: “filedname”}。 |
授权¶
说明¶
- 授权交易的Raw字段比较容易理解,分别表示对各个操作的授权或取消授权。
- 权限包括:insert,update,delete,select四种
- 可以四种都写全,也可以只写一部分(没写的部分继承之前的权限)
插入¶
示例¶
插入交易Raw字段示例:
{
"Raw": [
{
"id": 1,
"name": "张三"
"age": 11,
"pay_money":12.345,
"create_time":"2019-4-26",
"update_time":"2019-4-26 13:14:15"
},
{
"id": 2,
"name": "李四",
"age": 12,
"pay_money":10,
"create_time":"2019-4-28",
"update_time":"2019-4-29 13:14:15"
}
]
}
说明¶
- 插入交易的Raw字段也比较简单,就是对各个字段赋值
- 一个插入交易中,可插入多条记录
- 可通过设置与Raw字段同级的
AutoFillField
字段来插入当前交易的hash
值,示例如下:
{
"method": "r_insert",
"params": [
{
"offline": false,
"secret": "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb",
"tx_json": {
"TransactionType": "SQLStatement",
"Account": "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh",
"Owner": "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh",
"Tables":[{
"Table":{
"TableName":"hi33"
}
}],
"Raw": [{"id":3,"name":"hi","age":11,"pay_money":12.3456,"create_time":"2014-19-16","update_time":"2019-04-26 19:20:30"}],
"OpType": 6,
"AutoFillField":"tx_hash"
}
}
]
}
更新¶
示例¶
更新交易Raw字段示例:
{
"Raw": [
{
"name": "李四"
"update_time":"2019-4-26 14:14:15"
},
{
"$or":[
{ "id": 2},
{ "name": "张三"}
]
}
]
}
说明¶
- Raw数组中第一个对象是要更新的列名和值,其后的所有对象均表示更新条件, 对象内的多个条件为与(and)关系,对象之间为或(or)关系
- 上例中Raw字段的意义为:
update xxx set name='李四',update_time='2019-4-26 14:14:15' where id=2 or name='张三';
删除¶
查询¶
查询接口具体调用方法请参考:Java API 与 Node.js API
示例¶
查询的Raw字段较为复杂,可以实现mysql中的limit
,order
,withfields
等关键字
{
"Raw": [
[],
{
"$or":[
{ "id": 2},
{ "name": "张三"}
]
}
]
}
说明¶
- Raw数组中,第一个元素为一个数组,表示要查询的结果中包含哪些字段,后面的元素表示查询条件,多个查询条件之间是or的关系,单个查询条件内部是and关系。也可以如上例中在单个元素内部用
$or
、$and
来表示or与and关系 上例中Raw字段的意义为:
select * from xxx where id=2 or name='张三';
重要
在API中调用时,Raw中第一个元素对应 withFields
方法,当要查询的结果中包含表中所有字段时,可以不调用 withFields
指定字段列表。
对应的Node.js API的调用方式:
var tablename = "xxx";
var raw = {
"$or":[
{ "id": 2},
{ "name": "张三"}
]
};
var ret = c.table(tablename).get(raw).submit();
console.log(ret);
对应的Java API的调用方式:
String sTableName = "xxx";
List<String> raw = c.array("{'$or':[{ 'id': 2},{'name': '张三'}]}");
//查询 id 为 2 或 name 为 ‘张三’ 的记录.
JSONObject obj = c.table(sTableName).get(raw).submit();
System.out.println(obj);
复杂查询¶
查询接口具体调用方法请参考:Java API 与 Node.js API
对结果进行统计¶
对应API中的withFields
方法。查询中可对结果作统计 ,如count(*)
,sum(age)
等,需要在字段数组中指定。示例如下:
{
"Raw": [
[ "count(*) as count" ],
{
"name": "张三"
}
]
}
表示的意义为:
select count(*) as count from xxx where name='张三';
对查询结果进行排序¶
对应API中的order
方法。对结果排序需在查询条件中指定示例如下:
{
"Raw": [
[ ],
{
"name":"xxx"
},
{
"$order":[{"id":1},{"name":-1}]
}
]
}
表示的意义为:
select * from xxx where name='张三' order by id ASC, name desc;
分页查询¶
对应API中的limit
方法在查询条件中使用limit关键字来指定返回查询结果的起始下标,以及返回的数量限制示例如下:
{ "Raw": [ [ ], { "name":"xxx" }, { "$limit":{ "total":10, "index":0 } }, { "$order":[{"id":1},{"name":-1}] } ] }
表示的意义为:
select * from xxx where name='张三' order by id ASC, name desc limit 0,10;
运算符¶
比较运算符(comparison operators)¶
运算符 | 说明 | 语法 |
---|---|---|
$ne | 不等于 | {field:{$ne:value}} |
$eq | 等于 | {field:{$eq:value}} or {field:value} |
$lt | 小于 | {field:{$lt:value}} |
$le | 小于等于 | {field:{$le:value}} |
$gt | 大于 | {field:{$gt:value}} |
$ge | 大于等于 | {field:{$ge:value}} |
$in | 字段值在指定的数组中 | {field:{$in:[v1, v2, …, vn]}} |
$nin | 字段值不在指定的数组中 | {field:{$nin:[v1, v2, …, vn]}} |
$is | 字段在表中的值是否为null | {field:{$is:”null”}} |
$isnot | 字段在表中的值是否为null | {field:{$isnot:”null”}} |
逻辑运算符(logical operators)¶
逻辑符 | 说明 | 语法 |
---|---|---|
$and | 逻辑与 | {$and:[{express1},{express2},…,{expressN}]} |
$or | 逻辑或 | {$or:[{express1},{express2},…,{expressN}]} |
示例¶
where id > 10 and id < 100
// 对应 json 对象
{
$and: [
{
id: {$gt: 10}
},
{
id: {$lt: 100}
}
]
}
where id > 10 and id < 100
//对应 json 对象
{
$and: [
{
id: {$gt:10}
},
{
id: {$lt:100}
}
]
}
where name = 'peersafe' or name = 'zongxiang'
//对应 json 对象
{
$or: [
{
name: {$eq:'peersafe'}
},
{
name: {$eq:zongxiang}
}
]
}
where (id > 10 and name = 'peersafe') or name = 'zongxiang'
//对应 json 对象
{
$or: [
{
$and: [
{
id: {$gt:10}
},
{
name:'peersafe'
}]
},
{
name:'zongxiang'
}
]
}
模糊匹配(fuzzy matching)¶
语法 | 说明 |
---|---|
{“field”:{“$regex”:”/value/”}} | like “%value%” |
{“field”:{“$regex”:”/^value/”}} | like “%value” |
where name like '%peersafe%'
//对应 json 对象
{
name: {
$regex:'/peersafe/'
}
}
where name like '%peersafe'
//对应 json 对象
{
name: {
$regex:'/^peersafe/'
}
}