Back to Drizzle Orm

DrizzleORM v0.28.6 release

src/content/docs/latest-releases/drizzle-orm-v0286.mdx

latest4.0 KB
Original Source

import Section from "@mdx/Section.astro";

Changes

Note: MySQL datetime with mode: 'date' will now store dates in UTC strings and retrieve data in UTC as well to align with MySQL behavior for datetime. If you need a different behavior and want to handle datetime mapping in a different way, please use mode: 'string' or Custom Types implementation

Check Fix Datetime mapping for MySQL for implementation details

New Features

🎉 LibSQL batch api support

Reference: https://docs.turso.tech/reference/client-access/javascript-typescript-sdk#execute-a-batch-of-statements

Batch API usage example:

<Section> ```ts copy {1} const batchResponse = await db.batch([ db.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id, }), db.update(usersTable).set({ name: 'Dan' }).where(eq(usersTable.id, 1)), db.query.usersTable.findMany({}), db.select().from(usersTable).where(eq(usersTable.id, 1)), db.select({ id: usersTable.id, invitedBy: usersTable.invitedBy }).from( usersTable, ), ]); ```
ts
type BatchResponse = [
	{
		id: number;
	}[],
	ResultSet,
	{
		id: number;
		name: string;
		verified: number;
		invitedBy: number | null;
	}[],
	{
		id: number;
		name: string;
		verified: number;
		invitedBy: number | null;
	}[],
	{
		id: number;
		invitedBy: number | null;
	}[],
];
</Section>

All possible builders that can be used inside db.batch:

ts
`db.all()`,
`db.get()`,
`db.values()`,
`db.run()`,
`db.query.<table>.findMany()`,
`db.query.<table>.findFirst()`,
`db.select()...`,
`db.update()...`,
`db.delete()...`,
`db.insert()...`,

More usage examples here: integration-tests/tests/libsql-batch.test.ts and in docs

🎉 Add json mode for text in SQLite

Read more in docs

ts
const test = sqliteTable('test', {
	dataTyped: text('data_typed', { mode: 'json' }).$type<{ a: 1 }>().notNull(),
});

🎉 Add .toSQL() to Relational Query API calls

ts
const query = db.query.usersTable.findFirst().toSQL();

🎉 Added new PostgreSQL operators for Arrays

List of operators and usage examples arrayContains, arrayContained, arrayOverlaps

Read more in docs

ts
const contains = await db.select({ id: posts.id }).from(posts)
	.where(arrayContains(posts.tags, ['Typescript', 'ORM']));

const contained = await db.select({ id: posts.id }).from(posts)
	.where(arrayContained(posts.tags, ['Typescript', 'ORM']));

const overlaps = await db.select({ id: posts.id }).from(posts)
	.where(arrayOverlaps(posts.tags, ['Typescript', 'ORM']));

const withSubQuery = await db.select({ id: posts.id }).from(posts)
	.where(arrayContains(
		posts.tags,
		db.select({ tags: posts.tags }).from(posts).where(eq(posts.id, 1)),
	));

🎉 Add more SQL operators for where filter function in Relational Queries

You can find more examples in docs

<Section> ```ts // Before import { inArray } from "drizzle-orm/pg-core";

await db.users.findFirst({ where: (table, _) => inArray(table.id, [ ... ]) })


```ts copy {3}
// After
await db.users.findFirst({
  where: (table, { inArray }) => inArray(table.id, [ ... ])
})
</Section>

Fixes

  • Correct where in on conflict in sqlite (#1076)
  • Fix libsql/client type import (#1122)
  • Fix: raw sql query not being mapped properly on RDS (#1071)
  • Fix Datetime mapping for MySQL (#1082)
  • Fix smallserial generating as serial (#1127)