let res = a[0]; let i = 1; while (a[i]) { let temp = []; res.forEach(n => { a[i].forEach(m => { temp.push(n + '|' + m); }) }); res = temp i++; } console.log(res)
let spec = { color: ['红', '蓝'], memory: ['128G', '256G', '512G'], version: ['常规'], }, let data = []; for (let k in spec) { // 如果属性值为空,则不循环这个属性 if (spec[k].length) { // 判断data长度 if (data.length) { // 如果data不为空,创建容器,循环data和当前属性,放入容器,赋值给data let temp = []; for (let i = 0; i < data.length; i++) { for (let j = 0; j < spec[k].length; j++) { // 先序列化,再反序列化,即深拷贝 var field = JSON.parse(JSON.stringify(data[i])); field[k] = spec[k][j] //拷贝好了之后,附加当前的键与值 temp.push(field) } } data = temp } else { // 如果data为空,将第一个属性塞进去 for (let i in spec[k]) { let field = {} field[k] = spec[k][i] data.push(field) } } } }
class Person(Model): Name = CharField() Age = IntegerField() Birthday = DateTimeField() Remarks = CharField(null=True) Department = ForeignKeyField(Department, null=True) # 这里外键可为空和不可为空是不一样的,下面说明
class Meta: database = db
① 当 recursive=False 时,只删除了【部门】,【人员】没有影响,从 SQL 语句中可以看出。
1 2
d = Department.get(1) d.delete_instance(recursive=False)
1 2 3
# 执行的 SQL 语句 ('SELECT "t1"."id", "t1"."Name" FROM "department" AS "t1" WHERE ? LIMIT ? OFFSET ?', [1, 1, 0]) ('DELETE FROM "department" WHERE ("department"."id" = ?)', [1])
② 当 recursive=True ,并且外键不可为空时,会先删除【部门】下的【人员】,再删除【部门】。
1 2 3 4 5 6
d = Department.get(1) d.delete_instance(recursive=True) # 执行的 SQL 语句 ('SELECT "t1"."id", "t1"."Name" FROM "department" AS "t1" WHERE ? LIMIT ? OFFSET ?', [1, 1, 0]) ('DELETE FROM "person" WHERE ("person"."Department_id" = ?)', [1]) ('DELETE FROM "department" WHERE ("department"."id" = ?)', [1])
③ 当 recursive=True ,并且外键可为空时,先将【人员】的【部门ID(外键字段)】置为了 NULL,再删除【部门】。
1 2 3 4 5 6
d = Department.get(1) d.delete_instance(recursive=True) # 执行的 SQL 语句 ('SELECT "t1"."id", "t1"."Name" FROM "department" AS "t1" WHERE ? LIMIT ? OFFSET ?', [1, 1, 0]) ('UPDATE "person" SET "Department_id" = ? WHERE ("person"."Department_id" = ?)', [None, 1]) ('DELETE FROM "department" WHERE ("department"."id" = ?)', [1])
④ delete_nullable 仅在 recursive=True 且外键可为空时有效,和 ③ 一样,当 delete_nullable=True 时,会删除【人员】,而不是将【人员的部门ID】置为 NULL。
1 2 3 4 5 6 7
d = Department.get(1) d.delete_instance(recursive=True, delete_nullable=True)
# 执行的 SQL 语句 ('SELECT "t1"."id", "t1"."Name" FROM "department" AS "t1" WHERE ? LIMIT ? OFFSET ?', [1, 1, 0]) ('DELETE FROM "person" WHERE ("person"."Department_id" = ?)', [1]) ('DELETE FROM "department" WHERE ("department"."id" = ?)', [1])
六、支持的比较符
运算符 含义
== 等于
< 小于
<= 小于等于
> 大于
>= 大于等于
!= 不等于
<< x in y,其中 y 是列表或查询
>> x is y, 其中 y 可以是 None
% x like y
** x like y
注意:由于 SQLite 的 LIKE 操作默认情况下不区分大小写,因此 peewee 将使用 SQLite GLOB 操作进行区分大小写的搜索。glob 操作使用星号表示通配符,而不是通常的百分号。如果您正在使用 SQLite 并希望区分大小写的部分字符串匹配,请记住使用星号作为通配符。
解释一下,在 SQLite 中,如果希望 like 的时候区分大小写,可以这么写:
// Connection opened socket.addEventListener('open', function (event) { app.start_message = 'Hello Server!' socket.send('Hello Server!'); });
// Listen for messages socket.addEventListener('message', function (event) { app.messages.push(event.data) console.log('Message from server ', event.data); });
php-fpm client 基于 textalk/websocket
1 2
$client = new \WebSocket\Client($uri); $client->send(json_encode(['data' => $data, 'to' => $uid]));