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