Skip to content

Commit 7d5319d

Browse files
committed
drizzle example
1 parent b4e068d commit 7d5319d

File tree

10 files changed

+137
-2
lines changed

10 files changed

+137
-2
lines changed

drizzle-orm/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ node_modules
44
/build
55
/public/build
66
.env
7+
*.db

drizzle-orm/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ Open this example on [CodeSandbox](https://codesandbox.com):
1313
Relevant files:
1414

1515
- [drizzle](./drizzle) migrations and drizzle-related meta information
16-
- [app/schema.ts] table schemas and data models
17-
- [app/db.server.ts] setup database client
16+
- [app/db/db.server.ts] setup database client
17+
- [package.json] add `db:*` scripts and drizzle dependencies
1818

1919
## Related Links
2020

drizzle-orm/app/db.server.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import Database from "better-sqlite3";
2+
import { drizzle } from "drizzle-orm/better-sqlite3";
3+
import { migrate } from "drizzle-orm/better-sqlite3/migrator";
4+
import * as schema from "./schema";
5+
6+
const sqlite = new Database("sqlite.db");
7+
8+
export const db = drizzle(sqlite, { schema });
9+
10+
migrate(db, { migrationsFolder: "drizzle" });

drizzle-orm/app/routes/_index.tsx

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,58 @@
1+
import { type ActionArgs } from "@remix-run/node";
2+
import { Form, useLoaderData } from "@remix-run/react";
3+
import { sql } from "drizzle-orm";
4+
import { db } from "~/db.server";
5+
import { example } from "~/schema";
6+
7+
export async function action({ request }: ActionArgs) {
8+
let formData = await request.formData();
9+
let intent = formData.get("intent");
10+
11+
if (intent === "update") {
12+
await db.insert(example).values({});
13+
return new Response(null, { status: 201 });
14+
}
15+
16+
if (intent == "reset") {
17+
await db.delete(example);
18+
return new Response(null, { status: 204 });
19+
}
20+
21+
return new Response(null, { status: 400 });
22+
}
23+
24+
export function loader() {
25+
let result = db
26+
.select({
27+
count: sql<number>`COUNT(*)`,
28+
lastUpdated: sql<string>`MAX(created_at)`,
29+
})
30+
.from(example)
31+
.get();
32+
33+
return {
34+
count: result?.count ?? 0,
35+
lastUpdated: result?.lastUpdated ?? "never",
36+
};
37+
}
38+
139
export default function Index() {
40+
const { count, lastUpdated } = useLoaderData<typeof loader>();
241
return (
342
<div style={{ fontFamily: "system-ui, sans-serif", lineHeight: "1.8" }}>
443
<h1>Welcome to Remix</h1>
44+
<p>
45+
Count: {count} <br />
46+
Last updated: {lastUpdated}
47+
</p>
48+
<Form method="post">
49+
<button type="submit" name="intent" value="update">
50+
Update
51+
</button>
52+
<button type="submit" name="intent" value="reset">
53+
Reset
54+
</button>
55+
</Form>
556
</div>
657
);
758
}

drizzle-orm/app/schema.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { sql } from 'drizzle-orm'
2+
import { sqliteTable, integer, text } from "drizzle-orm/sqlite-core";
3+
4+
export const example = sqliteTable('example', {
5+
id: integer('id').primaryKey(),
6+
createdAt: text('created_at').default(sql`CURRENT_TIMESTAMP`),
7+
})

drizzle-orm/drizzle.config.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import type { Config } from "drizzle-kit";
2+
3+
export default {
4+
schema: "./app/schema.ts",
5+
out: "./drizzle",
6+
} satisfies Config;
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
CREATE TABLE `example` (
2+
`id` integer PRIMARY KEY NOT NULL,
3+
`created_at` text DEFAULT CURRENT_TIMESTAMP
4+
);
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{
2+
"version": "5",
3+
"dialect": "sqlite",
4+
"id": "0be79972-b6bf-4225-88d7-95a723174903",
5+
"prevId": "00000000-0000-0000-0000-000000000000",
6+
"tables": {
7+
"example": {
8+
"name": "example",
9+
"columns": {
10+
"id": {
11+
"name": "id",
12+
"type": "integer",
13+
"primaryKey": true,
14+
"notNull": true,
15+
"autoincrement": false
16+
},
17+
"created_at": {
18+
"name": "created_at",
19+
"type": "text",
20+
"primaryKey": false,
21+
"notNull": false,
22+
"autoincrement": false,
23+
"default": "CURRENT_TIMESTAMP"
24+
}
25+
},
26+
"indexes": {},
27+
"foreignKeys": {},
28+
"compositePrimaryKeys": {},
29+
"uniqueConstraints": {}
30+
}
31+
},
32+
"enums": {},
33+
"_meta": {
34+
"schemas": {},
35+
"tables": {},
36+
"columns": {}
37+
}
38+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"version": "5",
3+
"dialect": "sqlite",
4+
"entries": [
5+
{
6+
"idx": 0,
7+
"version": "5",
8+
"when": 1697441145549,
9+
"tag": "0000_mute_groot",
10+
"breakpoints": true
11+
}
12+
]
13+
}

drizzle-orm/package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,27 @@
44
"scripts": {
55
"build": "remix build",
66
"dev": "remix dev",
7+
"generate": "drizzle-kit generate:sqlite",
78
"start": "remix-serve build",
89
"typecheck": "tsc"
910
},
1011
"dependencies": {
1112
"@remix-run/node": "^1.19.3",
1213
"@remix-run/react": "^1.19.3",
1314
"@remix-run/serve": "^1.19.3",
15+
"better-sqlite3": "^9.0.0",
16+
"drizzle-orm": "^0.28.6",
1417
"isbot": "^3.6.5",
1518
"react": "^18.2.0",
1619
"react-dom": "^18.2.0"
1720
},
1821
"devDependencies": {
1922
"@remix-run/dev": "^1.19.3",
2023
"@remix-run/eslint-config": "^1.19.3",
24+
"@types/better-sqlite3": "^7.6.5",
2125
"@types/react": "^18.0.25",
2226
"@types/react-dom": "^18.0.8",
27+
"drizzle-kit": "^0.19.13",
2328
"eslint": "^8.27.0",
2429
"typescript": "^4.8.4"
2530
},

0 commit comments

Comments
 (0)