@ rizzle- adapter/ neon- http
尼昂无服务器 PostgreSQL 适配器执行 Drizzle适配器生态系统.
概览
这个 @drizzle-adapter/neon-http 软件包为 Drizzle 适应器接口提供 Neon 执行。 虽然你不直接与此软件包互动( 您使用 @drizzle-adapter/core 相反,它使得尼昂的无服务器 PostgreSQL 在Drizzle适配器生态系统中得到了支持.
为什么是尼昂?
Neon为现代应用提供了独特的优势:
- 基于 HTTP 的 PostgreSQL: HTTP 上的直接数据库访问, 适合无服务器和边缘环境
- 无服务器 PostgreSQL: 实时缩放为零的真服务器
- 数据库分支: 为开发和测试创建即时数据库分支
- 自动缩放: 独立计算和存储缩放
- 无底存储: 将存储与无限容量计算分开
- 边际计算: 通过计算放置的低相关性访问
- 成本效益: 只支付实际计算和储存使用费
- 邮递SQL 兼容性: 100% PostgreSQL 符合最新特性
- 即时恢复: 内置备份并恢复能力
完美为:
- 无服务器应用程序: 0 冷从即时缩放开始
- 发展流动: 用于测试和中转的即时数据库分支
- 边缘应用程序:全世界低相关性数据存取
- 成本调整后的工作量: 只为您所用支付
- 现代发展: 适合JAMstack和无服务器架构的完美
安装
# Install both the core package and the Neon adapter
pnpm install @drizzle-adapter/core @drizzle-adapter/neon-http
重要:适配器注册
适配器要正确使用 DrizzleAdapterFactory 操作,必须导入它进行自我注册的副作用:
// Import for side effects - adapter will self-register
import '@drizzle-adapter/neon-http';
// Now you can use the factory
import { DrizzleAdapterFactory } from '@drizzle-adapter/core';
使用量
配置
import { DrizzleAdapterFactory, TypeDrizzleDatabaseConfig } from '@drizzle-adapter/core';
const config: TypeDrizzleDatabaseConfig = {
DATABASE_DRIVER: 'neon-http',
DATABASE_URL: 'postgres://user:[email protected]/neondb'
};
const factory = new DrizzleAdapterFactory();
const adapter = factory.create(config);
关于连接的重要注释
虽然Neon在HTTP上运行,不需要传统的数据库连接,但这个适配器执行兼容性的标准连接接口. 这意味着您的代码在不同的数据库适配器中仍可移植:
// These connection operations are no-ops for Neon HTTP but ensure
// your code remains portable if you switch to another database
const connection = await adapter.getConnection();
const client = connection.getClient();
try {
// Your database operations
} finally {
await connection.disconnect(); // No-op for Neon HTTP
}
这个设计允许您在Neon和其他数据库之间切换,而不改变您的应用程序代码.
Schema 定义
const dataTypes = adapter.getDataTypes();
const users = dataTypes.dbTable('users', {
id: dataTypes.dbUuid('id').primaryKey().defaultRandom(),
name: dataTypes.dbText('name').notNull(),
email: dataTypes.dbText('email').notNull().unique(),
profile: dataTypes.dbJsonb('profile'),
searchVector: dataTypes.dbTsVector('search_vector'),
createdAt: dataTypes.dbTimestampTz('created_at').defaultNow()
});
const posts = dataTypes.dbTable('posts', {
id: dataTypes.dbUuid('id').primaryKey().defaultRandom(),
userId: dataTypes.dbUuid('user_id')
.references(() => users.id),
title: dataTypes.dbText('title').notNull(),
content: dataTypes.dbText('content').notNull(),
tags: dataTypes.dbArray('tags', { type: 'text' }),
metadata: dataTypes.dbJsonb('metadata'),
published: dataTypes.dbBoolean('published').default(false),
createdAt: dataTypes.dbTimestampTz('created_at').defaultNow()
});
基本 CRUD 操作
import { eq, and, or, desc, sql } from 'drizzle-orm';
const client = await adapter.getConnection().getClient();
// INSERT
// Single insert with returning
const [newUser] = await client
.insert(users)
.values({
name: 'John Doe',
email: '[email protected]',
profile: { bio: 'Hello!' }
})
.returning();
// Bulk insert
await client
.insert(posts)
.values([
{
userId: newUser.id,
title: 'First Post',
content: 'Hello, world!',
tags: ['hello', 'first']
},
{
userId: newUser.id,
title: 'Second Post',
content: 'Another post',
tags: ['second']
}
]);
// SELECT
// Select all
const allUsers = await client
.select()
.from(users);
// Select with conditions
const user = await client
.select()
.from(users)
.where(eq(users.email, '[email protected]'));
// Select with join and array operations
const postsWithTags = await client
.select({
userName: users.name,
postTitle: posts.title,
tags: posts.tags
})
.from(posts)
.leftJoin(users, eq(posts.userId, users.id))
.where(sql`${posts.tags} && ARRAY['hello']::text[]`)
.orderBy(desc(posts.createdAt));
// UPDATE
// Update with JSONB operations
await client
.update(users)
.set({
profile: sql`${users.profile} || '{"title": "New Title"}'::jsonb`
})
.where(eq(users.id, newUser.id));
// DELETE
await client
.delete(posts)
.where(
and(
eq(posts.userId, newUser.id),
eq(posts.published, false)
)
);
神经元特征
数据库分支
适合开发和测试工作流程:
// Development branch
const devAdapter = factory.create({
DATABASE_DRIVER: 'neon-http',
DATABASE_URL: 'postgres://user:[email protected]/neondb'
});
// Staging branch
const stagingAdapter = factory.create({
DATABASE_DRIVER: 'neon-http',
DATABASE_URL: 'postgres://user:[email protected]/neondb'
});
// Production branch
const prodAdapter = factory.create({
DATABASE_DRIVER: 'neon-http',
DATABASE_URL: 'postgres://user:[email protected]/neondb'
});
HTTP 优化
const client = await adapter.getConnection().getClient();
// Queries are automatically optimized for HTTP
const result = await client
.select()
.from(users)
.where(eq(users.id, userId));
最佳做法
- 查询优化: 尽量减少查询次数以减少 HTTP 请求
- 数据库分支: 利用分支开发、测试和中转环境
- 边际计算: 部署在用户附近以降低延迟度
- 处理错误: 对网络问题执行适当的重试逻辑
- 可移动性: 将连接接口用于数据库可移植性
捐款
我们欢迎捐款! 请随意提交拉力请求 对于重大变动,请先开出一个问题来讨论你想要改变什么.
相关软件包
- @ 细雨适应器/ 核心 - 核心接口和类型
- @ 细雨适应器/ pg- core - 共享 PostgreSQL 功能