Slide 1

Slide 1 text

WHY I HATE THE DJANGO ORM Thursday, January 12, 2012

Slide 2

Slide 2 text

HI, I’M ALEX I HATE THE DJANGO ORM Thursday, January 12, 2012

Slide 3

Slide 3 text

I ALSO HELP BUILD IT (SO ALL OF THIS STUFF IS REALLY MY FAULT) Thursday, January 12, 2012

Slide 4

Slide 4 text

WHY DO I HATE IT? Thursday, January 12, 2012

Slide 5

Slide 5 text

SELECT event_type SUM(end_time - start_time) FROM event GROUP BY event_type Thursday, January 12, 2012

Slide 6

Slide 6 text

TAKING A STEP BACK Thursday, January 12, 2012

Slide 7

Slide 7 text

WHY DO WE HAVE AN ORM? DATABASE RECORDS INTO OBJECTS EXECUTE COMMON QUERIES NOT REPLACE SQL Thursday, January 12, 2012

Slide 8

Slide 8 text

WAS THAT A COMMON QUERY? Thursday, January 12, 2012

Slide 9

Slide 9 text

IT HAS A SYNTAX Event.objects.values( “event_type” ).annotate( Sum(F(“end_time”) - F(“start_time”)) ) Thursday, January 12, 2012

Slide 10

Slide 10 text

Traceback (most recent call last): File "", line 1, in File ".../query.py", line 741, in annotate is_summary=False) File ".../sql/query.py", line 990, in add_aggregate field_list = aggregate.lookup.split(LOOKUP_SEP) AttributeError: 'ExpressionNode' object has no attribute 'split' FFFFFFFUUUUUUUUUUUU Thursday, January 12, 2012

Slide 11

Slide 11 text

AGGREGATES TAKE STRINGS (NOT EXPRESSIONS OR ANYTHING ELSE USEFUL) Thursday, January 12, 2012

Slide 12

Slide 12 text

NO COMPOSABILITY Thursday, January 12, 2012

Slide 13

Slide 13 text

WEREN’T DESIGNED WITH EACH OTHER IN MIND MUCH LESS A COMPREHENSIVE SYSTEM Thursday, January 12, 2012

Slide 14

Slide 14 text

SQLALCHEMY session.query( TimlineEvent.event_type, func.sum(TimelineEvent.end_time - TimelineEvent.start_time) ).group_by( TimelineEvent.event_type ).all() Thursday, January 12, 2012

Slide 15

Slide 15 text

NOTICE THAT? SQLALCHEMY USES THE SAME SYNTAX FOR FIELDS, EVERYWHERE Thursday, January 12, 2012

Slide 16

Slide 16 text

DJANGO DOESN’T F(“field_name”) Aggregate(“field_name”) Q(field_name=value) filter(field_name=value) Thursday, January 12, 2012

Slide 17

Slide 17 text

STRINGS, KEYWORD ARGUMENTS, AND FUNKY ONE-LETTER OBJECTS (WITH VARYING LEVELS OF INTEROPERABILITY) Thursday, January 12, 2012

Slide 18

Slide 18 text

WHEN DO YOU USE WHICH? I HAVE NO IDEA (AND I WROTE THE DAMNED THING) Thursday, January 12, 2012

Slide 19

Slide 19 text

SIMPLE THINGS ARE SIMPLE MEDIUM THINGS ARE POSSIBLE HARD THINGS AREN’T Thursday, January 12, 2012

Slide 20

Slide 20 text

SIMPLE THINGS SHOULD BE SIMPLE HARD THINGS SHOULD BE POSSIBLE Thursday, January 12, 2012

Slide 21

Slide 21 text

SPEAKING OF SIMPLE... Event.objects.filter( start_date__hour=10 ) Thursday, January 12, 2012

Slide 22

Slide 22 text

AND OUGHT TO BE SIMPLE Event.objects.filter( start_date__hour__gt=11 ) Thursday, January 12, 2012

Slide 23

Slide 23 text

__ SYNTAX IS NEAT BUT LIMITED Thursday, January 12, 2012

Slide 24

Slide 24 text

THE IDEALS OF THE ORM ARE GOOD THE API IS GREAT FOR SIMPLE CASES Thursday, January 12, 2012

Slide 25

Slide 25 text

BUT THE INCONSISTENCIES BLEED AND THINGS THAT SHOULD BE EASY AREN’T Thursday, January 12, 2012

Slide 26

Slide 26 text

80/20 SOLUTION BUT IT COULD BE 90/10 Thursday, January 12, 2012

Slide 27

Slide 27 text

THANKS QUESTIONS? Thursday, January 12, 2012