DrizzleORM是用于SQL数据库的TypeScriptORM,在设计时考虑到了最大的类型安全性。它带有用于自动生成SQL迁移的drizzle-kitCLI。
DrizzleORM是一个库,而不是一个框架,它的主要哲学是“如果你知道SQL,你就知道DrizzleORM”,因此设计的时候尽可能遵循类似SQL的语法,强类型化并在编译时就会失败,而不是在运行时。
功能列表全类型安全智能自动迁移生成没有ORM学习曲线用于表定义和查询的类似于SQL的语法一流的全类型连接任何复杂性的全类型部分和非部分选择自动推断DB模型的TS类型以分别选择和插入Zod架构生成零依赖支持的数据库DatabaseStatus PostgreSQL✅DocsMySQL✅DocsSQLite✅DocsCloudflareD1✅DocslibSQL✅DocsTurso✅DocsVercelPostgres✅DocsDynamoDB⏳ MSSQL⏳ CockroachDB⏳安装npminstalldrizzle-ormnpminstall-Ddrizzle-kit功能展示(PostgreSQL)注意:不要忘记安装 pg 和 @types/pg 包。
import{drizzle}from'drizzle-orm/node-postgres';import{integer,pgTable,serial,text,timestamp,varchar}from'drizzle-orm/pg-core';import{InferModel,eq,sql}from'drizzle-orm';import{Pool}from'pg';exportconstusers=pgTable('users',{id:serial('id').primaryKey(),fullName:text('full_name').notNull(),phone:varchar('phone',{length:20}).notNull(),role:text('role',{enum:['user','admin']}).default('user').notNull(),cityId:integer('city_id').references(()=>cities.id),createdAt:timestamp('created_at').defaultNow().notNull(),updatedAt:timestamp('updated_at').defaultNow().notNull(),});exporttypeUser=InferModel<typeofusers>;exporttypeNewUser=InferModel<typeofusers,'insert'>;exportconstcities=pgTable('cities',{id:serial('id').primaryKey(),name:text('name').notNull(),});exporttypeCity=InferModel<typeofcities>;exporttypeNewCity=InferModel<typeofcities,'insert'>;constpool=newPool({connectionString:'postgres://user:password@host:port/db',});constdb=drizzle(pool);//InsertconstnewUser:NewUser={fullName:'JohnDoe',phone:'+123456789',};constinsertedUsers/*:User[]*/=awaitdb.insert(users).values(newUser).returning();constinsertedUser=insertedUsers[0]!;constnewCity:NewCity={name:'NewYork',};constinsertedCities/*:City[]*/=awaitdb.insert(cities).values(newCity).returning();constinsertedCity=insertedCities[0]!;//UpdateconstupdateResult/*:{updated:Date}[]*/=awaitdb.update(users).set({cityId:insertedCity.id,updatedAt:newDate()}).where(eq(users.id,insertedUser.id)).returning({updated:users.updatedAt});//SelectconstallUsers/*:User[]*/=awaitdb.select().from(users);//SelectcustomfieldsconstupperCaseNames/*:{id:number;name:string}[]*/=awaitdb.select({id:users.id,name:sql<string>`upper(${users.fullName})`,}).from(users);//Joins//Youwouldn'tBELIEVEhowSMARTtheresulttypeis!
评论