@elysiumjs/mnemosyne-细雨
Drizzle ORM 驱动程序 @elysiumjs/mnemosyne。 。 。 .
安装
bun add @elysiumjs/mnemosyne-drizzle
使用量
添加 DrizzleModule 您的应用程序。 它宣布这些联系为全球服务,登记租房战略,并提供 migration:generate 财务报告和审定财务报表 migration:run 命令.
import { Application } from '@elysiumjs/core';
import { DrizzleModule } from '@elysiumjs/mnemosyne-drizzle';
@Application.register({
modules: [
DrizzleModule.with({
default: 'main',
connections: {
main: { connection: process.env.DATABASE_URL! }
}
})
]
})
export class App extends Application {}
with() 也接受一个函数,该函数在模块启动时称为: DrizzleModule.with(() => ({ ... }))设置 tenancy 用于在schema(默认)和RLS租赁之间切换.
用增强的模型定义模式 pgTable数字 :
import { DrizzleModel, DrizzleRepository, pgTable } from '@elysiumjs/mnemosyne-drizzle';
import { uuid, varchar } from 'drizzle-orm/pg-core';
const users = pgTable('users', {
id: uuid().primaryKey().defaultRandom(),
name: varchar({ length: 255 }).notNull()
});
export class UserModel extends DrizzleModel(users, { supportTenancy: true }) {}
export class UserRepository extends DrizzleRepository(UserModel) {}
寄存器在表的主键旁找到行. 没有桌子 id 列,或带有复合主键,将键取为对象; key 指定要使用的其他列:
export class MembershipRepository extends DrizzleRepository(MembershipModel) {}
await memberships.find({ teamId, userId });
export class SessionRepository extends DrizzleRepository(SessionModel, { key: ['token'] }) {}
await sessions.find('abc123');
list(query, scope) 财务报告和审定财务报表 count(query, scope) 在查询的过滤器上, 带一个列必须满足的条件 :
public listFor(userId: string, query: ParsedQuery<'cursor'>) {
return this.list(query, eq(posts.authorId, userId));
}
移徙钩
migration:run --tenant <name> 在一次交易中,在每名租户的锁下,适用租户的未决移民。 它的工作是连接由 --connection (单位:千美元)default 其驱动程序为迁移时: bun-sql, (中文(简体) ), postgres-js 财务报告和审定财务报表 node-postgres 做,还有 hyperdrive 把它们交给它包装的驱动器,它需要它的约束。 使用自定义驱动程序运行 migrations(connection),与 templateClientMigrations() 或者说 nodePostgresMigrations() 这样的客户.
迁移钩在迁移周围运行SQL,在同一交易中:当钩失败时,整个跑道被回滚. 登记在 @Migration.hook() 并列出在 services 一个模块。 每个方法都是可选的:
import type { MigrationHook, MigrationRun, MigrationStep } from '@elysiumjs/mnemosyne-drizzle';
import { Migration, sql } from '@elysiumjs/mnemosyne-drizzle';
@Migration.hook()
export class DatabaseHook implements MigrationHook {
public async before({ db }: MigrationRun) {
await db.execute(sql`CREATE EXTENSION IF NOT EXISTS pgcrypto`);
}
public async beforeEach({ name }: MigrationStep) {}
public async afterEach({ db, name }: MigrationStep) {
const [{ count }] = await db.execute<{ count: number }>(
sql`SELECT count(*)::int AS count FROM pg_constraint WHERE ...`
);
if (count > 0) throw new Error(`${name} adds a foreign key across schemas`);
}
public async after({ db, tenant }: MigrationRun) {
await db.execute(sql`GRANT USAGE ON SCHEMA ${sql.identifier(tenant)} TO app`);
}
}
before一旦租户计划及移民表存在,就运行after在结尾。 两者在无移民等待时都会运行,所以after符合必须保持的状态,例如赠款或分配.beforeEach在每次迁移之前运行afterEach一旦记录下来.- A 类
MigrationRun持有该交易(db页:1tenant,则connection,则batch,则pending移徙和移徙applied目前为止 A 类MigrationStep持有交易name财务报告和审定财务报表path移徙及其对受难者的影响run。 。 。 . db.execute(query)运行一个与sqldrizzle 模板并返回其行.db.script(text)运行一些没有参数的语句.
虎克为每个租户运行,按单元登记顺序排列: tenant 只对一些租户采取行动.
表格标记
DrizzleTable.define() 以什么标记表格 migration:generate 增加了造成移徙的移徙。 后迁相如来.
import { DrizzleTable } from '@elysiumjs/mnemosyne-drizzle';
import { pgSchema, primaryKey, text, timestamp, uuid } from 'drizzle-orm/pg-core';
const kernel = pgSchema('kernel');
export const audit = DrizzleTable.define(
DrizzleTable.partitioned({ range: 'recorded_at' }),
DrizzleTable.afterCreate(
({ qualified }) =>
`CREATE TRIGGER audit_append_only BEFORE UPDATE OR DELETE ON ${qualified} FOR EACH ROW EXECUTE FUNCTION forbid_change()`
)
)(
kernel.table(
'audit',
{
id: uuid('id').notNull().defaultRandom(),
action: text('action').notNull(),
recordedAt: timestamp('recorded_at').notNull().defaultNow()
},
(t) => [primaryKey({ columns: [t.id, t.recordedAt] })]
)
);
DrizzleTable.partitioned({ range })添加PARTITION BY RANGE (...)页:1CREATE TABLE。 。 。 .range是数据库中的一列名称,函数返回一列((t) => t.recordedAt),或其中几个. 主要和独特的制约因素必须包括这些栏目.DrizzleTable.afterCreate(build)在表格创建后立即添加 SQL 作为自己的语句.build接收schema(单位:千美元)undefined页:1public页:1name和所引用的、合格的计谋qualified名称,并返回字符串或字符串sql模板.DrizzleTable.define()返回它标记的表格,所以其类型不变。 重新标出一个表格,增加了它的标记.
许可证
这个项目根据Apache许可证2.0版本获得许可. 见 自由主义 需要更多信息的文件.