MySQL
New database
Meet Drizzle
Get started
Drizzleμ MySQL μμνκΈ°
This guide assumes familiarity with:
Drizzleλ₯Ό MySQL λ°μ΄ν°λ² μ΄μ€μ ν¨κ» μ¬μ©νλ €λ©΄ mysql2
λλΌμ΄λ²λ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
**곡μ μΉμ¬μ΄νΈ**μ λ°λ₯΄λ©΄, mysql2
λ μ±λ₯μ μ΄μ μ λ§μΆ Node.jsμ© MySQL ν΄λΌμ΄μΈνΈμ
λλ€.
Drizzle ORMμ drizzle-orm/mysql2
ν¨ν€μ§λ₯Ό ν΅ν΄ mysql2
λ₯Ό κΈ°λ³Έμ μΌλ‘ μ§μν©λλ€.
κΈ°λ³Έ νμΌ κ΅¬μ‘°
μ΄ νλ‘μ νΈμ κΈ°λ³Έ νμΌ κ΅¬μ‘°μ
λλ€. src/db
λλ ν 리 μμλ schema.ts
νμΌμ ν
μ΄λΈ μ μκ° μμ΅λλ€. drizzle
ν΄λμλ SQL λ§μ΄κ·Έλ μ΄μ
νμΌκ³Ό μ€λ
μ·μ΄ μμ΅λλ€.
π¦ <project root>
β π drizzle
β π src
β β π db
β β β π schema.ts
β β π index.ts
β π .env
β π drizzle.config.ts
β π package.json
β π tsconfig.json
1λ¨κ³ - mysql2 ν¨ν€μ§ μ€μΉνκΈ°
npm i drizzle-orm mysql2 dotenv
npm i -D drizzle-kit tsx
yarn add drizzle-orm mysql2 dotenv
yarn add -D drizzle-kit tsx
pnpm add drizzle-orm mysql2 dotenv
pnpm add -D drizzle-kit tsx
bun add drizzle-orm mysql2 dotenv
bun add -D drizzle-kit tsx
2λ¨κ³ - μ°κ²° λ³μ μ€μ νκΈ°
νλ‘μ νΈ λ£¨νΈ λλ ν 리μ .env
νμΌμ μμ±νκ³ λ°μ΄ν°λ² μ΄μ€ μ°κ²° λ³μλ₯Ό μΆκ°νμΈμ:
ν
μμ§ MySQL λ°μ΄ν°λ² μ΄μ€κ° μκ³ ν
μ€νΈμ©μΌλ‘ νλλ₯Ό λ§λ€κ³ μΆλ€λ©΄, Dockerμμ MySQLμ μ€μ νλ λ°©λ²μ λν κ°μ΄λλ₯Ό μ°Έκ³ νμΈμ.
Dockerμμ MySQL μ€μ κ°μ΄λλ μ¬κΈ°μμ νμΈν μ μμ΅λλ€. κ°μ΄λλ₯Ό λ°λΌ μ€μ ν ν, λ°μ΄ν°λ² μ΄μ€ URLμ μμ±νκ³ (κ°μ΄λμ μ€λͺ
λμ΄ μμ) λ€μ λ¨κ³λ₯Ό μ§ννμΈμ.
3λ¨κ³ - Drizzle ORMμ λ°μ΄ν°λ² μ΄μ€μ μ°κ²°νκΈ°
src/db
λλ ν 리μ index.ts
νμΌμ μμ±νκ³ μ°κ²°μ μ΄κΈ°ννμΈμ:
mysql2
mysql2 with config
your mysql2 driver
import 'dotenv/config';
import { drizzle } from "drizzle-orm/mysql2";
const db = drizzle(process.env.DATABASE_URL);
import 'dotenv/config';
import { drizzle } from "drizzle-orm/mysql2";
// mysql2 μ°κ²° μ΅μ
μμ μ΄λ€ μμ±μ΄λΌλ μ§μ ν μ μμ΅λλ€
const db = drizzle({ connection: { uri: process.env.DATABASE_URL }});
import 'dotenv/config';
import { drizzle } from "drizzle-orm/mysql2";
import mysql from "mysql2/promise";
const poolConnection = mysql.createPool({
host: "host",
user: "user",
database: "database",
});
const db = drizzle({ client: poolConnection });
// λλ ν΄λΌμ΄μΈνΈ μ°κ²°μ΄ νμν κ²½μ°
async function main() {
const connection = await mysql.createConnection({
host: "host",
user: "user",
database: "database",
});
const db = drizzle({ client: connection });
}
main();
IMPORTANT
DDL λ§μ΄κ·Έλ μ΄μ
κ³Ό ν¨κ» μ 곡λλ λ΄μ₯ migrate
ν¨μλ₯Ό μ¬μ©ν λλ λ¨μΌ client
μ°κ²°μ μ¬μ©νλ κ²μ κ°λ ₯ν κΆμ₯ν©λλ€.
쿼리 λͺ©μ μ κ²½μ°, λΉμ¦λμ€ μꡬμ λ°λΌ client
λλ pool
μ μμ λ‘κ² μ¬μ©νμΈμ.
4λ¨κ³ - ν
μ΄λΈ μμ±
src/db
λλ ν 리μ schema.ts
νμΌμ μμ±νκ³ ν
μ΄λΈμ μ μΈν΄ λ³΄κ² μ΅λλ€.
import { int, mysqlTable, serial, varchar } from 'drizzle-orm/mysql-core';
export const usersTable = mysqlTable('users_table', {
id: serial().primaryKey(), // κ³ μ μλ³μ, μλ μ¦κ°
name: varchar({ length: 255 }).notNull(), // μ΄λ¦, μ΅λ 255μ, νμ
age: int().notNull(), // λμ΄, νμ
email: varchar({ length: 255 }).notNull().unique(), // μ΄λ©μΌ, μ΅λ 255μ, νμ, κ³ μ
});
5λ¨κ³ - Drizzle μ€μ νμΌ κ΅¬μ±
Drizzle μ€μ νμΌ - Drizzle Kitμμ μ¬μ©νλ μ€μ νμΌλ‘, λ°μ΄ν°λ² μ΄μ€ μ°κ²° μ 보, λ§μ΄κ·Έλ μ΄μ
ν΄λ, μ€ν€λ§ νμΌ λ± λͺ¨λ μ 보λ₯Ό ν¬ν¨ν©λλ€.
νλ‘μ νΈ λ£¨νΈμ drizzle.config.ts
νμΌμ μμ±νκ³ λ€μ λ΄μ©μ μΆκ°νμΈμ:
import 'dotenv/config';
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
out: './drizzle',
schema: './src/db/schema.ts',
dialect: 'mysql',
dbCredentials: {
url: process.env.DATABASE_URL!,
},
});
6λ¨κ³ - λ°μ΄ν°λ² μ΄μ€μ λ³κ²½ μ¬ν μ μ©νκΈ°
drizzle-kit push
컀맨λλ₯Ό μ¬μ©νλ©΄ λ°μ΄ν°λ² μ΄μ€μ μ§μ λ³κ²½ μ¬νμ μ μ©ν μ μμ΅λλ€. μ΄ λ°©λ²μ λ‘컬 κ°λ° νκ²½μμ μλ‘μ΄ μ€ν€λ§ λμμΈμ΄λ μμ μ¬νμ λΉ λ₯΄κ² ν
μ€νΈν λ μ μ©ν©λλ€. λ§μ΄κ·Έλ μ΄μ
νμΌμ κ΄λ¦¬ν νμ μμ΄ λΉ λ₯΄κ² λ°λ³΅ μμ
μ μ§νν μ μμ΅λλ€:
npx drizzle-kit push
push
컀맨λμ λν΄ λ μμλ³΄λ €λ©΄ λ¬Έμλ₯Ό μ°Έκ³ νμΈμ.
ν
λλ drizzle-kit generate
컀맨λλ‘ λ§μ΄κ·Έλ μ΄μ
μ μμ±ν ν, drizzle-kit migrate
컀맨λλ‘ μ μ©ν μλ μμ΅λλ€:
λ§μ΄κ·Έλ μ΄μ
μμ±:
npx drizzle-kit generate
λ§μ΄κ·Έλ μ΄μ
μ μ©:
npx drizzle-kit migrate
λ§μ΄κ·Έλ μ΄μ
νλ‘μΈμ€μ λν΄ λ μμλ³΄λ €λ©΄ λ¬Έμλ₯Ό μ°Έκ³ νμΈμ.
7λ¨κ³ - λ°μ΄ν°λ² μ΄μ€ μλ λ° μΏΌλ¦¬
src/index.ts
νμΌμ μ¬μ©μ μμ±, μ‘°ν, μμ , μμ μΏΌλ¦¬λ‘ μ
λ°μ΄νΈν΄ λ³΄κ² μ΅λλ€.
import 'dotenv/config';
import { drizzle } from 'drizzle-orm/mysql2';
import { eq } from 'drizzle-orm';
import { usersTable } from './db/schema';
const db = drizzle(process.env.DATABASE_URL!);
async function main() {
// μλ‘μ΄ μ¬μ©μ λ°μ΄ν° μμ±
const user: typeof usersTable.$inferInsert = {
name: 'John',
age: 30,
email: 'john@example.com',
};
// μ¬μ©μ μμ±
await db.insert(usersTable).values(user);
console.log('μλ‘μ΄ μ¬μ©μκ° μμ±λμμ΅λλ€!');
// λͺ¨λ μ¬μ©μ μ‘°ν
const users = await db.select().from(usersTable);
console.log('λ°μ΄ν°λ² μ΄μ€μμ λͺ¨λ μ¬μ©μλ₯Ό κ°μ Έμ΅λλ€: ', users);
/*
const users: {
id: number;
name: string;
age: number;
email: string;
}[]
*/
// μ¬μ©μ μ 보 μ
λ°μ΄νΈ
await db
.update(usersTable)
.set({
age: 31,
})
.where(eq(usersTable.email, user.email));
console.log('μ¬μ©μ μ λ³΄κ° μ
λ°μ΄νΈλμμ΅λλ€!');
// μ¬μ©μ μμ
await db.delete(usersTable).where(eq(usersTable.email, user.email));
console.log('μ¬μ©μκ° μμ λμμ΅λλ€!');
}
main();
8λ¨κ³ - index.ts νμΌ μ€ννκΈ°
TypeScript νμΌμ μ€ννλ λ°©λ²μ μ¬λ¬ κ°μ§κ° μμ§λ§, μ¬κΈ°μλ tsx
λ₯Ό μ¬μ©νλ λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€.
μ΄λ―Έ tsx
λ₯Ό μ€μΉνμΌλ―λ‘, μ΄μ 쿼리λ₯Ό μ€νν μ μμ΅λλ€.
index.ts
μ€ν¬λ¦½νΈ μ€ννκΈ°
<Npx>
tsx src/index.ts
</Npx>
ν
TypeScript νμΌμ μ€νν λ bun
μ μ¬μ©νλ κ²μ μΆμ²ν©λλ€. bun
μ μ¬μ©νλ©΄ νλ‘μ νΈκ° CommonJS(CJS), ECMAScript Modules(ESM) λλ λ€λ₯Έ λͺ¨λ νμμΌλ‘ ꡬμ±λμ΄ μλλΌλ μΆκ° μ€μ μμ΄ μ€ν¬λ¦½νΈλ₯Ό μ€νν μ μμ΅λλ€. bun
μΌλ‘ μ€ν¬λ¦½νΈλ₯Ό μ€ννλ €λ©΄ λ€μ λͺ
λ Ήμ΄λ₯Ό μ¬μ©νμΈμ:
bun src/index.ts
λ§μ½ bun
μ΄ μ€μΉλμ΄ μμ§ μλ€λ©΄, Bun μ€μΉ λ¬Έμλ₯Ό μ°Έκ³ νμΈμ.