Saltar al contenido principal

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

  • generate crea las migraciones
  • migrate aplica 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

  1. 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;