MySQL 从版本 8.0.13
开始支持函数式索引。为了语法正确,表达式应使用括号括起来,例如 (lower(column))
。
Drizzle | 唯一且不区分大小写的邮箱处理
本指南假定您熟悉
- 开始使用 PostgreSQL、 MySQL 和 SQLite
- 索引
- Insert 语句和 Select 方法
- sql 运算符
- 您应该安装
[email protected]
和[email protected]
或更高版本。
PostgreSQL
要在 PostgreSQL 中使用 Drizzle 实现唯一且不区分大小写的 email
处理,您可以在小写 email
列上创建唯一索引。这样,您可以确保 email
无论大小写都唯一。
Drizzle 拥有简单灵活的 API,让您可以使用类似 SQL 的语法轻松创建此类索引
schema.ts
migration.sql
import { SQL, sql } from 'drizzle-orm';
import { AnyPgColumn, pgTable, serial, text, uniqueIndex } from 'drizzle-orm/pg-core';
export const users = pgTable(
'users',
{
id: serial('id').primaryKey(),
name: text('name').notNull(),
email: text('email').notNull(),
},
(table) => [
// uniqueIndex('emailUniqueIndex').on(sql`lower(${table.email})`),
uniqueIndex('emailUniqueIndex').on(lower(table.email)),
],
);
// custom lower function
export function lower(email: AnyPgColumn): SQL {
return sql`lower(${email})`;
}
您可以通过 lower
函数根据 email
选择用户,如下所示
import { eq } from 'drizzle-orm';
import { lower, users } from './schema';
const db = drizzle(...);
const findUserByEmail = async (email: string) => {
return await db
.select()
.from(users)
.where(eq(lower(users.email), email.toLowerCase()));
};
select * from "users" where lower(email) = '[email protected]';
MySQL
在 MySQL 中,字符串比较的默认排序规则设置是不区分大小写的,这意味着在 SQL 查询中执行搜索或比较字符串等操作时,字符的大小写不会影响结果。然而,由于排序规则设置可能有所不同,并且可能配置为区分大小写,我们将通过在小写 email
列上创建唯一索引来明确确保 email
不区分大小写地唯一。
Drizzle 拥有简单灵活的 API,让您可以使用类似 SQL 的语法轻松创建此类索引
schema.ts
migration.sql
import { SQL, sql } from 'drizzle-orm';
import { AnyMySqlColumn, mysqlTable, serial, uniqueIndex, varchar } from 'drizzle-orm/mysql-core';
export const users = mysqlTable(
'users',
{
id: serial('id').primaryKey(),
name: varchar('name', { length: 255 }).notNull(),
email: varchar('email', { length: 255 }).notNull(),
},
(table) => [
// uniqueIndex('emailUniqueIndex').on(sql`(lower(${table.email}))`),
uniqueIndex('emailUniqueIndex').on(lower(table.email)),
]
);
// custom lower function
export function lower(email: AnyMySqlColumn): SQL {
return sql`(lower(${email}))`;
}
重要提示
您可以通过 lower
函数根据 email
选择用户,如下所示
import { eq } from 'drizzle-orm';
import { lower, users } from './schema';
const db = drizzle(...);
const findUserByEmail = async (email: string) => {
return await db
.select()
.from(users)
.where(eq(lower(users.email), email.toLowerCase()));
};
select * from `users` where lower(email) = '[email protected]';
SQLite
要在 SQLite 中使用 Drizzle 实现唯一且不区分大小写的 email
处理,您可以在小写 email
列上创建唯一索引。这样,您可以确保 email
无论大小写都唯一。
Drizzle 拥有简单灵活的 API,让您可以使用类似 SQL 的语法轻松创建此类索引
schema.ts
migration.sql
import { SQL, sql } from 'drizzle-orm';
import { AnySQLiteColumn, integer, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core';
export const users = sqliteTable(
'users',
{
id: integer('id').primaryKey(),
name: text('name').notNull(),
email: text('email').notNull(),
},
(table) => [
// uniqueIndex('emailUniqueIndex').on(sql`lower(${table.email})`),
uniqueIndex('emailUniqueIndex').on(lower(table.email)),
]
);
// custom lower function
export function lower(email: AnySQLiteColumn): SQL {
return sql`lower(${email})`;
}
您可以通过 lower
函数根据 email
选择用户,如下所示
import { eq } from 'drizzle-orm';
import { lower, users } from './schema';
const db = drizzle(...);
const findUserByEmail = async (email: string) => {
return await db
.select()
.from(users)
.where(eq(lower(users.email), email.toLowerCase()));
};
select * from "users" where lower(email) = '[email protected]';