Drizzle ORM

用于 SQL 数据库的 TypeScript ORM
授权协议 Apache 2.0
开发语言 TypeScript
所属分类 数据库相关、 数据库管理工具
软件类型 开源软件
地区 不详
投 递 者 林君博
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

Drizzle ORM 是用于 SQL 数据库的 TypeScript ORM,在设计时考虑到了最大的类型安全性。它带有用于自动生成 SQL 迁移的 drizzle-kit CLI 。

Drizzle ORM 是一个库,而不是一个框架,它的主要哲学是“如果你知道 SQL,你就知道 Drizzle ORM”,因此设计的时候尽可能遵循类似 SQL 的语法,强类型化并在编译时就会失败,而不是在运行时。

功能列表

  • 全类型安全
  • 智能自动迁移生成
  • 没有 ORM 学习曲线
  • 用于表定义和查询的类似于 SQL 的语法
  • 一流的全类型连接
  • 任何复杂性的全类型部分和非部分选择
  • 自动推断 DB 模型的 TS 类型以分别选择和插入
  • Zod 架构生成
  • 零依赖

支持的数据库

Database Status  
PostgreSQL Docs
MySQL Docs
SQLite Docs
Cloudflare D1 Docs
libSQL Docs
Turso Docs
Vercel Postgres Docs
DynamoDB  
MS SQL  
CockroachDB

安装

npm install drizzle-orm
npm install -D drizzle-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';

export const users = 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(),
});

export type User = InferModel<typeof users>;
export type NewUser = InferModel<typeof users, 'insert'>;

export const cities = pgTable('cities', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
});

export type City = InferModel<typeof cities>;
export type NewCity = InferModel<typeof cities, 'insert'>;

const pool = new Pool({
  connectionString: 'postgres://user:password@host:port/db',
});

const db = drizzle(pool);

// Insert
const newUser: NewUser = {
  fullName: 'John Doe',
  phone: '+123456789',
};
const insertedUsers /* : User[] */ = await db.insert(users).values(newUser).returning();
const insertedUser = insertedUsers[0]!;

const newCity: NewCity = {
  name: 'New York',
};
const insertedCities /* : City[] */ = await db.insert(cities).values(newCity).returning();
const insertedCity = insertedCities[0]!;

// Update
const updateResult /* : { updated: Date }[] */ = await db.update(users)
  .set({ cityId: insertedCity.id, updatedAt: new Date() })
  .where(eq(users.id, insertedUser.id))
  .returning({ updated: users.updatedAt });

// Select
const allUsers /* : User[] */ = await db.select().from(users);

// Select custom fields
const upperCaseNames /* : { id: number; name: string }[] */ = await db
  .select({
    id: users.id,
    name: sql<string>`upper(${users.fullName})`,
  })
  .from(users);

// Joins
// You wouldn't BELIEVE how SMART the result type is! ��
const allUsersWithCities = await db
  .select({
    id: users.id,
    name: users.fullName,
    city: {
      id: cities.id,
      name: cities.name,
    },
  })
  .from(users)
  .leftJoin(cities, eq(users.cityId, cities.id));

// Delete
const deletedNames /* : { name: string }[] */ = await db.delete(users)
  .where(eq(users.id, insertedUser.id))
  .returning({ name: users.fullName });

 

 

 相关资料
  • 问题内容: 我正在寻找一个具有免费访问权限的公共SQL数据库,在其中可以对一些有意义的数据(而不是item1,item2,item3)免费运行一些查询。你有没有看到?如果它与一些教程一起提供,那就更好了。 供应商关系不大,只要可以使用通用JDBC客户端进行连接即可。 问题答案: 尝试SQL练习 从学习阶段开始

  • 问题内容: 我正在进行的一个项目在不久的将来可能会跨越几百万行,所以我正在研究我使用的数据库,因为这肯定会证明是一个问题。据我所读,一旦涉及到表的2,000,000行问题,SQL的所有形式都会出现问题。对于这些大型项目,有没有推荐好的数据库? 我正在谈论的是一个网站,归档旧条目并不理想,但是如果证明这是我无法克服的问题,则可以这样做。 谢谢。 问题答案: 我已经在MS SQL Server中使用了

  • 要在运行OSV7.1的IBM i(AS/400,iSeries)计算机上使用(DB2)数据库,设置Oracle Data Modeler(4.0.2.840)的正确方法是什么? 在New/Select数据库连接下,我选择了JDBC选项卡,然后选择了“Other ThirdParty Driver”,然后输入: 驱动程序类:com.ibm.as400.access.as400jdbcdriver 数

  • 任何人都知道如何在JDBC连接配置下参数化数据库URL。 数据库URL: jdbc: sqlserver://ovh-sql1:1433; Database aseName=user_1 JDBC驱动程序类:com.microsoft.sqlserver.jdbc.SQLServerDriver 我想参数化DatabaseName=user\u 1 正常参数化在此不起作用。请提出建议。

  • 29. 使用SQL数据库 Spring Framework为使用SQL数据库提供了大量的支持。从使用JdbcTemplate的直接JDBC访问,到彻底的“对象关系映射”技术(如Hibernate)。Spring Data提供了另一层级的功能,直接从接口创建Repository实现,并使用约定根据方法名生成查询。

  • Spring Framework为使用SQL数据库提供了广泛的支持,从使用JdbcTemplate的直接JDBC访问到完成“对象关系映射”技术(如Hibernate)。 Spring Data提供了更多级别的功能:直接从接口创建存储库实现,并使用约定从方法名称生成查询。 4.9.1 配置数据源 Java的javax.sql.DataSource接口提供了一种处理数据库连接的标准方法。 传统上,“D

  • 在我的Spring Boot项目中,我正在尝试为MongoDb实现一个数据库迁移,我对MongoDb和mongock非常陌生<下面是关于错误的一些详细信息,以及到目前为止我所做的工作: > 我的pom有以下依赖项: 我已经用“ 并将少量数据插入DB。 在application.properties文件中添加以下行 蒙哥克。更改日志扫描包=com。产品目标配置 现在,当我构建项目“mvn clean

  • 我也使用了SQL和Oracle,但我有一个很大的困惑。在oracle中,用户属于数据库还是数据库属于用户。因为我已经使用sql命令在oracle中创建了一个新用户。然后我创建了表,但我没有创建任何数据库,那么新表去了哪里? 我猜想表与oracle中的用户相关联,就像创建表的人是表的所有者,其他用户无法访问该表,因此无需通过先创建数据库,然后在其下创建表来区分它们。 但是在MYSQL中(使用PhpM