src/content/docs/drizzle-kit-pull.mdx
import CodeTab from "@mdx/CodeTab.astro"; import CodeTabs from "@mdx/CodeTabs.astro"; import Section from "@mdx/Section.astro"; import Tab from "@mdx/Tab.astro"; import Tabs from "@mdx/Tabs.astro"; import Callout from "@mdx/Callout.astro"; import Prerequisites from "@mdx/Prerequisites.astro"; import Drivers from "@mdx/Drivers.mdx" import Dialects from "@mdx/Dialects.mdx" import Npm from "@mdx/Npm.astro" import Npx from "@mdx/Npx.astro"
drizzle-kit pulldrizzle-kit pull lets you literally pull(introspect) your existing database schema and generate schema.ts drizzle schema file,
it is designed to cover database first approach of Drizzle migrations.
export const users = p.pgTable("users", { id: p.serial().primaryKey(), name: p.text(), email: p.text().unique(), };
</Section>
</Callout>
It is a great approach if you need to manage database schema outside of your TypeScript project or
you're using database, which is managed by somebody else.
<hr/>
`drizzle-kit pull` requires you to specify `dialect` and either
database connection `url` or `user:password@host:port/db` params, you can provide them
either via [drizzle.config.ts](/docs/drizzle-config-file) config file or via CLI options:
<CodeTabs items={["With config file", "With CLI options"]}>
<Section>
```ts
// drizzle.config.ts
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "postgresql",
dbCredentials: {
url: "postgresql://user:password@host:port/dbname",
},
});
npx drizzle-kit pull
npx drizzle-kit pull --dialect=postgresql --url=postgresql://user:password@host:port/dbname
You can have multiple config files in the project, it's very useful when you have multiple database stages or multiple databases or different databases on the same project:
<Npx> drizzle-kit pull --config=drizzle-dev.config.ts drizzle-kit pull --config=drizzle-prod.config.ts </Npx> ```plaintext {5-6} 📦 <project root> ├ 📂 drizzle ├ 📂 src ├ 📜 .env ├ 📜 drizzle-dev.config.ts ├ 📜 drizzle-prod.config.ts ├ 📜 package.json └ 📜 tsconfig.json ```For embedded databases Drizzle provides embedded migrations - check out our get started guide.
</Callout>
Drizzle Kit does not come with a pre-bundled database driver,
it will automatically pick available database driver from your current project based on the dialect - see discussion.
Mostly all drivers of the same dialect share the same set of connection params,
as for exceptions like aws-data-api, pglight and d1-http - you will have to explicitely specify driver param.
<CodeTabs items={["AWS Data API", "PGLite", "Cloudflare D1 HTTP"]}>
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "postgresql",
driver: "aws-data-api",
dbCredentials: {
database: "database",
resourceArn: "resourceArn",
secretArn: "secretArn",
},
};
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "postgresql",
driver: "pglite",
dbCredentials: {
// inmemory
url: ":memory:"
// or database folder
url: "./database/"
},
};
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "sqlite",
driver: "d1-http",
dbCredentials: {
accountId: "accountId",
databaseId: "databaseId",
token: "token",
},
};
You can use the --init flag to mark the pulled schema as an applied migration in your database,
so that all subsequent migrations are diffed against the initial one
npx drizzle-kit push --init
drizzle-kit push will by default manage all tables in public schema.
You can configure list of tables, schemas and extensions via tablesFilters, schemaFilter and extensionFilters options.
tablesFilter | glob based table names filter, e.g. ["users", "user_info"] or "user*". Default is "*" |
schemaFilter | glob based schema names filter, e.g. ["public", "drizzle"] or "drizzle*". Default is "*" |
extensionsFilters | List of installed database extensions, e.g. ["postgis"]. Default is [] |
Let's configure drizzle-kit to only operate with all tables in public schema and let drizzle-kit know that there's a postgis extension installed, which creates it's own tables in public schema, so drizzle can ignore them.
<Section> ```ts filename="drizzle.config.ts" {9-11} import { defineConfig } from "drizzle-kit";export default defineConfig({ dialect: "postgresql", schema: "./src/schema.ts", dbCredentials: { url: "postgresql://user:password@host:port/dbname", }, extensionsFilters: ["postgis"], schemaFilter: ["public"], tablesFilter: ["*"], });
```shell
npx drizzle-kit push
We recommend configuring drizzle-kit through drizzle.config.ts file,
yet you can provide all configuration options through CLI if necessary, e.g. in CI/CD pipelines, etc.
dialect | required | Database dialect, one of <Dialects/> |
driver | Drivers exceptions <Drivers/> | |
out | Migrations output folder path, default is ./drizzle | |
url | Database connection string | |
user | Database user | |
password | Database password | |
host | Host | |
port | Port | |
database | Database name | |
config | Configuration file path, default is drizzle.config.ts | |
introspect-casing | Strategy for JS keys creation in columns, tables, etc. preserve camel | |
tablesFilter | Table name filter | |
schemaFilter | Schema name filter. Default: ["public"] | |
extensionsFilters | Database extensions internal database filters |