Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enums custom schema #2048

Merged
merged 42 commits into from
Mar 20, 2024
Merged
Changes from 1 commit
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
197fe9f
Add optional dependency
SferaDev Feb 19, 2024
bbe5598
Add wire protocol driver
SferaDev Feb 19, 2024
166046f
Add http client
SferaDev Mar 7, 2024
0ea0a21
Merge branch 'main' into xata
SferaDev Mar 8, 2024
51916c2
Merge branch 'main' into xata
SferaDev Mar 11, 2024
ffe44a7
Merge branch 'main' into xata
SferaDev Mar 13, 2024
ab1cfdf
Merge pull request #2008 from drizzle-team/beta
AndriiSherman Mar 14, 2024
5eaac68
Merge branch 'beta' into xata
AndriiSherman Mar 14, 2024
0d856d8
Remove xata-pg
SferaDev Mar 15, 2024
e46c22c
Update dependency
SferaDev Mar 15, 2024
6ce62ea
Update migrator
SferaDev Mar 15, 2024
e3498d8
Add xata test setup
AndriiSherman Mar 15, 2024
29c3216
Merge branch 'xata' of github.com:SferaDev/drizzle-orm into xata
AndriiSherman Mar 15, 2024
e09845c
Fix a few tests for xata-http
AndriiSherman Mar 16, 2024
be1fd1a
Fix sqlite-proxy run behaviour
AndriiSherman Mar 16, 2024
e4bc89e
Fix Neon HTTP driver types, implement raw query support for batch, fi…
dankochetov Mar 18, 2024
beb9359
Fix JSON formatting config
dankochetov Mar 18, 2024
34d3108
Update dprint ignore
dankochetov Mar 18, 2024
bf39e45
Bump ORM version
dankochetov Mar 18, 2024
91968c5
Merge pull request #2033 from drizzle-team/fix-neon-http-types
dankochetov Mar 18, 2024
788f251
Fix typos in pipeline
dankochetov Mar 18, 2024
722a662
Merge branch 'main' into fix-neon-http-types
dankochetov Mar 18, 2024
6e8fe77
Bump actions versions
dankochetov Mar 18, 2024
96c8046
Fix flag
dankochetov Mar 18, 2024
6c3ff8e
Merge pull request #2036 from drizzle-team/pipeline-updates
dankochetov Mar 18, 2024
676d917
Merge branch 'main' into proxy-run
dankochetov Mar 18, 2024
3a26b09
Update changelog
dankochetov Mar 18, 2024
d09eaba
Merge pull request #2034 from drizzle-team/fix-neon-http-types
dankochetov Mar 18, 2024
52a2278
Merge pull request #2038 from drizzle-team/proxy-run
dankochetov Mar 18, 2024
995ecca
Bump action versions
dankochetov Mar 18, 2024
f2ec232
Merge pull request #2039 from drizzle-team/fix-neon-http-types
dankochetov Mar 18, 2024
d96f264
Add Xata http client
SferaDev Mar 7, 2024
04e4880
Merge branch 'xata' of github.com:SferaDev/drizzle-orm into xata
AndriiSherman Mar 19, 2024
9ea7d5f
Move tests to vitest
AndriiSherman Mar 19, 2024
d693765
Add release notes and bump version
AndriiSherman Mar 19, 2024
b905e92
Remove xata-http from ava tests
AndriiSherman Mar 19, 2024
85f6d5e
-
AndriiSherman Mar 19, 2024
c9a0caa
Merge pull request #1902 from SferaDev/xata
AndriiSherman Mar 19, 2024
9448a16
Fix pipeline xata tests
AndriiSherman Mar 19, 2024
3216719
Fix reject test for xata-http
AndriiSherman Mar 19, 2024
c24e818
Add custom schema support to Postgres enums
dankochetov Mar 20, 2024
9e6a6ee
Add Xata credentials to branch pipeline
dankochetov Mar 20, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion drizzle-orm/package.json
Original file line number Diff line number Diff line change
@@ -157,7 +157,7 @@
"@types/react": "^18.2.45",
"@types/sql.js": "^1.4.4",
"@vercel/postgres": "^0.3.0",
"@xata.io/client": "^0.29.1",
"@xata.io/client": "^0.29.3",
"better-sqlite3": "^8.4.0",
"bun-types": "^0.6.6",
"cpy": "^10.1.0",
95 changes: 52 additions & 43 deletions drizzle-orm/src/xata-http/driver.ts
Original file line number Diff line number Diff line change
@@ -6,65 +6,74 @@ import { PgDialect } from '~/pg-core/dialect.ts';
import type { ExtractTablesWithRelations, RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';
import { createTableRelationsHelpers, extractTablesRelationalConfig } from '~/relations.ts';
import type { DrizzleConfig } from '~/utils.ts';
import { XataHttpClient, XataHttpQueryResultHKT, XataHttpSession } from './session.ts';
import type { XataHttpClient, XataHttpQueryResultHKT } from './session.ts';
import { XataHttpSession } from './session.ts';

export interface XataDriverOptions {
logger?: Logger;
logger?: Logger;
}

export class XataHttpDriver {
static readonly [entityKind]: string = 'XataDriver';
static readonly [entityKind]: string = 'XataDriver';

constructor(
private client: XataHttpClient,
private dialect: PgDialect,
private options: XataDriverOptions = {}
) {
this.initMappers();
}
constructor(
private client: XataHttpClient,
private dialect: PgDialect,
private options: XataDriverOptions = {},
) {
this.initMappers();
}

createSession(schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined): XataHttpSession<Record<string, unknown>, TablesRelationalConfig> {
return new XataHttpSession(this.client, this.dialect, schema, {
logger: this.options.logger
});
}
createSession(
schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined,
): XataHttpSession<Record<string, unknown>, TablesRelationalConfig> {
return new XataHttpSession(this.client, this.dialect, schema, {
logger: this.options.logger,
});
}

initMappers() {
// TODO: Add custom type parsers
}
initMappers() {
// TODO: Add custom type parsers
}
}

export class XataHttpDatabase<TSchema extends Record<string, unknown> = Record<string, never>> extends PgDatabase<XataHttpQueryResultHKT, TSchema> {
static readonly [entityKind]: string = 'XataHttpDatabase';
export class XataHttpDatabase<TSchema extends Record<string, unknown> = Record<string, never>>
extends PgDatabase<XataHttpQueryResultHKT, TSchema>
{
static readonly [entityKind]: string = 'XataHttpDatabase';

/** @internal */
declare readonly session: XataHttpSession<TSchema, ExtractTablesWithRelations<TSchema>>;
/** @internal */
declare readonly session: XataHttpSession<TSchema, ExtractTablesWithRelations<TSchema>>;
}

export function drizzle<TSchema extends Record<string, unknown> = Record<string, never>>(
client: XataHttpClient,
config: DrizzleConfig<TSchema> = {}
client: XataHttpClient,
config: DrizzleConfig<TSchema> = {},
): XataHttpDatabase<TSchema> {
const dialect = new PgDialect();
let logger;
if (config.logger === true) {
logger = new DefaultLogger();
} else if (config.logger !== false) {
logger = config.logger;
}
const dialect = new PgDialect();
let logger;
if (config.logger === true) {
logger = new DefaultLogger();
} else if (config.logger !== false) {
logger = config.logger;
}

let schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;
if (config.schema) {
const tablesConfig = extractTablesRelationalConfig(config.schema, createTableRelationsHelpers);
schema = {
fullSchema: config.schema,
schema: tablesConfig.tables,
tableNamesMap: tablesConfig.tableNamesMap
};
}
let schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;
if (config.schema) {
const tablesConfig = extractTablesRelationalConfig(config.schema, createTableRelationsHelpers);
schema = {
fullSchema: config.schema,
schema: tablesConfig.tables,
tableNamesMap: tablesConfig.tableNamesMap,
};
}

const driver = new XataHttpDriver(client, dialect, { logger });
const session = driver.createSession(schema);
const driver = new XataHttpDriver(client, dialect, { logger });
const session = driver.createSession(schema);

return new XataHttpDatabase(dialect, session, schema as RelationalSchemaConfig<ExtractTablesWithRelations<TSchema>> | undefined);
return new XataHttpDatabase(
dialect,
session,
schema as RelationalSchemaConfig<ExtractTablesWithRelations<TSchema>> | undefined,
);
}
63 changes: 38 additions & 25 deletions drizzle-orm/src/xata-http/migrator.ts
Original file line number Diff line number Diff line change
@@ -11,39 +11,52 @@ import type { XataHttpDatabase } from './driver.ts';
* @param db - drizzle db instance
* @param config - path to migration folder generated by drizzle-kit
*/
export async function migrate<TSchema extends Record<string, unknown>>(db: XataHttpDatabase<TSchema>, config: string | MigrationConfig) {
const migrations = readMigrationFiles(config);
const migrationsTable = typeof config === 'string' ? '__drizzle_migrations' : config.migrationsTable ?? '__drizzle_migrations';
const migrationsSchema = typeof config === 'string' ? 'drizzle' : config.migrationsSchema ?? 'drizzle';
const migrationTableCreate = sql`
export async function migrate<TSchema extends Record<string, unknown>>(
db: XataHttpDatabase<TSchema>,
config: string | MigrationConfig,
) {
const migrations = readMigrationFiles(config);
const migrationsTable = typeof config === 'string'
? '__drizzle_migrations'
: config.migrationsTable ?? '__drizzle_migrations';
const migrationsSchema = typeof config === 'string' ? 'drizzle' : config.migrationsSchema ?? 'drizzle';
const migrationTableCreate = sql`
CREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)} (
id SERIAL PRIMARY KEY,
hash text NOT NULL,
created_at bigint
)
`;
await db.session.execute(sql`CREATE SCHEMA IF NOT EXISTS ${sql.identifier(migrationsSchema)}`);
await db.session.execute(migrationTableCreate);
await db.session.execute(sql`CREATE SCHEMA IF NOT EXISTS ${sql.identifier(migrationsSchema)}`);
await db.session.execute(migrationTableCreate);

const dbMigrations = await db.session.all<{
id: number;
hash: string;
created_at: string;
}>(sql`select id, hash, created_at from ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)} order by created_at desc limit 1`);
const dbMigrations = await db.session.all<{
id: number;
hash: string;
created_at: string;
}>(
sql`select id, hash, created_at from ${sql.identifier(migrationsSchema)}.${
sql.identifier(migrationsTable)
} order by created_at desc limit 1`,
);

const lastDbMigration = dbMigrations[0];
const rowsToInsert: SQL[] = [];
for await (const migration of migrations) {
if (!lastDbMigration || Number(lastDbMigration.created_at) < migration.folderMillis) {
for (const stmt of migration.sql) {
await db.session.execute(sql.raw(stmt));
}
const lastDbMigration = dbMigrations[0];
const rowsToInsert: SQL[] = [];
for await (const migration of migrations) {
if (!lastDbMigration || Number(lastDbMigration.created_at) < migration.folderMillis) {
for (const stmt of migration.sql) {
await db.session.execute(sql.raw(stmt));
}

rowsToInsert.push(sql`insert into ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)} ("hash", "created_at") values(${migration.hash}, ${migration.folderMillis})`);
}
}
rowsToInsert.push(
sql`insert into ${sql.identifier(migrationsSchema)}.${
sql.identifier(migrationsTable)
} ("hash", "created_at") values(${migration.hash}, ${migration.folderMillis})`,
);
}
}

for await (const rowToInsert of rowsToInsert) {
await db.session.execute(rowToInsert);
}
for await (const rowToInsert of rowsToInsert) {
await db.session.execute(rowToInsert);
}
}
Loading