RMRM Full Stack & AI Engineer · All guides · Roadmaps
Backend · guide

What is an ORM?

An ORM (Object-Relational Mapper) is a programming library that lets you interact with a relational database using your language's native objects and syntax instead of writing raw SQL. It bridges the gap between the object-oriented world of application code and the table-based world of relational databases.

The Core Concept

A relational database stores data in tables with rows and columns, while most modern programming languages model data as objects or classes. An ORM maps each database table to a class in your code, and each row to an instance of that class. This means you can create, read, update, and delete records by calling methods on objects rather than constructing SQL strings.

Why ORMs Matter

ORMs dramatically speed up development by removing boilerplate SQL for common queries. They also improve portability — because the ORM generates SQL for you, switching databases (e.g. from PostgreSQL to MySQL) often requires only a configuration change. Additionally, they reduce the risk of SQL injection by using parameterized queries internally.

How an ORM Works

You define a model class that declares fields matching the database columns (e.g. a User class with name and email fields). The ORM inspects these declarations at runtime or compile time and translates method calls like User.find(id=5) into SQL such as SELECT * FROM users WHERE id = 5. Results are automatically deserialized into instances of your model class.

Migrations

Most ORM frameworks include a migrations system that tracks changes to your schema over time as versioned scripts. When you add a field to a model, the migration tool generates and applies the matching ALTER TABLE statement. This keeps your database schema in sync with your code across all environments and team members.

Key Gotcha: The N+1 Query Problem

The most common ORM performance pitfall is the N+1 query problem, where fetching a list of N records and then accessing a related record on each one triggers N additional queries. For example, loading 100 posts and then accessing each post's author without eager loading fires 101 queries total. Most ORMs solve this with an eager-loading option (e.g. includes or joinedload) that fetches related data in a single JOIN query.

Best Practice: Know Your SQL

ORMs are an abstraction, not a replacement for understanding SQL. Complex reporting queries, bulk operations, and performance tuning often require dropping down to raw SQL or query builders provided by the ORM. Always use your ORM's query logging or profiling tools in development to inspect the SQL being generated and catch inefficiencies early.

Go deeper with an AI tutor that teaches this in context — and quizzes you on it.
Open the app — free to start

© RM Full Stack & AI Engineer · All guides · Roadmaps · Open the app