Skip to content

新增数据 save,create,insert

数据模型内置了新增/创建处理器, 这些处理器可用于服务接口(API)和数据流(Flow)数据新增/创建功能。

新建模型

新增models/category.mod.json文件,写入以下内容:

json
{
  "name": "书籍分类",
  "table": {
    "name": "category",
    "comment": "书籍分类"
  },
  "columns": [
    {
      "label": "ID",
      "name": "id",
      "type": "ID",
      "comment": "ID",
      "primary": true
    },
    {
      "label": "父级id",
      "name": "parent_id",
      "type": "integer",
      "nullable": true
    },
    {
      "label": "分类名称",
      "name": "name",
      "type": "string",
      "length": 128,
      "index": true
    }
  ],
  "relations": {
    "book": {
      "type": "hasMany",
      "model": "book",
      "key": "category_id",
      "foreign": "id",
      "query": {}
    },
    "parent": {
      "type": "hasOne",
      "model": "category",
      "key": "id",
      "foreign": "parent_id",
      "query": {}
    }
  },
  "option": {
    "timestamps": true,
    "soft_deletes": true
  },
  "values": [
    {
      "id": 1,
      "parent_id": null,
      "name": "文史类"
    },
    {
      "id": 2,
      "parent_id": 1,
      "name": "历史"
    },
    {
      "id": 3,
      "parent_id": 1,
      "name": "古诗"
    },
    {
      "id": 4,
      "parent_id": null,
      "name": "理工类"
    },
    {
      "id": 5,
      "parent_id": 4,
      "name": "数学"
    },
    {
      "id": 6,
      "parent_id": 4,
      "name": "物理"
    }
  ]
}

Save 新增scripts/test.js

javascript
function Save() {
  return Process('models.category.save', {
    parent_id: 1,
    name: '语文'
  });
}

Create 新增:

javascript
function Create() {
  return Process('models.category.create', {
    parent_id: 1,
    name: '英语'
  });
}

Insert 批量新增:

javascript
function Insert() {
  return Process(
    'models.category.insert',
    ['parent_id', 'name'],
    [
      [1, '语文'],
      [1, '地理']
    ]
  );
}

执行 yao run scripts.test.Saveyao run scripts.test.Create

Upsert a record

Upsert 是一种数据库操作,用于在表中插入新记录或更新现有记录。它的工作原理是根据指定的唯一键(或一组唯一键)来确定记录是否已经存在。如果记录存在,则更新该记录的指定列;如果记录不存在,则插入新记录。

需要注意的是,并不是所有的数据库都支持 Upsert 操作。在某些数据库中,Upsert 操作可能需要使用特定的语法或函数。

在mysql中,upsert 操作可以使用 ON DUPLICATE KEY UPDATE 语法来实现。 以下是一个使用 ON DUPLICATE KEY UPDATE 语法的示例:

sql
INSERT INTO users (id, name, email)
VALUES (1, 'John Doe', 'EMAIL')
ON DUPLICATE KEY UPDATE
  name = VALUES(name),
  email = VALUES(email);

在上面的示例中,如果 id 为 1 的记录已经存在,则更新 nameemail 列;如果记录不存在,则插入新记录。 在yao中,我们可以使用 Process 函数来执行 Upsert 操作。以下是一个示例:

typescript
/**
 * 如果记录不存在则插入新记录,如果记录存在则更新记录
 * @param data - 记录数据
 * @param uniqueBy - 用于检查唯一性的列名(可以是单个或多个)
 * @param updateColumns - 如果记录存在,需要更新的列(可选)
 * @returns any - 更新或插入记录的ID
 */
const id = Process(
  'models.user.Upsert',
  { email: 'john@example.com', name: 'John Doe', status: 'active' },
  'email', // Can be a string or array of strings
  ['name', 'status'] // Optional columns to update
);