diff --git a/public/svg/effect.svg b/public/svg/effect.svg new file mode 100644 index 00000000..d5d6db86 --- /dev/null +++ b/public/svg/effect.svg @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/public/svg/effect_light.svg b/public/svg/effect_light.svg new file mode 100644 index 00000000..433581e9 --- /dev/null +++ b/public/svg/effect_light.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/content/docs/_meta.json b/src/content/docs/_meta.json index 2387ad3d..c81f4b86 100644 --- a/src/content/docs/_meta.json +++ b/src/content/docs/_meta.json @@ -32,6 +32,7 @@ ["connect-pglite", "PGLite"], ["connect-nile", "Nile"], ["connect-bun-sql", "Bun SQL"], + ["connect-effect-postgres", "Effect Postgres"], "---", ["connect-planetscale", "PlanetScale"], ["connect-tidb", "TiDB"], diff --git a/src/content/docs/connect-effect-postgres.mdx b/src/content/docs/connect-effect-postgres.mdx new file mode 100644 index 00000000..0ee1b7cd --- /dev/null +++ b/src/content/docs/connect-effect-postgres.mdx @@ -0,0 +1,64 @@ +import Npm from "@mdx/Npm.astro"; +import Callout from '@mdx/Callout.astro'; +import AnchorCards from '@mdx/AnchorCards.astro'; +import Steps from '@mdx/Steps.astro'; +import WhatsNextPostgres from "@mdx/WhatsNextPostgres.astro"; +import Prerequisites from "@mdx/Prerequisites.astro"; +import CodeTabs from "@mdx/CodeTabs.astro"; + +# Drizzle \<\> Effect Postgres + + +This page explains concepts available on drizzle versions `1.0.0-beta.9` and higher. + +Effect is only available for PostgreSQL right now and soon be implemented for all other dialects + +On how to upgrade (read more [here](/docs/upgrade-v1)) + + + +- Database [connection basics](/docs/connect-overview) with Drizzle +- Effect - [website](https://effect.website/docs) +- Bun SQL - native bindings for working with PostgreSQL databases - [read here](https://bun.sh/docs/api/sql) +- **@effect/sql-pg** - A PostgreSQL toolkit for Effect - [read here](https://effect-ts.github.io/effect/docs/sql-pg) + + +Drizzle has native support for Effect PostgreSQL connections with the `@effect/sql-pg` driver + +#### Step 1 - Install packages + +drizzle-orm effect @effect/sql-pg pg +-D drizzle-kit + + +#### Step 2 - Initialize the driver and make a query +```typescript copy +import 'dotenv/config'; +import { drizzle } from 'drizzle-orm/effect-postgres'; +import { Effect, Redacted } from 'effect'; +import { PgClient } from '@effect/sql-pg' +import { types } from 'pg'; + +const clientLayer = PgClient.layer({ + url: Redacted.make(process.env.DATABASE_URL!); + types: { + getTypeParser: (typeId, format) => { + if ([1184, 1114, 1082, 1186, 1231, 1115, 1185, 1187, 1182].includes(typeId)) { + return (val: any) => val; + } + return types.getTypeParser(typeId, format); + }, + }, +}); + +const program = Effect.gen(function*() { + const client = yield* PgClient.PgClient; + const db = drizzle(client, { logger: true, /*...*/ }); +}); + +await Effect.runPromise(program).pipe(Effect.provide(clientLayer)); +``` + +#### What's next? + + diff --git a/src/content/docs/get-started/_meta.json b/src/content/docs/get-started/_meta.json index 93e93186..9d6eeb71 100644 --- a/src/content/docs/get-started/_meta.json +++ b/src/content/docs/get-started/_meta.json @@ -17,6 +17,8 @@ ["nile-existing", "PostgreSQL"], ["vercel-new", "PostgreSQL"], ["vercel-existing", "PostgreSQL"], + ["effect-postgresql-new", "PostgreSQL"], + ["effect-postgresql-existing", "PostgreSQL"], ["mysql-new", "MySQL"], ["mysql-existing", "MySQL"], ["planetscale-new", "MySQL"], diff --git a/src/content/docs/get-started/effect-postgresql-existing.mdx b/src/content/docs/get-started/effect-postgresql-existing.mdx new file mode 100644 index 00000000..d363bf42 --- /dev/null +++ b/src/content/docs/get-started/effect-postgresql-existing.mdx @@ -0,0 +1,201 @@ +import Tab from '@mdx/Tab.astro'; +import Tabs from '@mdx/Tabs.astro'; +import Npm from "@mdx/Npm.astro"; +import Callout from '@mdx/Callout.astro'; +import Steps from '@mdx/Steps.astro'; +import AnchorCards from '@mdx/AnchorCards.astro'; +import Breadcrumbs from '@mdx/Breadcrumbs.astro'; +import CodeTabs from "@mdx/CodeTabs.astro"; +import Prerequisites from "@mdx/Prerequisites.astro"; +import IntrospectPostgreSQL from '@mdx/get-started/postgresql/IntrospectPostgreSQL.mdx'; +import FileStructure from '@mdx/get-started/FileStructure.mdx'; +import InstallPackages from '@mdx/get-started/InstallPackages.mdx'; +import SetupConfig from '@mdx/get-started/SetupConfig.mdx'; +import SetupEnv from '@mdx/get-started/SetupEnv.mdx'; +import TransferCode from '@mdx/get-started/TransferCode.mdx'; +import ApplyChanges from '@mdx/get-started/ApplyChanges.mdx'; +import RunFile from '@mdx/get-started/RunFile.mdx'; +import ConnectEffect from '@mdx/get-started/postgresql/ConnectEffect.mdx' +import UpdateSchema from '@mdx/get-started/postgresql/UpdateSchema.mdx'; + + + +# Get Started with Drizzle and Effect PostgreSQL in existing project + + +This page explains concepts available on drizzle versions `1.0.0-beta.9` and higher. + +Effect is only available for PostgreSQL right now and soon be implemented for all other dialects + +On how to upgrade (read more [here](/docs/upgrade-v1)) + + + + - **Effect** - Effect is a powerful TS library designed to help developers easily create complex, synchronous, and asynchronous programs. - [read more](https://effect.website/docs) + - **dotenv** - package for managing environment variables - [read here](https://www.npmjs.com/package/dotenv) + - **tsx** - package for running TypeScript files - [read here](https://tsx.is/) + - **@effect/sql-pg** - A PostgreSQL toolkit for Effect - [read here](https://effect-ts.github.io/effect/docs/sql-pg) + + + + +#### Step 1 - Install **node-postgres** package + + +#### Step 2 - Setup connection variables + + + + +If you don't have a PostgreSQL database yet and want to create one for testing, you can use our guide on how to set up PostgreSQL in Docker. + +The PostgreSQL in Docker guide is available [here](/docs/guides/postgresql-local-setup). Go set it up, generate a database URL (explained in the guide), and come back for the next steps + + +#### Step 3 - Setup Drizzle config file + + + +#### Step 4 - Introspect your database + + + +#### Step 5 - Transfer code to your actual schema file + + + +#### Step 6 - Connect Drizzle ORM to the database + + + +#### Step 7 - Query the database + +```ts +import 'dotenv/config'; +import { drizzle } from 'drizzle-orm/effect-postgres'; +import { Effect, Redacted } from 'effect'; +import { PgClient } from '@effect/sql-pg' +import { types } from 'pg'; +import { usersTable } from './db/schema' + +const clientLayer = PgClient.layer({ + url: Redacted.make(process.env.DATABASE_URL!); + types: { + getTypeParser: (typeId, format) => { + if ([1184, 1114, 1082, 1186, 1231, 1115, 1185, 1187, 1182].includes(typeId)) return (val: any) => val; + return types.getTypeParser(typeId, format); + }, + }, +}); + +const program = Effect.gen(function*() { + const client = yield* PgClient.PgClient; + const db = drizzle(client, { logger: true, /*...*/ }); + + const user: typeof usersTable.$inferInsert = { + name: 'John', + age: 30, + email: 'john@example.com', + }; + + yield* db.insert(usersTable).values(user); + console.log('New user created!') + + const users = yield* db.select().from(usersTable); + console.log('Getting all users from the database: ', users) + /* + const users: { + id: number; + name: string; + age: number; + email: string; + }[] + */ + + yield* db + .update(usersTable) + .set({ + age: 31, + }) + .where(eq(usersTable.email, user.email)); + console.log('User info updated!') + + yield* db.delete(usersTable).where(eq(usersTable.email, user.email)); + console.log('User deleted!') +}); + +await Effect.runPromise(program).pipe(Effect.provide(clientLayer)); +``` + +#### Step 8 - Run index.ts file + + + +#### Step 9 - Update your table schema (optional) + + + +#### Step 10 - Applying changes to the database (optional) + + + +#### Step 11 - Query the database with a new field (optional) + +```ts +import 'dotenv/config'; +import { drizzle } from 'drizzle-orm/effect-postgres'; +import { Effect, Redacted } from 'effect'; +import { PgClient } from '@effect/sql-pg' +import { types } from 'pg'; +import { usersTable } from './db/schema' + +const clientLayer = PgClient.layer({ + url: Redacted.make(process.env.DATABASE_URL!); + types: { + getTypeParser: (typeId, format) => { + if ([1184, 1114, 1082, 1186, 1231, 1115, 1185, 1187, 1182].includes(typeId)) return (val: any) => val; + return types.getTypeParser(typeId, format); + }, + }, +}); + +const program = Effect.gen(function*() { + const client = yield* PgClient.PgClient; + const db = drizzle(client, { logger: true, /*...*/ }); + + const user: typeof usersTable.$inferInsert = { + name: 'John', + age: 30, + email: 'john@example.com', + phone: '123-456-7890', + }; + + yield* db.insert(usersTable).values(user); + console.log('New user created!') + + const users = yield* db.select().from(usersTable); + console.log('Getting all users from the database: ', users) + /* + const users: { + id: number; + name: string; + age: number; + email: string; + phone: string | null; + }[] + */ + + yield* db + .update(usersTable) + .set({ + age: 31, + }) + .where(eq(usersTable.email, user.email)); + console.log('User info updated!') + + yield* db.delete(usersTable).where(eq(usersTable.email, user.email)); + console.log('User deleted!') +}); + +await Effect.runPromise(program).pipe(Effect.provide(clientLayer)); +``` \ No newline at end of file diff --git a/src/content/docs/get-started/effect-postgresql-new.mdx b/src/content/docs/get-started/effect-postgresql-new.mdx new file mode 100644 index 00000000..4727a2da --- /dev/null +++ b/src/content/docs/get-started/effect-postgresql-new.mdx @@ -0,0 +1,135 @@ +import Tab from '@mdx/Tab.astro'; +import Tabs from '@mdx/Tabs.astro'; +import Npm from "@mdx/Npm.astro"; +import Callout from '@mdx/Callout.astro'; +import Steps from '@mdx/Steps.astro'; +import AnchorCards from '@mdx/AnchorCards.astro'; +import Breadcrumbs from '@mdx/Breadcrumbs.astro'; +import Prerequisites from "@mdx/Prerequisites.astro"; +import CodeTabs from "@mdx/CodeTabs.astro"; +import FileStructure from '@mdx/get-started/FileStructure.mdx'; +import InstallPackages from '@mdx/get-started/InstallPackages.mdx'; +import ConnectEffect from '@mdx/get-started/postgresql/ConnectEffect.mdx' +import CreateTable from '@mdx/get-started/postgresql/CreateTable.mdx' +import SetupConfig from '@mdx/get-started/SetupConfig.mdx'; +import ApplyChanges from '@mdx/get-started/ApplyChanges.mdx'; +import RunFile from '@mdx/get-started/RunFile.mdx'; +import QueryDatabase from '@mdx/get-started/QueryDatabase.mdx'; +import SetupEnv from '@mdx/get-started/SetupEnv.mdx'; + + + +# Get Started with Drizzle and Effect PostgreSQL + + +This page explains concepts available on drizzle versions `1.0.0-beta.9` and higher. + +Effect is only available for PostgreSQL right now and soon be implemented for all other dialects + +On how to upgrade (read more [here](/docs/upgrade-v1)) + + + + - **Effect** - Effect is a powerful TS library designed to help developers easily create complex, synchronous, and asynchronous programs. - [read more](https://effect.website/docs) + - **dotenv** - package for managing environment variables - [read here](https://www.npmjs.com/package/dotenv) + - **tsx** - package for running TypeScript files - [read here](https://tsx.is/) + - **@effect/sql-pg** - A PostgreSQL toolkit for Effect - [read here](https://effect-ts.github.io/effect/docs/sql-pg) + + +Drizzle has native support for Effect PostgreSQL connections with the `@effect/sql-pg` driver. + + + +#### Step 1 - Install **node-postgres** package + + +#### Step 2 - Setup connection variables + + + + +If you don't have a PostgreSQL database yet and want to create one for testing, you can use our guide on how to set up PostgreSQL in Docker. + +The PostgreSQL in Docker guide is available [here](/docs/guides/postgresql-local-setup). Go set it up, generate a database URL (explained in the guide), and come back for the next steps + + +#### Step 3 - Connect Drizzle ORM to the database + + + +#### Step 4 - Create a table + + + +#### Step 5 - Setup Drizzle config file + + + +#### Step 6 - Applying changes to the database + + + +#### Step 7 - Seed and Query the database + +Let's **update** the `src/index.ts` file with queries to create, read, update, and delete users + +```ts +import 'dotenv/config'; +import { drizzle } from 'drizzle-orm/effect-postgres'; +import { Effect, Redacted } from 'effect'; +import { PgClient } from '@effect/sql-pg' +import { types } from 'pg'; +import { usersTable } from './db/schema' + +const clientLayer = PgClient.layer({ + url: Redacted.make(process.env.DATABASE_URL!); + types: { + getTypeParser: (typeId, format) => { + if ([1184, 1114, 1082, 1186, 1231, 1115, 1185, 1187, 1182].includes(typeId)) return (val: any) => val; + return types.getTypeParser(typeId, format); + }, + }, +}); + +const program = Effect.gen(function*() { + const client = yield* PgClient.PgClient; + const db = drizzle(client, { logger: true, /*...*/ }); + + const user: typeof usersTable.$inferInsert = { + name: 'John', + age: 30, + email: 'john@example.com', + }; + + yield* db.insert(usersTable).values(user); + console.log('New user created!') + + const users = yield* db.select().from(usersTable); + console.log('Getting all users from the database: ', users) + /* + const users: { + id: number; + name: string; + age: number; + email: string; + }[] + */ + + yield* db + .update(usersTable) + .set({ + age: 31, + }) + .where(eq(usersTable.email, user.email)); + console.log('User info updated!') + + yield* db.delete(usersTable).where(eq(usersTable.email, user.email)); + console.log('User deleted!') +}); + +await Effect.runPromise(program).pipe(Effect.provide(clientLayer)); +``` + +#### Step 8 - Run index.ts file + + \ No newline at end of file diff --git a/src/content/docs/guides/include-or-exclude-columns.mdx b/src/content/docs/guides/include-or-exclude-columns.mdx index 9ccf43cc..b5703a52 100644 --- a/src/content/docs/guides/include-or-exclude-columns.mdx +++ b/src/content/docs/guides/include-or-exclude-columns.mdx @@ -8,6 +8,7 @@ import IsSupportedChipGroup from "@mdx/IsSupportedChipGroup.astro"; import Prerequisites from "@mdx/Prerequisites.astro"; import CodeTabs from '@mdx/CodeTabs.astro'; import CodeTab from '@mdx/CodeTab.astro'; +import Callout from "@mdx/Callout.astro"; diff --git a/src/content/docs/guides/point-datatype-psql.mdx b/src/content/docs/guides/point-datatype-psql.mdx index c98d330f..47bc48c3 100644 --- a/src/content/docs/guides/point-datatype-psql.mdx +++ b/src/content/docs/guides/point-datatype-psql.mdx @@ -7,6 +7,7 @@ import Section from "@mdx/Section.astro"; import Prerequisites from "@mdx/Prerequisites.astro"; import CodeTabs from '@mdx/CodeTabs.astro'; import CodeTab from '@mdx/CodeTab.astro'; +import Callout from "@mdx/Callout.astro"; - Get started with [PostgreSQL](/docs/get-started-postgresql) diff --git a/src/content/docs/guides/postgis-geometry-point.mdx b/src/content/docs/guides/postgis-geometry-point.mdx index 6bcd0ef2..bf18e085 100644 --- a/src/content/docs/guides/postgis-geometry-point.mdx +++ b/src/content/docs/guides/postgis-geometry-point.mdx @@ -6,6 +6,7 @@ slug: postgis-geometry-point import Section from "@mdx/Section.astro"; import Prerequisites from "@mdx/Prerequisites.astro"; import CodeTabs from '@mdx/CodeTabs.astro'; +import Callout from "@mdx/Callout.astro"; import CodeTab from '@mdx/CodeTab.astro'; diff --git a/src/content/docs/guides/postgresql-full-text-search.mdx b/src/content/docs/guides/postgresql-full-text-search.mdx index 9631b34b..67fc9e72 100644 --- a/src/content/docs/guides/postgresql-full-text-search.mdx +++ b/src/content/docs/guides/postgresql-full-text-search.mdx @@ -7,6 +7,7 @@ import Section from "@mdx/Section.astro"; import Prerequisites from "@mdx/Prerequisites.astro"; import CodeTabs from '@mdx/CodeTabs.astro'; import CodeTab from '@mdx/CodeTab.astro'; +import Callout from "@mdx/Callout.astro"; - Get started with [PostgreSQL](/docs/get-started-postgresql) diff --git a/src/content/docs/guides/upsert.mdx b/src/content/docs/guides/upsert.mdx index cc4d0284..cac24273 100644 --- a/src/content/docs/guides/upsert.mdx +++ b/src/content/docs/guides/upsert.mdx @@ -7,6 +7,7 @@ import Section from "@mdx/Section.astro"; import IsSupportedChipGroup from "@mdx/IsSupportedChipGroup.astro"; import Prerequisites from "@mdx/Prerequisites.astro"; import CodeTabs from '@mdx/CodeTabs.astro'; +import Callout from "@mdx/Callout.astro"; import CodeTab from '@mdx/CodeTab.astro'; diff --git a/src/mdx/GetStartedLinks/data.ts b/src/mdx/GetStartedLinks/data.ts index 26b2c7dc..27ac7bac 100644 --- a/src/mdx/GetStartedLinks/data.ts +++ b/src/mdx/GetStartedLinks/data.ts @@ -187,6 +187,28 @@ export const getStartedItems: GetStartedItems = [ }, }, }, + { + name: "Effect", + path: { + existing: "/docs/get-started/effect-postgresql-existing", + new: "/docs/get-started/effect-postgresql-new", + }, + icon: { + light: { + path: "/public/svg/effect_light.svg", + style: { + width: 20, + }, + }, + dark: { + path: "/public/svg/effect.svg", + style: { + width: 20, + fill: "#f0f0f0", + }, + }, + }, + }, ], }, { diff --git a/src/mdx/get-started/postgresql/ConnectEffect.mdx b/src/mdx/get-started/postgresql/ConnectEffect.mdx new file mode 100644 index 00000000..1db8d7a4 --- /dev/null +++ b/src/mdx/get-started/postgresql/ConnectEffect.mdx @@ -0,0 +1,28 @@ +Create a `index.ts` file in the `src` directory and initialize the connection: + +```typescript copy +import 'dotenv/config'; +import { drizzle } from 'drizzle-orm/effect-postgres'; +import { Effect, Redacted } from 'effect'; +import { PgClient } from '@effect/sql-pg' +import { types } from 'pg'; + +const clientLayer = PgClient.layer({ + url: Redacted.make(process.env.DATABASE_URL!); + types: { + getTypeParser: (typeId, format) => { + if ([1184, 1114, 1082, 1186, 1231, 1115, 1185, 1187, 1182].includes(typeId)) { + return (val: any) => val; + } + return types.getTypeParser(typeId, format); + }, + }, +}); + +const program = Effect.gen(function*() { + const client = yield* PgClient.PgClient; + const db = drizzle(client, { logger: true, /*...*/ }); +}); + +await Effect.runPromise(program).pipe(Effect.provide(clientLayer)); +``` \ No newline at end of file