如何使用 denodb 获取最后插入的行的 ID?

How to get ID of last inserted row using denodb?

我正在处理 DenoDb 的工作,并试图使 createCat 函数 return 成为 Promise<CatModel> 类型。 最好的方法是什么? 这是我当前的代码:

import { Model, Database, SQLite3Connector, DataTypes } from 'https://deno.land/x/denodb/mod.ts';

interface CatModel {
    id: bigint;
    name: string;
}

const connector = new SQLite3Connector({
  filepath: './db.sqlite',
});
const db = new Database(connector);

class CatSchema extends Model {
  static table = 'cats';
  static fields = {
      id: {
          type: DataTypes.BIG_INTEGER,
          primaryKey: true,
          autoIncrement: true,
      },
      name: {
          type: DataTypes.STRING,
      }
  };
}

db.link([CatSchema]);
await db.sync({ drop: true });

const createCat = async (name: string): Promise<CatSchema> => {
    return await CatSchema.create({
        name: name
    });
};

const dataCat = await createCat("Three");
console.log(dataCat);

await db.close();

Deno.exit(1);

我正在尝试制作这样的函数:

const createCat = async (name: string): Promise<CatModel>

如何将Promise<CatSchema>正确转换为Promise<CatModel>? 我打算以后把带DenoDB的作品藏在CatsRepoclass里,只给CatModel。这是一个好的解决方案吗?

Model.create returns 一个包含最后插入行的 id 作为 number 的对象,属性 称为 lastInsertId。因为 denodb returns 是 number 类型,你的 CatModel 的id用 bigint 没有多大价值,所以你可以把它改成 number,然后像这样修改你的函数:

so-70550010.ts:

import {
  Database,
  DataTypes,
  Model,
  SQLite3Connector,
} from "https://deno.land/x/denodb@v1.0.40/mod.ts";

class CatSchema extends Model {
  static table = "cats";
  static fields = {
    id: {
      type: DataTypes.BIG_INTEGER,
      primaryKey: true,
      autoIncrement: true,
    },
    name: {
      type: DataTypes.STRING,
    },
  };
}

interface CatModel {
  id: number;
  name: string;
}

async function createCat(name: string): Promise<CatModel> {
  const model = await CatSchema.create({ name });
  const id = model.lastInsertId as number;
  return { id, name };
}

async function main() {
  const connector = new SQLite3Connector({ filepath: ":memory:" });
  const db = new Database(connector);
  db.link([CatSchema]);
  await db.sync({ drop: true });

  for (const name of ["One", "Two", "Three"]) {
    const catModel = await createCat(name);
    console.log(catModel);
  }

  await db.close();
  await connector.close();
  Deno.exit();
}

if (import.meta.main) main();
$ deno run so-70550010.ts
{ id: 1, name: "One" }
{ id: 2, name: "Two" }
{ id: 3, name: "Three" }

If you want lower-level control while working with SQLite, I recommend https://deno.land/x/sqlite instead of denodb.