From 83124dcccbb8123428ffcd4e8b8d47b757d6ab71 Mon Sep 17 00:00:00 2001 From: Hajbo Date: Sun, 24 Sep 2023 13:40:08 +0200 Subject: [PATCH] Working drizzle integration --- .gitignore | 4 + bun.lockb | Bin 39771 -> 73078 bytes drizzle.config.ts | 11 +++ package.json | 4 + src/db/index.ts | 26 ++++++ src/db/migrations/0000_wandering_eternals.sql | 10 +++ src/db/migrations/meta/0000_snapshot.json | 81 ++++++++++++++++++ src/db/migrations/meta/_journal.json | 13 +++ src/db/schemas/users.ts | 24 ++++++ 9 files changed, 173 insertions(+) create mode 100644 drizzle.config.ts create mode 100644 src/db/index.ts create mode 100644 src/db/migrations/0000_wandering_eternals.sql create mode 100644 src/db/migrations/meta/0000_snapshot.json create mode 100644 src/db/migrations/meta/_journal.json create mode 100644 src/db/schemas/users.ts diff --git a/.gitignore b/.gitignore index a33a521..d9f626a 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,7 @@ Thumbs.db npm-debug.log* yarn-debug.log* yarn-error.log* + + +# db +sqlite.db \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index dde1261d3b8cd99011c899071e08b1bdbb4c8c35..4420297397d4e7514abd8582827406be4d4255ce 100755 GIT binary patch literal 73078 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 delta 9212 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 diff --git a/drizzle.config.ts b/drizzle.config.ts new file mode 100644 index 0000000..c8e5d7e --- /dev/null +++ b/drizzle.config.ts @@ -0,0 +1,11 @@ +import type { Config } from "drizzle-kit"; + +export default { + out: "./src/db/migrations", + schema: "./src/db/schemas/*.ts", + breakpoints: false, + driver: "better-sqlite", + dbCredentials: { + url: "./src/db/sqlite.db", + } +} satisfies Config; \ No newline at end of file diff --git a/package.json b/package.json index ae39c4d..28f3c7c 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,14 @@ "docs:preview": "vitepress preview docs" }, "dependencies": { + "drizzle-orm": "^0.28.6", + "drizzle-typebox": "^0.1.1", "elysia": "latest" }, "devDependencies": { + "better-sqlite3": "^8.6.0", "bun-types": "latest", + "drizzle-kit": "^0.19.13", "vitepress": "^1.0.0-rc.15" }, "peerDependencies": { diff --git a/src/db/index.ts b/src/db/index.ts new file mode 100644 index 0000000..3b16155 --- /dev/null +++ b/src/db/index.ts @@ -0,0 +1,26 @@ + +import { Database } from 'bun:sqlite'; +import { migrate } from "drizzle-orm/better-sqlite3/migrator"; +import { drizzle, BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite'; + +import { users } from './schemas/users'; + +const sqlite = new Database('sqlite.db'); +const db: BunSQLiteDatabase = drizzle(sqlite); + +migrate(db, { migrationsFolder: "./migrations" }); + +console.log("Migrations complete.") +const data = { + email: 'test@email.com', + username: 'test', + password: 'test', + bio: 'test', + image: 'test', +} +console.log("Inserting user: ", data) +await db.insert(users).values(data) +console.log("User inserted") + +const userResult = await db.select().from(users); +console.log("User result: ", userResult); \ No newline at end of file diff --git a/src/db/migrations/0000_wandering_eternals.sql b/src/db/migrations/0000_wandering_eternals.sql new file mode 100644 index 0000000..b89c535 --- /dev/null +++ b/src/db/migrations/0000_wandering_eternals.sql @@ -0,0 +1,10 @@ +CREATE TABLE `users` ( + `id` integer PRIMARY KEY NOT NULL, + `email` text NOT NULL, + `bio` text NOT NULL, + `image` text NOT NULL, + `password` text NOT NULL, + `username` text NOT NULL, + `created_at` text DEFAULT CURRENT_DATE, + `updated_at` text DEFAULT CURRENT_DATE +); diff --git a/src/db/migrations/meta/0000_snapshot.json b/src/db/migrations/meta/0000_snapshot.json new file mode 100644 index 0000000..ca5f8a3 --- /dev/null +++ b/src/db/migrations/meta/0000_snapshot.json @@ -0,0 +1,81 @@ +{ + "version": "5", + "dialect": "sqlite", + "id": "2cdf5b8c-f514-4adc-9975-d13386512c76", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "users": { + "name": "users", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_DATE" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_DATE" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + } +} \ No newline at end of file diff --git a/src/db/migrations/meta/_journal.json b/src/db/migrations/meta/_journal.json new file mode 100644 index 0000000..9c4883c --- /dev/null +++ b/src/db/migrations/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "5", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1695555519769, + "tag": "0000_wandering_eternals", + "breakpoints": false + } + ] +} \ No newline at end of file diff --git a/src/db/schemas/users.ts b/src/db/schemas/users.ts new file mode 100644 index 0000000..4cc86d9 --- /dev/null +++ b/src/db/schemas/users.ts @@ -0,0 +1,24 @@ +import { sql } from "drizzle-orm"; +import { integer, sqliteTable, text} from "drizzle-orm/sqlite-core"; +import { createInsertSchema, createSelectSchema } from 'drizzle-typebox'; + + + +export const users = sqliteTable('users', { + id: integer('id').primaryKey(), + email: text('email').notNull(), + bio: text('bio').notNull(), + image: text('image').notNull(), + password: text('password').notNull(), + username: text('username').notNull(), + created_at: text('created_at').default(sql`CURRENT_DATE`), + updated_at: text('updated_at').default(sql`CURRENT_DATE`), +}); + + + +// Schema for inserting a user - can be used to validate API requests +export const insertUserSchema = createInsertSchema(users); + +// Schema for selecting a user - can be used to validate API responses +export const selectUserSchema = createSelectSchema(users); \ No newline at end of file