Become a Gold Sponsor
Drizzle | 唯一且不区分大小写的电子邮件处理
This guide assumes familiarity with:

PostgreSQL

要在 PostgreSQL 中使用 Drizzle 实现唯一且不区分大小写的 email 处理,你可以在小写的 email 列上创建一个唯一索引。这样可以确保 email 在不考虑大小写的情况下是唯一的。

Drizzle 提供了简单灵活的 API,让你可以轻松使用 SQL 类似的语法创建这样的索引:

schema.ts
migration.sql
import { SQL, sql } from 'drizzle-orm';
import { 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) => ({
    // emailUniqueIndex: uniqueIndex('emailUniqueIndex').on(sql`lower(${table.email})`),
    emailUniqueIndex: uniqueIndex('emailUniqueIndex').on(lower(table.email)),
  }),
);

// 自定义小写函数
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) = 'john@email.com';

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) => ({
    // emailUniqueIndex: uniqueIndex('emailUniqueIndex').on(sql`(lower(${table.email}))`),
    emailUniqueIndex: uniqueIndex('emailUniqueIndex').on(lower(table.email)),
  }),
);

// 自定义小写函数
export function lower(email: AnyMySqlColumn): SQL {
  return sql`(lower(${email}))`;
}
IMPORTANT

函数索引在 MySQL 8.0.13 版本开始得到支持。对于正确的语法,表达式应被括号括起来,例如,(lower(column))

这就是你如何使用 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) = 'john@email.com';

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) => ({
    // emailUniqueIndex: uniqueIndex('emailUniqueIndex').on(sql`lower(${table.email})`),
    emailUniqueIndex: uniqueIndex('emailUniqueIndex').on(lower(table.email)),
  }),
);

// 自定义小写函数
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) = 'john@email.com';