Drizzle y Neon
- PostgreSQL
1. Instalaciones
npm i drizzle-orm @neondatabase/serverless
npm i drizzle-kit dotenv tsx -D
2. Cadena de conexión
.dev.vars
DATABASE_URL="string"
3. Scripts
generatecrea las migracionesmigrateaplica las migraciones a la base de datos
package.json
{
"name": "",
"scripts": {
"db:generate": "drizzle-kit generate",
"db:migrate": "tsx ./src/db/migrate.ts"
},
"devDependencies": {},
"dependencies": {}
}
Archivo que ejecutar las migraciones
src\db\migrate.ts
import { neon } from '@neondatabase/serverless';
import { config } from 'dotenv';
import { drizzle } from 'drizzle-orm/neon-http';
import { migrate } from 'drizzle-orm/neon-http/migrator';
config({ path: '.dev.vars' });
const sql = neon(process.env.DATABASE_URL!);
const db = drizzle(sql);
const main = async () => {
try {
await migrate(db, { migrationsFolder: 'drizzle/migrations' });
console.log('Migration complete');
} catch (error) {
console.log(error);
process.exit(1);
}
};
4. Configuraciones de Drizzle
- Crear el archivo de configuración, puede ser
TS, JS o JSON, para especificar donde se guardaran las miraciones, dónde están los esquemas y otras configuraciones.
{
"dialect": "sqlite", // "postgresql"
"out": "drizzle/migrations",
"schema": "src/db/schema.ts"
}
5. Esquemas
Crear esquemas y verificar que las importaciones sean del lugar correcto, dependiendo si se utiliza PostgreSQL, D1, etc.
src\db\schema.ts
import { doublePrecision, pgTable, serial, text } from 'drizzle-orm/pg-core';
export const products = pgTable('products', {
id: serial('id').primaryKey(),
name: text('name'),
description: text('description'),
price: doublePrecision('price'),
});
1. Generar migraciones
npm run db:generate --name <migrationName>
2. Aplicar migraciones a la base de datos
npm run db:migrate
Ejemplo Escritura y Lectura
import { neon } from '@neondatabase/serverless';
import { drizzle } from 'drizzle-orm/neon-http';
import { Hono } from 'hono';
import { products } from './db/schema';
export type Env = {
DATABASE_URL: string;
};
const app = new Hono<{ Bindings: Env }>();
app.get('/', (c) => {
return c.json({ message: 'Hello, World!' });
});
app.get('/products', async (c) => {
const sql = neon(c.env.DATABASE_URL);
const db = drizzle(sql);
const allProducts = await db.select().from(products);
return c.json(allProducts);
});
export default app;