News for hackers. Stuff that matters.
Re:Taming the beast that is the Django ORM – An introduction by cqqxo4zV46cp on Saturday August 31, 2024 @11:41PM (#41414088)
Django’s ORM is the first one that I ever spent a lot of time with. Throughout my career I’ve interacted with other ORMs from time to time. It wasn’t until I’d done that, that I realised, even though it’s not perfect, how fantastic the Django ORM is. I thought they’d all be that good, but no.

I’ve read a lot of criticisms of ORMs, as I’m sure everyone else has. Some of them are certainly valid criticisms that are immovable and just inherent in what an ORM tries to do. Some of them just seem to be caused by not very many ORMs being good, and the writer not having used one of the better ones.

Re:Taming the beast that is the Django ORM – An introduction by winrid on Sunday September 01, 2024 @12:18AM (#41414254)
I agree. Django's ORM is great because it handles the relationships well, where many ORMs barely do the object mapping part well.

I'm rewriting a large Django project in Java (quarkus + jooq), because it's at the point where I need a type system now, but it still has a place in my heart.

Re:Taming the beast that is the Django ORM – An introduction by BarryMilo on Sunday September 01, 2024 @01:17AM (#41414490)
Aren't Django models close enough to types?
Re:Taming the beast that is the Django ORM – An introduction by wg0 on Sunday September 01, 2024 @01:31AM (#41414546)
Nope. Python type hinting is far far from Java like types.

And yes, I guess OP has now a large system that needs types enforced by the system to reduce the friction in evolving the stack.

Re:Taming the beast that is the Django ORM – An introduction by roze_sha on Sunday September 01, 2024 @01:33AM (#41414560)
What about using pydantic?
Re:Taming the beast that is the Django ORM – An introduction by mehdix on Sunday September 01, 2024 @02:02AM (#41414677)
FWIW, one python project I'm working on uses an obscure Framework, and ORM. I was contemplating to convert it to FastAPI+Pydantic, however the amount of effort needed was no different than rewriting the whole project.
Re:Taming the beast that is the Django ORM – An introduction by LtWorf on Sunday September 01, 2024 @07:11AM (#41415915)
pydantic + sql database?

So have 2 components that ensure the types are correct? Why?

Re:Taming the beast that is the Django ORM – An introduction by winrid on Sunday September 01, 2024 @02:22PM (#41419028)
I already use type annotations with Python for use within my IDE. It's just all tiring garbage. Java is already almost a scripting language and I can actually use a shared heap, etc. also I have some core code in java I use in the desktop app I want to reuse in the server. Right now I transpile that core code to TS and then JS to use client side, but I'd rather just have everything in Java.
Re:Taming the beast that is the Django ORM – An introduction by Izkata on Sunday September 01, 2024 @02:13PM (#41418951)
If this is what you're referring to:

> Note: The Python runtime does not enforce function and variable type annotations. They can be used by third party tools such as type checkers, IDEs, linters, etc.

Then yes, Django model definitions are more like Java types in that they error if you try to use an incorrect type. You can't just ignore them like with type hints.

They also try to be 1:1 with database types, so for the most part any additional validation added on top of Django would be something you had to do anyway.

Re:Taming the beast that is the Django ORM – An introduction by Swizec on Sunday September 01, 2024 @12:18AM (#41414257)
For me Django and ActiveRecord stand out as 2 good examples of what an ORM should be like. Both feel like they make the simple stuff super easy, the complex stuff figure outable, and the super hard stuff trivially possible with raw SQL and a decent mapping from that back to regular code.

Although over the years my code trends more and more towards `.rawSql` or whatever equivalent exists. Even for the simple stuff. It’s just so much easier than first thinking up my query then bending over backwards three times to make it fit into the ORM’s pet syntax.

Plus raw sql is so much easier to copypasta between different tools when you’re debugging.

And before you say “but sql injection!” – that’s what prepared statements/parametrized queries are for.

Re:Taming the beast that is the Django ORM – An introduction by wsc981 on Sunday September 01, 2024 @12:31AM (#41414302)
I've started working on a .NET project that uses EntityFramework and due to some of the magic, I prefer just using raw SQL as well. I've used other ORM solutions in the past as well and I am not a fan ...

But the team chose EF due to it supposedly being easier to integrate with whatever database the customer might be using and that seems like valid reasoning.

Re:Taming the beast that is the Django ORM – An introduction by djeiejejejej on Sunday September 01, 2024 @02:20AM (#41414736)
Yes I agree. That’s a valid argument, but there are other ways as well like SQLKata and other query builders.

Depending on the complexity of the product I think writing standard SQL92 will get you far as well.

I don’t get how an ORM will handle Postgres’ CTEs and windowing functions. Those are pretty basic and extremely useful features to me, but those require dropping to raw SQL. Each vendor has those useful particularities that you immediately lose by going ORM.

So in practice you are already required to make your queries as bland as possible where GROUP BY and JOIN is about as complex as it will get. I’d say just do SQL92 work around the limitations - which is something you’ll have to do anyway, but now more directly - and all major vendors will work OOB.

Re:Taming the beast that is the Django ORM – An introduction by Izkata on Sunday September 01, 2024 @03:01PM (#41419367)
> I don’t get how an ORM will handle Postgres’ CTEs and windowing functions. Those are pretty basic and extremely useful features to me, but those require dropping to raw SQL. Each vendor has those useful particularities that you immediately lose by going ORM.

Django has supported windowing functions since 2.0, almost 7 years ago: https://docs.djangoproject.com/en/2.0/ref/models/expressions...

And people are experimenting with CTEs - this looks pretty natural to use, at least with the basic example, and it supports recursive CTEs even if the example looks clunky (though I think that's their choice of example rather than the actual recursive part making it look bad): https://dimagi.github.io/django-cte/ (repo: https://github.com/dimagi/django-cte)

Re:Taming the beast that is the Django ORM – An introduction by neonsunset on Sunday September 01, 2024 @05:37AM (#41415516)
It's pretty straightforward, and LINQ method names map quite closely to SQL.

If you are not a fan of it however, you can use queries directly with '.FromSql(...)' retaining the convenience of object mapping. Interpolated queries use string interpolation API to convert them to parametrized queries that are injection-safe under the hood.

https://learn.microsoft.com/en-us/ef/core/querying/sql-queri...

Re:Taming the beast that is the Django ORM – An introduction by djeiejejejej on Sunday September 01, 2024 @02:06AM (#41414697)
Same here, but IMO it is related to skill and experience.

Once you get sufficiently familiar with some paradigm the training wheels can come off.

“Raw” SQL is already an abstraction. Over time all the implicit magic will get on your nerves. Trying to shoehorn two completely different worlds into one abstraction is not worth it: you get to learn today’s untransferable funky ORM syntax and idiosyncrasies while losing sight of the actual skill that matters long term which is SQL itself.

I concede however that handling of SQL, the field names, the relations, is annoying. But it’s core to the problem you are probably solving (some form of CRUD). Plumbing is annoying but as a plumber I’d say get used to it instead of wishing to be dancer.

I notice this in other aspects of my work as well. When I switched away trom desktop environment to terminal I had the same feeling. It’s easier, less hassle, less wonky abstractions, more direct. Completely counter to what popular culture is telling me.

Re:Taming the beast that is the Django ORM – An introduction by KronisLV on Sunday September 01, 2024 @02:52AM (#41414865)
> I concede however that handling of SQL, the field names, the relations, is annoying. But it’s core to the problem you are probably solving (some form of CRUD). Plumbing is annoying but as a plumber I’d say get used to it instead of wishing to be dancer.

It feels more like outsourcing said plumbing to someone that has done a lot of it in the past and will in most cases save you time, even if they won’t do everything the way you’d prefer yourself.

Throw in a bit of codegen and reading your current schema (if using schema first approach) and you’re in a pretty nice spot to be, except for the times when ORMs will get confused with non trivial joins and relationships, but typically then you have an escape hatch to have the query be in raw SQL while still mapping the outputs to whatever objects you need.

To be clear, I still think that mapping read only entities/DTOs against specialized database views for non-trivial data selection makes sense a lot of time regardless of the stack (or even some in-database processing with stored procedures), but basic ORM mappings are useful a lot of time too.

Re:Taming the beast that is the Django ORM – An introduction by gniting on Sunday September 01, 2024 @07:34AM (#41416045)
> but typically then you have an escape hatch to have the query be in raw SQL while still mapping the outputs to whatever objects you need.

This is precisely why we introduced the "TypedSQL" feature in the Prisma ORM. For those who are interested in reading more on that: https://prisma.io/typedsql

Re:Taming the beast that is the Django ORM – An introduction by 1propionyl on Sunday September 01, 2024 @12:09AM (#41414205)
This is generally my experience as well. I don't love using ORMs but at least Django's is relatively painless and I can generally find the escape hatch I need.

The lack of support until very recently (and it's still lacking) for views is the main knock.

Re:Taming the beast that is the Django ORM – An introduction by choilive on Sunday September 01, 2024 @12:23AM (#41414277)
Django's ORM is acceptable - but I think Rails/ActiveRecord is superior albeit certainly more opinionated. Most likely just my personal bias speaking because Rails was the first web "framework" I cut my teeth on.
Re:Taming the beast that is the Django ORM – An introduction by wg0 on Sunday September 01, 2024 @01:32AM (#41414553)
I think Django's ORM is really great but only as long as that's the first thing you have seen.

If you started from Rails and ActiveRecord, you're probably not be very appreciative of Django's ORM.

Re:Taming the beast that is the Django ORM – An introduction by bitexploder on Sunday September 01, 2024 @02:42AM (#41414821)
SQLAlchemy is the best stand alone ORM I have found.
Re:Taming the beast that is the Django ORM – An introduction by baq on Sunday September 01, 2024 @04:44AM (#41415297)
sqlalchemy is easily one of the best ORMs ever made for any language. Hats off to zzzeek.

Currently working in typescript and writing SQL queries out by hand since I just don’t trust anything to do the right thing wrt units of work.

Re:Taming the beast that is the Django ORM – An introduction by JodieBenitez on Sunday September 01, 2024 @06:12AM (#41415661)
I don't know, the declarative API is awkward. I get SQLAlchemy is quality software but I found DX poor.
Re:Taming the beast that is the Django ORM – An introduction by greenie_beans on Sunday September 01, 2024 @09:05AM (#41416701)
i've used both. they both have pros/cons. use whatever tool your team is most proficient with/stop wasting your time arguing about which framework is best
Re:Taming the beast that is the Django ORM – An introduction by malux85 on Sunday September 01, 2024 @12:40AM (#41414347)
I love the django ORM and then the REST framework on top of that.

Define the object, hook it to a view, use our custom permission class, done.

GET, POST, PATCH, DELETE all urls, filtering, pagination, search, ordering, complex multi-org multi-user object permissions handled automatically. Need custom logic? Just overwrite method.

It’s a productivity superpower, sure there’s a lot to learn but that’s the price you pay for the tools that make you hyper productive

Re:Taming the beast that is the Django ORM – An introduction by nprateem on Sunday September 01, 2024 @02:45AM (#41414831)
Ninja is even better than the REST framework. Practically no boilerplate.
Re:Taming the beast that is the Django ORM – An introduction by Izkata on Sunday September 01, 2024 @01:16AM (#41414485)
The awkward part is realizing Django has been this good for well over a decade. The core design hasn't (ever?) changed.

I started using Django on I think version 1.2 or 1.3 in 2011, back when it didn't have database migrations and you had to use a library like South for it. Even then, as an ORM/query language it was apparently better than what other languages have now.

Re:Taming the beast that is the Django ORM – An introduction by simonw on Sunday September 01, 2024 @01:33AM (#41414555)
The design of the ORM changed substantially once, early in Django's history, when the "magic removal branch" landed. There are some notes on the new syntax that introduced here: https://code.djangoproject.com/wiki/RemovingTheMagic#Codecha...

That branch merged on May 1st 2006: https://www.djangoproject.com/weblog/2006/may/01/magicremova...

I've long found Django's commitment to not breaking too much at once inspiring. The release notes and upgrade guides are really solid.

Re:Taming the beast that is the Django ORM – An introduction by vandahm on Sunday September 01, 2024 @02:14AM (#41414723)
I used Django a lot from about 2007 to 2010 and, then, went for several years without using it at all. When I came back to it, I was delighted to find that everything still worked like it was supposed to, just better. Congrats on getting it right on the first try. That's...not something that happens very often in software.
Re:Taming the beast that is the Django ORM – An introduction by JodieBenitez on Sunday September 01, 2024 @01:34AM (#41414563)
> I thought they’d all be that good, but no.

I had the "pleasure" to use Doctrine once. Never again !

Re:Taming the beast that is the Django ORM – An introduction by vandahm on Sunday September 01, 2024 @02:16AM (#41414730)
I used Doctrine for a few years, and I remember thinking that it was about 50% awesome and 50% terrible. I wonder what I would think if I came back to it today.
Re:Taming the beast that is the Django ORM – An introduction by murkt on Sunday September 01, 2024 @02:40AM (#41414816)
In 15+ years I’ve only used two orms: Django ORM and SQLAlchemy. I’ve also skimmed docs for many others (some JS orms, etc), and those often look completely unusable.

SQLAlchemy is leagues above and beyond Django ORM. I can’t say I have nightmares from dealing with it, but it certainly was not pleasure. A bit too much magic here and there, not flexible enough and provokes too much bad practices. Re-defining save() methods to do a lot of work, anyone?

The best “orm” that I’ve ever used was not an ORM but a query builder — HoneySQL from Clojure. That one is fantastic. No ORM bullshit, no extra data loaded from DB, no accidental N+1 queries. Not reading docs on how to do a GROUP BY, everything’s just easy to write.

Frankly, we often use SQLAlchemy as just a query builder too. Makes life so much easier.