flawopen.com/SQL Injection/Is an ORM enough?
For its standard query API, yes. Every mainstream ORM also ships a raw-SQL escape hatch, and those carry exactly the same risk as hand-written SQL — the ORM's protection doesn't extend to them.
This isn't specific to any one language — it's a structural pattern that repeats everywhere: Django's .raw(), SQLAlchemy's text(), Rails' find_by_sql, Entity Framework's FromSqlRaw, GORM's Raw(), Prisma's $queryRawUnsafe. Every ORM eventually needs an escape hatch for queries its builder can't express, and every one of those escape hatches is exactly as safe as the discipline used inside it — no safer just because it's called from an ORM.
C#'s Entity Framework, via FromSqlInterpolated, stands out — it auto-parameterizes interpolated values, making the "easy" syntax also the safe one. Most other ORMs require you to remember to use their parameter argument separately.