ORM Party

Querying

Select ORMs to compare

Pick one or more ORMs from the bar above

Filter (WHERE)

SQL

SELECT * FROM users WHERE name = 'Alice';

Django ORM

users = User.objects.filter(name="Alice")

SQLAlchemy

from sqlalchemy import select

with Session(engine) as session:
    users = session.scalars(
        select(User).where(User.name == "Alice")
    ).all()

SQLModel

from sqlmodel import select

with Session(engine) as session:
    users = session.exec(
        select(User).where(User.name == "Alice")
    ).all()

Tortoise ORM

users = await User.filter(name="Alice")

Peewee

users = User.select().where(User.name == "Alice")

Prisma

const users = await prisma.user.findMany({
  where: { name: "Alice" },
});

Drizzle

const result = await db.select()
  .from(users)
  .where(eq(users.name, "Alice"));

Kysely

const users = await db
  .selectFrom('users')
  .selectAll()
  .where('name', '=', 'Alice')
  .execute()

TypeORM

const users = await userRepository.findBy({ name: "Alice" });

MikroORM

const em = orm.em.fork();

const users = await em.find(User, {
  name: "Alice",
});

Sequelize

const users = await User.findAll({
  where: { name: "Alice" },
});

Order By

SQL

SELECT * FROM users ORDER BY created_at DESC;

Django ORM

users = User.objects.order_by("-created_at")

SQLAlchemy

from sqlalchemy import select

with Session(engine) as session:
    users = session.scalars(
        select(User).order_by(User.created_at.desc())
    ).all()

SQLModel

from sqlmodel import select

with Session(engine) as session:
    users = session.exec(
        select(User).order_by(User.created_at.desc())
    ).all()

Tortoise ORM

users = await User.all().order_by("-created_at")

Peewee

users = User.select().order_by(User.created_at.desc())

Prisma

const users = await prisma.user.findMany({
  orderBy: { createdAt: "desc" },
});

Drizzle

const result = await db.select()
  .from(users)
  .orderBy(desc(users.createdAt));

Kysely

const users = await db
  .selectFrom('users')
  .selectAll()
  .orderBy('created_at', 'desc')
  .execute()

TypeORM

const users = await userRepository.find({
  order: { createdAt: "DESC" },
});

MikroORM

const em = orm.em.fork();

const users = await em.find(User, {}, {
  orderBy: { createdAt: "desc" },
});

Sequelize

const users = await User.findAll({
  order: [["createdAt", "DESC"]],
});

Select Specific Fields

SQL

SELECT name, email FROM users;

Django ORM

users = User.objects.values("name", "email")

SQLAlchemy

from sqlalchemy import select

with Session(engine) as session:
    rows = session.execute(
        select(User.name, User.email)
    ).all()

SQLModel

from sqlmodel import select

with Session(engine) as session:
    rows = session.exec(
        select(User.name, User.email)
    ).all()

Tortoise ORM

users = await User.all().values("name", "email")

Peewee

users = User.select(User.name, User.email)

Prisma

const users = await prisma.user.findMany({
  select: { name: true, email: true },
});

Drizzle

const result = await db.select({
  name: users.name,
  email: users.email,
}).from(users);

Kysely

const users = await db
  .selectFrom('users')
  .select(['name', 'email'])
  .execute()

TypeORM

const users = await userRepository.find({
  select: { name: true, email: true },
});

MikroORM

const em = orm.em.fork();

const users = await em.find(User, {}, {
  fields: ["name", "email"],
});

Sequelize

const users = await User.findAll({
  attributes: ["name", "email"],
});

Limit & Offset

SQL

SELECT * FROM users
ORDER BY created_at DESC
LIMIT 10 OFFSET 20;

Django ORM

users = User.objects.order_by("-created_at")[20:30]

SQLAlchemy

from sqlalchemy import select

with Session(engine) as session:
    users = session.scalars(
        select(User)
        .order_by(User.created_at.desc())
        .limit(10)
        .offset(20)
    ).all()

SQLModel

from sqlmodel import select

with Session(engine) as session:
    users = session.exec(
        select(User)
        .order_by(User.created_at.desc())
        .limit(10)
        .offset(20)
    ).all()

Tortoise ORM

users = await User.all().order_by(
    "-created_at"
).offset(20).limit(10)

Peewee

users = (
    User.select()
    .order_by(User.created_at.desc())
    .offset(20)
    .limit(10)
)

Prisma

const users = await prisma.user.findMany({
  orderBy: { createdAt: "desc" },
  take: 10,
  skip: 20,
});

Drizzle

const result = await db.select()
  .from(users)
  .orderBy(desc(users.createdAt))
  .limit(10)
  .offset(20);

Kysely

const users = await db
  .selectFrom('users')
  .selectAll()
  .orderBy('created_at', 'desc')
  .offset(20)
  .limit(10)
  .execute()

TypeORM

const users = await userRepository.find({
  order: { createdAt: "DESC" },
  take: 10,
  skip: 20,
});

MikroORM

const em = orm.em.fork();

const users = await em.find(User, {}, {
  orderBy: { createdAt: "desc" },
  offset: 20,
  limit: 10,
});

Sequelize

const users = await User.findAll({
  order: [["createdAt", "DESC"]],
  limit: 10,
  offset: 20,
});

Count

SQL

SELECT COUNT(*) FROM users WHERE name = 'Alice';

Django ORM

count = User.objects.filter(name="Alice").count()

SQLAlchemy

from sqlalchemy import select, func

with Session(engine) as session:
    count = session.scalar(
        select(func.count()).select_from(User).where(User.name == "Alice")
    )

SQLModel

from sqlalchemy import func
from sqlmodel import select

with Session(engine) as session:
    count = session.exec(
        select(func.count())
        .select_from(User)
        .where(User.name == "Alice")
    ).one()

Tortoise ORM

count = await User.filter(name="Alice").count()

Peewee

count = User.select().where(User.name == "Alice").count()

Prisma

const count = await prisma.user.count({
  where: { name: "Alice" },
});

Drizzle

const result = await db.select({ count: count() })
  .from(users)
  .where(eq(users.name, "Alice"));

const total = result[0].count;

Kysely

import { sql } from 'kysely'

const result = await db
  .selectFrom('users')
  .select(sql<number>`count(*)`.as('count'))
  .where('name', '=', 'Alice')
  .executeTakeFirst()

const count = result?.count ?? 0

TypeORM

const count = await userRepository.countBy({ name: "Alice" });

MikroORM

const em = orm.em.fork();

const count = await em.count(User, {
  name: "Alice",
});

Sequelize

const count = await User.count({
  where: { name: "Alice" },
});

AND / OR Conditions

SQL

-- AND
SELECT * FROM users
WHERE name = 'Alice' AND email LIKE '%@example.com';

-- OR
SELECT * FROM users
WHERE name = 'Alice' OR name = 'Bob';

Django ORM

from django.db.models import Q

# AND (implicit)
users = User.objects.filter(name="Alice", email__endswith="@example.com")

# OR
users = User.objects.filter(Q(name="Alice") | Q(name="Bob"))

SQLAlchemy

from sqlalchemy import select, and_, or_

with Session(engine) as session:
    # AND
    users = session.scalars(
        select(User).where(
            and_(User.name == "Alice", User.email.like("%@example.com"))
        )
    ).all()

    # OR
    users = session.scalars(
        select(User).where(
            or_(User.name == "Alice", User.name == "Bob")
        )
    ).all()

SQLModel

from sqlalchemy import and_, or_
from sqlmodel import select

with Session(engine) as session:
    # AND
    users = session.exec(
        select(User).where(
            and_(User.name == "Alice", User.email.endswith("@example.com"))
        )
    ).all()

    # OR
    users = session.exec(
        select(User).where(
            or_(User.name == "Alice", User.name == "Bob")
        )
    ).all()

Tortoise ORM

from tortoise.queryset import Q

# AND (implicit)
users = await User.filter(
    name="Alice", email__endswith="@example.com"
)

# OR
users = await User.filter(
    Q(name="Alice") | Q(name="Bob")
)

Peewee

# AND
users = User.select().where(
    (User.name == "Alice") &
    (User.email.endswith("@example.com"))
)

# OR
users = User.select().where(
    (User.name == "Alice") |
    (User.name == "Bob")
)

Prisma

// AND (implicit)
const users = await prisma.user.findMany({
  where: {
    name: "Alice",
    email: { endsWith: "@example.com" },
  },
});

// OR
const users2 = await prisma.user.findMany({
  where: {
    OR: [{ name: "Alice" }, { name: "Bob" }],
  },
});

Drizzle

// AND
const result = await db.select()
  .from(users)
  .where(and(
    eq(users.name, "Alice"),
    like(users.email, "%@example.com")
  ));

// OR
const result2 = await db.select()
  .from(users)
  .where(or(
    eq(users.name, "Alice"),
    eq(users.name, "Bob")
  ));

Kysely

// AND
const users = await db
  .selectFrom('users')
  .selectAll()
  .where((eb) =>
    eb.and([
      eb('name', '=', 'Alice'),
      eb('email', 'like', '%@example.com'),
    ])
  )
  .execute()

// OR
const users2 = await db
  .selectFrom('users')
  .selectAll()
  .where((eb) =>
    eb.or([
      eb('name', '=', 'Alice'),
      eb('name', '=', 'Bob'),
    ])
  )
  .execute()

TypeORM

import { Like } from "typeorm";

// AND
const users = await userRepository.findBy({
  name: "Alice",
  email: Like("%@example.com"),
});

// OR (array of conditions)
const users2 = await userRepository.findBy([
  { name: "Alice" },
  { name: "Bob" },
]);

MikroORM

const em = orm.em.fork();

// AND
const users = await em.find(User, {
  $and: [
    { name: "Alice" },
    { email: { $like: "%@example.com" } },
  ],
});

// OR
const users2 = await em.find(User, {
  $or: [
    { name: "Alice" },
    { name: "Bob" },
  ],
});

Sequelize

import { Op } from "sequelize";

// AND
const users = await User.findAll({
  where: {
    name: "Alice",
    email: { [Op.like]: "%@example.com" },
  },
});

// OR
const users2 = await User.findAll({
  where: {
    [Op.or]: [{ name: "Alice" }, { name: "Bob" }],
  },
});

LIKE / Contains

SQL

-- Contains
SELECT * FROM users WHERE name LIKE '%ali%';

-- Starts with
SELECT * FROM users WHERE name LIKE 'Ali%';

-- Case-insensitive
SELECT * FROM users WHERE name ILIKE '%ali%';

Django ORM

# Contains
users = User.objects.filter(name__contains="ali")

# Starts with
users = User.objects.filter(name__startswith="Ali")

# Case-insensitive
users = User.objects.filter(name__icontains="ali")

SQLAlchemy

from sqlalchemy import select

with Session(engine) as session:
    # Contains
    users = session.scalars(
        select(User).where(User.name.contains("ali"))
    ).all()

    # Starts with
    users = session.scalars(
        select(User).where(User.name.startswith("Ali"))
    ).all()

    # Case-insensitive
    users = session.scalars(
        select(User).where(User.name.ilike("%ali%"))
    ).all()

SQLModel

from sqlmodel import select

with Session(engine) as session:
    # Contains
    users = session.exec(
        select(User).where(User.name.contains("ali"))
    ).all()

    # Starts with
    users = session.exec(
        select(User).where(User.name.startswith("Ali"))
    ).all()

    # Case-insensitive
    users = session.exec(
        select(User).where(User.name.ilike("%ali%"))
    ).all()

Tortoise ORM

# Contains
users = await User.filter(name__contains="ali")

# Starts with
users = await User.filter(name__startswith="Ali")

# Case-insensitive
users = await User.filter(name__icontains="ali")

Peewee

# Contains
users = User.select().where(User.name.contains("ali"))

# Starts with
users = User.select().where(User.name.startswith("Ali"))

# Case-insensitive
users = User.select().where(User.name.icontains("ali"))

Prisma

// Contains
const users = await prisma.user.findMany({
  where: { name: { contains: "ali" } },
});

// Starts with
const users2 = await prisma.user.findMany({
  where: { name: { startsWith: "Ali" } },
});

// Case-insensitive
const users3 = await prisma.user.findMany({
  where: { name: { contains: "ali", mode: "insensitive" } },
});

Drizzle

// Contains
const result = await db.select()
  .from(users)
  .where(like(users.name, "%ali%"));

// Starts with
const result2 = await db.select()
  .from(users)
  .where(like(users.name, "Ali%"));

// Case-insensitive
const result3 = await db.select()
  .from(users)
  .where(ilike(users.name, "%ali%"));

Kysely

// Contains
const users = await db
  .selectFrom('users')
  .selectAll()
  .where('name', 'like', '%ali%')
  .execute()

// Starts with
const users2 = await db
  .selectFrom('users')
  .selectAll()
  .where('name', 'like', 'Ali%')
  .execute()

// Case-insensitive
const users3 = await db
  .selectFrom('users')
  .selectAll()
  .where('name', 'ilike', '%ali%')
  .execute()

TypeORM

import { Like, ILike } from "typeorm";

// Contains
const users = await userRepository.findBy({
  name: Like("%ali%"),
});

// Starts with
const users2 = await userRepository.findBy({
  name: Like("Ali%"),
});

// Case-insensitive
const users3 = await userRepository.findBy({
  name: ILike("%ali%"),
});

MikroORM

const em = orm.em.fork();

// Contains
const users = await em.find(User, {
  name: { $like: "%ali%" },
});

// Starts with
const users2 = await em.find(User, {
  name: { $like: "Ali%" },
});

// Case-insensitive
const users3 = await em.find(User, {
  name: { $ilike: "%ali%" },
});

Sequelize

import { Op } from "sequelize";

// Contains
const users = await User.findAll({
  where: { name: { [Op.like]: "%ali%" } },
});

// Starts with
const users2 = await User.findAll({
  where: { name: { [Op.like]: "Ali%" } },
});

// Case-insensitive
const users3 = await User.findAll({
  where: { name: { [Op.iLike]: "%ali%" } },
});

Comparison Operators

SQL

-- Greater than
SELECT * FROM users WHERE created_at > '2024-01-01';

-- Less than or equal
SELECT * FROM users WHERE id <= 100;

-- Not equal
SELECT * FROM users WHERE name != 'Alice';

-- Between
SELECT * FROM users
WHERE created_at BETWEEN '2024-01-01' AND '2024-12-31';

Django ORM

from datetime import date

# Greater than
users = User.objects.filter(created_at__gt=date(2024, 1, 1))

# Less than or equal
users = User.objects.filter(id__lte=100)

# Not equal
users = User.objects.exclude(name="Alice")

# Between
users = User.objects.filter(
    created_at__range=(date(2024, 1, 1), date(2024, 12, 31))
)

SQLAlchemy

from datetime import date
from sqlalchemy import select, and_

with Session(engine) as session:
    # Greater than
    users = session.scalars(
        select(User).where(User.created_at > date(2024, 1, 1))
    ).all()

    # Less than or equal
    users = session.scalars(
        select(User).where(User.id <= 100)
    ).all()

    # Not equal
    users = session.scalars(
        select(User).where(User.name != "Alice")
    ).all()

    # Between
    users = session.scalars(
        select(User).where(
            User.created_at.between(date(2024, 1, 1), date(2024, 12, 31))
        )
    ).all()

SQLModel

from datetime import date
from sqlmodel import select

with Session(engine) as session:
    # Greater than
    users = session.exec(
        select(User).where(User.created_at > date(2024, 1, 1))
    ).all()

    # Less than or equal
    users = session.exec(
        select(User).where(User.id <= 100)
    ).all()

    # Not equal
    users = session.exec(
        select(User).where(User.name != "Alice")
    ).all()

    # Between
    users = session.exec(
        select(User).where(
            User.created_at.between(date(2024, 1, 1), date(2024, 12, 31))
        )
    ).all()

Tortoise ORM

from datetime import date

# Greater than
users = await User.filter(
    created_at__gt=date(2024, 1, 1)
)

# Less than or equal
users = await User.filter(id__lte=100)

# Not equal
users = await User.exclude(name="Alice")

# Between
users = await User.filter(
    created_at__range=(
        date(2024, 1, 1), date(2024, 12, 31)
    )
)

Peewee

from datetime import date

# Greater than
users = User.select().where(User.created_at > date(2024, 1, 1))

# Less than or equal
users = User.select().where(User.id <= 100)

# Not equal
users = User.select().where(User.name != "Alice")

# Between
users = User.select().where(
    User.created_at.between(date(2024, 1, 1), date(2024, 12, 31))
)

Prisma

// Greater than
const users = await prisma.user.findMany({
  where: { createdAt: { gt: new Date("2024-01-01") } },
});

// Less than or equal
const users2 = await prisma.user.findMany({
  where: { id: { lte: 100 } },
});

// Not equal
const users3 = await prisma.user.findMany({
  where: { name: { not: "Alice" } },
});

// Between
const users4 = await prisma.user.findMany({
  where: {
    createdAt: {
      gte: new Date("2024-01-01"),
      lte: new Date("2024-12-31"),
    },
  },
});

Drizzle

// Greater than
const result = await db.select()
  .from(users)
  .where(gt(users.createdAt, new Date("2024-01-01")));

// Less than or equal
const result2 = await db.select()
  .from(users)
  .where(lte(users.id, 100));

// Not equal
const result3 = await db.select()
  .from(users)
  .where(ne(users.name, "Alice"));

// Between
const result4 = await db.select()
  .from(users)
  .where(between(
    users.createdAt,
    new Date("2024-01-01"),
    new Date("2024-12-31")
  ));

Kysely

// Greater than
const users = await db
  .selectFrom('users')
  .selectAll()
  .where('created_at', '>', new Date('2024-01-01'))
  .execute()

// Less than or equal
const users2 = await db
  .selectFrom('users')
  .selectAll()
  .where('id', '<=', 100)
  .execute()

// Not equal
const users3 = await db
  .selectFrom('users')
  .selectAll()
  .where('name', '!=', 'Alice')
  .execute()

// Between
const users4 = await db
  .selectFrom('users')
  .selectAll()
  .where('created_at', '>=', new Date('2024-01-01'))
  .where('created_at', '<=', new Date('2024-12-31'))
  .execute()

TypeORM

import { MoreThan, LessThanOrEqual, Not, Between } from "typeorm";

// Greater than
const users = await userRepository.findBy({
  createdAt: MoreThan(new Date("2024-01-01")),
});

// Less than or equal
const users2 = await userRepository.findBy({
  id: LessThanOrEqual(100),
});

// Not equal
const users3 = await userRepository.findBy({
  name: Not("Alice"),
});

// Between
const users4 = await userRepository.findBy({
  createdAt: Between(new Date("2024-01-01"), new Date("2024-12-31")),
});

MikroORM

// Greater than
const users = await orm.em.find(User, {
  createdAt: { $gt: new Date("2024-01-01") },
});

// Less than or equal
const users2 = await orm.em.find(User, {
  id: { $lte: 100 },
});

// Not equal
const users3 = await orm.em.find(User, {
  name: { $ne: "Alice" },
});

// Between
const users4 = await orm.em.find(User, {
  createdAt: {
    $gte: new Date("2024-01-01"),
    $lte: new Date("2024-12-31"),
  },
});

Sequelize

import { Op } from "sequelize";

// Greater than
const users = await User.findAll({
  where: {
    createdAt: { [Op.gt]: new Date("2024-01-01") },
  },
});

// Less than or equal
const users2 = await User.findAll({
  where: {
    id: { [Op.lte]: 100 },
  },
});

// Not equal
const users3 = await User.findAll({
  where: {
    name: { [Op.ne]: "Alice" },
  },
});

// Between
const users4 = await User.findAll({
  where: {
    createdAt: {
      [Op.between]: [new Date("2024-01-01"), new Date("2024-12-31")],
    },
  },
});

IN Clause

SQL

SELECT * FROM users WHERE name IN ('Alice', 'Bob', 'Charlie');

-- NOT IN
SELECT * FROM users WHERE name NOT IN ('Alice', 'Bob');

Django ORM

users = User.objects.filter(name__in=["Alice", "Bob", "Charlie"])

# NOT IN
users = User.objects.exclude(name__in=["Alice", "Bob"])

SQLAlchemy

from sqlalchemy import select

with Session(engine) as session:
    users = session.scalars(
        select(User).where(User.name.in_(["Alice", "Bob", "Charlie"]))
    ).all()

    # NOT IN
    users = session.scalars(
        select(User).where(User.name.not_in(["Alice", "Bob"]))
    ).all()

SQLModel

from sqlmodel import select

with Session(engine) as session:
    users = session.exec(
        select(User).where(User.name.in_(["Alice", "Bob", "Charlie"]))
    ).all()

    # NOT IN
    users = session.exec(
        select(User).where(~User.name.in_(["Alice", "Bob"]))
    ).all()

Tortoise ORM

users = await User.filter(
    name__in=["Alice", "Bob", "Charlie"]
)

# NOT IN
users = await User.exclude(
    name__in=["Alice", "Bob"]
)

Peewee

users = User.select().where(
    User.name << ["Alice", "Bob", "Charlie"]
)

# NOT IN
users = User.select().where(
    User.name.not_in(["Alice", "Bob"])
)

Prisma

const users = await prisma.user.findMany({
  where: { name: { in: ["Alice", "Bob", "Charlie"] } },
});

// NOT IN
const users2 = await prisma.user.findMany({
  where: { name: { notIn: ["Alice", "Bob"] } },
});

Drizzle

const result = await db.select()
  .from(users)
  .where(inArray(users.name, ["Alice", "Bob", "Charlie"]));

// NOT IN
const result2 = await db.select()
  .from(users)
  .where(notInArray(users.name, ["Alice", "Bob"]));

Kysely

const users = await db
  .selectFrom('users')
  .selectAll()
  .where('name', 'in', ['Alice', 'Bob', 'Charlie'])
  .execute()

// NOT IN
const users2 = await db
  .selectFrom('users')
  .selectAll()
  .where((eb) => eb.not(eb('name', 'in', ['Alice', 'Bob'])))
  .execute()

TypeORM

import { In, Not } from "typeorm";

const users = await userRepository.findBy({
  name: In(["Alice", "Bob", "Charlie"]),
});

// NOT IN
const users2 = await userRepository.findBy({
  name: Not(In(["Alice", "Bob"])),
});

MikroORM

const em = orm.em.fork();

const users = await em.find(User, {
  name: { $in: ["Alice", "Bob", "Charlie"] },
});

// NOT IN
const users2 = await em.find(User, {
  name: { $nin: ["Alice", "Bob"] },
});

Sequelize

import { Op } from "sequelize";

const users = await User.findAll({
  where: {
    name: { [Op.in]: ["Alice", "Bob", "Charlie"] },
  },
});

// NOT IN
const users2 = await User.findAll({
  where: {
    name: { [Op.notIn]: ["Alice", "Bob"] },
  },
});

Distinct

SQL

SELECT DISTINCT name FROM users;

Django ORM

names = User.objects.values_list("name", flat=True).distinct()

SQLAlchemy

from sqlalchemy import select

with Session(engine) as session:
    names = session.scalars(
        select(User.name).distinct()
    ).all()

SQLModel

from sqlmodel import select

with Session(engine) as session:
    names = session.exec(
        select(User.name).distinct()
    ).all()

Tortoise ORM

names = await User.all().values_list(
    "name", flat=True
).distinct()

Peewee

names = User.select(User.name).distinct()

Prisma

const names = await prisma.user.findMany({
  distinct: ["name"],
  select: { name: true },
});

Drizzle

const result = await db.selectDistinct({ name: users.name })
  .from(users);

Kysely

const names = await db
  .selectFrom('users')
  .select('name')
  .distinct()
  .execute()

TypeORM

const names = await userRepository
  .createQueryBuilder("user")
  .select("DISTINCT user.name", "name")
  .getRawMany();

MikroORM

const names = await orm.em
  .createQueryBuilder(User, "u")
  .select("distinct u.name")
  .execute();

Sequelize

import { col, fn } from "sequelize";

const names = await User.findAll({
  attributes: [[fn("DISTINCT", col("name")), "name"]],
});

Exists Check

SQL

SELECT EXISTS (
  SELECT 1 FROM users
  WHERE email = 'alice@example.com'
);

Django ORM

exists = User.objects.filter(
    email="alice@example.com"
).exists()

SQLAlchemy

from sqlalchemy import exists, select

stmt = select(
    exists().where(
        User.email == "alice@example.com"
    )
)
result = session.execute(stmt).scalar()

SQLModel

from sqlalchemy import exists
from sqlmodel import select

stmt = select(
    exists().where(
        User.email == "alice@example.com"
    )
)

with Session(engine) as session:
    exists_result = session.exec(stmt).one()

Tortoise ORM

exists = await User.filter(
    email="alice@example.com"
).exists()

Peewee

exists = User.select().where(
    User.email == "alice@example.com"
).exists()

Prisma

// Prisma has no .exists(); use findFirst
const exists =
  (await prisma.user.findFirst({
    where: { email: "alice@example.com" },
    select: { id: true },
  })) !== null;

Drizzle

import { sql, eq } from "drizzle-orm";

const [row] = await db
  .select({ value: sql`1` })
  .from(users)
  .where(eq(users.email, "alice@example.com"))
  .limit(1);
const exists = !!row;

Kysely

const result = await db
  .selectNoFrom((eb) => [
    eb.exists(
      db
        .selectFrom('users')
        .select('id')
        .where('email', '=', 'alice@example.com')
    ).as('exists'),
  ])
  .executeTakeFirst()

const exists = result?.exists ?? false

TypeORM

const exists = await dataSource
  .getRepository(User)
  .existsBy({ email: "alice@example.com" });

MikroORM

const user = await orm.em.findOne(User, {
  email: "alice@example.com",
}, {
  fields: ["id"],
});

const exists = user !== null;

Sequelize

const exists =
  (await User.count({
    where: { email: "alice@example.com" },
    limit: 1,
  })) > 0;

Compare Fields

SQL

SELECT * FROM products
WHERE sale_price < original_price;

Django ORM

from django.db.models import F

products = Product.objects.filter(
    sale_price__lt=F("original_price")
)

SQLAlchemy

from sqlalchemy import select

stmt = select(Product).where(
    Product.sale_price < Product.original_price
)
products = session.execute(stmt).scalars().all()

SQLModel

from sqlmodel import select

with Session(engine) as session:
    products = session.exec(
        select(Product).where(
            Product.sale_price < Product.original_price
        )
    ).all()

Tortoise ORM

from tortoise.expressions import F

products = await Product.filter(
    sale_price__lt=F("original_price")
)

Peewee

products = Product.select().where(
    Product.sale_price < Product.original_price
)

Prisma

// No field-to-field comparison API;
// use raw SQL
const products = await prisma.$queryRaw`
  SELECT * FROM products
  WHERE sale_price < original_price
`;

Drizzle

import { lt } from "drizzle-orm";

const result = await db
  .select()
  .from(products)
  .where(
    lt(products.salePrice, products.originalPrice)
  );

Kysely

const products = await db
  .selectFrom('products')
  .selectAll()
  .whereRef('sale_price', '<', 'original_price')
  .execute()

TypeORM

const products = await dataSource
  .getRepository(Product)
  .createQueryBuilder("p")
  .where("p.sale_price < p.original_price")
  .getMany();

MikroORM

const products = await orm.em
  .createQueryBuilder(Product, "p")
  .select("*")
  .where("p.sale_price < p.original_price")
  .getResultList();

Sequelize

import { Op, col, where } from "sequelize";

const products = await Product.findAll({
  where: where(col("sale_price"), Op.lt, col("original_price")),
});