如何使用 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
的作品藏在CatsRepo
class里,只给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
.
我正在处理 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
的作品藏在CatsRepo
class里,只给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
.