why i hate django - part 2/2

87
DjangoCon 2008 98 Where do we read/write?

Upload: cal-henderson

Post on 10-May-2015

6.196 views

Category:

Business


8 download

DESCRIPTION

part 1 is here: http://www.slideshare.net/iamcal/why-i-hate-django-part-12-presentation/

TRANSCRIPT

DjangoCon 2008 98

Where do we read/write?

DjangoCon 2008 99

Abstraction FTW

db_query($cluster_name, $sql)

DjangoCon 2008 100

No sharding

DjangoCon 2008 101

WTF is sharding?

All about books

DjangoCon 2008 102

Dewey Decimal

DjangoCon 2008 103

But it can’t do everything

DjangoCon 2008 104

Makes some things

‘impossible’

No shard walking

DjangoCon 2008 105

DjangoCon 2008 106

Django knows our models

It’s possible

DjangoCon 2008 107

If we accept constraints

DjangoCon 2008 108

No external sequences

DjangoCon 2008 109

Auto-incs can be bad

master/master

shards

DjangoCon 2008 110

No automatic denormalization

DjangoCon 2008 111

Counters would be easy!

DjangoCon 2008 112

And copied fields too

DjangoCon 2008 113

High

Performance

DjangoCon 2008 114

It’s slow!

DjangoCon 2008 115

DjangoCon 2008 116

DjangoCon 2008 117

There are limits

When being really silly

But they only apply

DjangoCon 2008 118

Sessions

DjangoCon 2008 119

OMG UR ON CRAK

DjangoCon 2008 120

Extra DB table

A read on every page

DjangoCon 2008 121

Lightweight = better

DjangoCon 2008 122

Signed cookies

DjangoCon 2008 123

No parallelization

DjangoCon 2008 124

Multiple cache-requests

DjangoCon 2008 125

Multiple multi-keyed reads

DjangoCon 2008 126

Slow HTTP requests while

we’re doing other stuff

DjangoCon 2008 127

Creates dumb SQL

DjangoCon 2008 128

foo.exclude(bar = true)

WHERE (NOT (bar = 1))

DjangoCon 2008 129

foo.exclude(bar = true)

WHERE bar != 1

DjangoCon 2008 130

foo.filter(bar = false)

WHERE bar = 0

Indexable!

DjangoCon 2008 131

Maintainability

DjangoCon 2008 132

Maintainability

Awesomeness

DjangoCon 2008 133

Verbose template syntax

<h1>{{ foo.bar }}</h1>

DjangoCon 2008 134

<h1>{{ foo.bar }}</h1>

<h1>{$foo.bar}</h1>

3 extra characters!

DjangoCon 2008 135

<h1>{{ foo.bar }}</h1>

<h1>{$foo.bar|e}</h1>

Well almost…

DjangoCon 2008 136

{if $edit_mode}woo

{/if}

{% if edit_mode %}woo

{% endif %}

9 extra!

DjangoCon 2008 137

Verbose template syntax

makes people cry

DjangoCon 2008 138

No query debugger

DjangoCon 2008 139

>>> from django.db import connection

>>> connection.queries

[{'sql': 'SELECT

polls_polls.id,polls_polls.question,polls_

polls.pub_date FROM polls_polls', 'time':

'0.002'}]

DjangoCon 2008 140

>>> from django.db import connection

>>> connection.queries

[{'sql': 'SELECT

polls_polls.id,polls_polls.question,polls_

polls.pub_date FROM polls_polls', 'time':

'0.002'}]

Not good enough!

DjangoCon 2008 141

Better, but not amazing

DjangoCon 2008 142

DjangoCon 2008 143

Page summary

DjangoCon 2008 144

Make it clickable…

DjangoCon 2008 145

EXPLAIN is AWESOME

DjangoCon 2008 146

And/or show the data

DjangoCon 2008 147

MySQL Query Profiler

Enough data to

choke a whale

DjangoCon 2008 148

Not smug enough

DjangoCon 2008 149

DjangoCon 2008 150

DjangoCon 2008 151

SELECT `app_userprofile`.`user_id`,`app_userprofile`.`account_status`,`app_userprofile`.`account_status_reason`,`app_userprofile`.`account_delete_type`,`app_userprofile`.`syndication_key`,`app_userprofile`.`blurb`,`app_userprofile`.`location`,`app_userprofile`.`country`,`app_userprofile`.`postal_code`,`app_userprofile`.`gender`,`app_userprofile`.`theme`,`app_userprofile`.`tiny_photo`,`app_userprofile`.`small_photo`,`app_userprofile`.`smedium_photo`,`app_userprofile`.`medium_photo`,`app_userprofile`.`large_photo`,`app_userprofile`.`orig_photo`,`app_userprofile`.`bday_month`,`app_userprofile`.`bday_day`,`app_userprofile`.`bday_year`,`app_userprofile`.`is_pro`,`app_userprofile`.`privacy_settings_id`,`app_userprofile`.`email_settings_id`,`app_userprofile`.`preference_settings_id`,`app_userprofile`.`ad_counter`,`app_userprofile`.`num_friends`,`app_userprofile`.`num_fans`,`app_userprofile`.`num_feeds`,`app_userprofile`.`num_blocked_fans`,`app_userprofile`.`num_friend_requests`,`app_userprofile`.`default_set_id`,`app_userprofile`.`invite_id`,`app_userprofile`.`invite_round`,`app_userprofile`.`avail_invites`,`app_userprofile`.`original_email` FROM `app_userprofile` WHERE (`app_userprofile`.`user_id` = 1)

Unreadable SQL

DjangoCon 2008 152

SELECT * FROM `app_userprofile` WHERE `user_id` = 1

Unreadable SQL

DjangoCon 2008 153

SELECT * is fast!

Faster over the wire

Faster to parse

Easier to debug

DjangoCon 2008 154

SELECT `app_note`.`id`,`app_note`.`type`,`app_note`.`body`,`app_note`.`sender_id`,`app_note`.`date_sent`,`app_note`.`num_recipients`,`app_note`.`recipient_type`,`app_note`.`set_id`,`app_note`.`direct_to_id`,`app_note`.`media_file_id`,`app_note`.`url`,`app_note`.`url_inline`,`app_note`.`url_clicks`,`app_note`.`embed_id`,`app_note`.`event_id`,`app_note`.`is_direct`,`app_note`.`is_public`,`app_note`.`is_deleted`,`app_note`.`is_ad`,`app_note`.`reply_to_id`,`app_note`.`forwarded_from_id`,`app_note`.`original_note_id`,`app_note`.`stars`,`app_note`.`rsvp` FROM `app_note` LEFT OUTER JOIN `app_userprofile_notes` AS `m2m_app_note__recipients` ON `app_note`.`id` = `m2m_app_note__recipients`.`note_id` WHERE ((NOT (`app_note`.`is_deleted` = True)) AND `m2m_app_note__recipients`.`userprofile_id` = 17573) ORDER BY `app_note`.`date_sent` DESC LIMIT 16

Unreadable SQL

DjangoCon 2008 155

SELECT

n.*

FROM

app_note AS n

LEFT OUTER JOIN app_userprofile_notes AS l

ON

n.id=l.note_id

WHERE

n.is_deleted = False AND l.userprofile_id=17573

ORDER BY

n.date_sent DESC

LIMIT 16

Unreadable SQL

DjangoCon 2008 156

Django makes me

scared of joins

DjangoCon 2008 157

JOINs are evil

Actually,

DjangoCon 2008 158

DjangoCon 2008 159

Low version number

DjangoCon 2008 160

DjangoCon 2008 161

DjangoCon 2008 162

Suspiciously small

Django: 105 klocs

Flamework: 260 klocs

DjangoCon 2008 163

Suspiciously small

Very long lines?

DjangoCon 2008 164

Can’t pluralize octopus

DjangoCon 2008 165

Commit all fields at once

DjangoCon 2008 166

Race conditions!

DjangoCon 2008 167

Dirty flags

DjangoCon 2008 168

Don’t make Malcolm cry

DjangoCon 2008 169

No simple way to inc/dec

DjangoCon 2008 170

Makes consistency hard!

UPDATE foo SET x=x+1

DjangoCon 2008 171

Character encoding

Input validation?

DjangoCon 2008 172

Character encoding

Input validation?

(Probably broken)

DjangoCon 2008 173

No mascot!?!

DjangoCon 2008 174

Echidna?

DjangoCon 2008 175

MAGICAL POWERS

DjangoCon 2008 176

No deployment system

DjangoCon 2008 177

Extending models

big enough

Tables are never

DjangoCon 2008 178

Model changes

manage.py reset appname

DjangoCon 2008 179

django-evolution

dmigrations

DjangoCon 2008 180

What’s django

done for you

lately?

thanks

(now go make it better)

DjangoCon 2008 182

Photo credits• flickr.com/photos/wilson/18685396/• flickr.com/photos/uhop/105063089/• flickr.com/photos/plasticbag/91453376/• flickr.com/photos/zenoc/1408162618/• flickr.com/photos/subinev/27810058/• flickr.com/photos/kaptainkobold/2531797176/• flickr.com/photos/esti/243781036/• flickr.com/photos/oneras/253617128/• flickr.com/photos/josefstuefer/72512671/• flickr.com/photos/pgoyette/168076182/• flickr.com/photos/paulhammond/2825869449/• flickr.com/photos/nez/378348754/• flickr.com/photos/calevans/2265863104/• flickr.com/photos/mbiddulph/416190643/• flickr.com/photos/obliterated/2249663391/• flickr.com/photos/salim/67753003/• flickr.com/photos/sosalem/2816909110/• flickr.com/photos/radiorover/324193883/• flickr.com/photos/nickwheeleroz/2773776799/• flickr.com/photos/rse/22972901/• flickr.com/photos/rougerouge/534615363/• flickr.com/photos/hawkexpress/386355092/• flickr.com/photos/escalla/438817719/• flickr.com/photos/mknightphoto/2295688304/• flickr.com/photos/petereed/138369750/

• flickr.com/photos/sharynmorrow/2571566304/• flickr.com/photos/florathexplora/286035943/• flickr.com/photos/webguru4god/2233500779/• flickr.com/photos/emdot/195189924/• flickr.com/photos/kayepants/391645870/• flickr.com/photos/ppowers/793939285/• flickr.com/photos/dinesh_valke/425540358/• flickr.com/photos/hawkexpress/306276212/• flickr.com/photos/cedric1981/383614033/• flickr.com/photos/macspite/1118042091/• flickr.com/photos/jpstanley/1440357613/• flickr.com/photos/ashclements/248887492/• flickr.com/photos/kecko/1876479840/• flickr.com/photos/difusa/131100622/• flickr.com/photos/amagill/378984660/• flickr.com/photos/bea_k63w-wa/2466009108/• flickr.com/photos/namullim/2096115820/• flickr.com/photos/lotterymonkey/175248733/• flickr.com/photos/13519089@N03/1380483002/• flickr.com/photos/gswj/10344097/• flickr.com/photos/deanj/67607256/• flickr.com/photos/malias/2218694639/• flickr.com/photos/clintjcl/120760767/• flickr.com/photos/grandpamikey/2228239585/• flickr.com/photos/lea/2829752510/• flickr.com/photos/superamit/196481424/

DjangoCon 2008 183

More photo credits• flickr.com/photos/simon999/2419051858/• flickr.com/photos/tonyjcase/2172060723/• flickr.com/photos/heypaul/1428681/• flickr.com/photos/swisscan/2308034084/• flickr.com/photos/apollonia666/310793656/• flickr.com/photos/bdorfman/15846725/• flickr.com/photos/wishymom/566394520/• flickr.com/photos/jgarber/121886004/• flickr.com/photos/eole/380316678/• flickr.com/photos/917press/1940509163/• flickr.com/photos/wallyg/476718069/• flickr.com/photos/biwook/390088839/• flickr.com/photos/bdjsb7/1674027307/• flickr.com/photos/naveenroy/314965221/• flickr.com/photos/wyldkyss/2757474674/• flickr.com/photos/orinrobertjohn/409812627/• flickr.com/photos/candiedwomanire/1651870/• flickr.com/photos/dalvenjah/408497650/• flickr.com/photos/krikit/2657457178/• flickr.com/photos/w5nyv/2370344/• flickr.com/photos/jordanfischer/72510316/• flickr.com/photos/tedsblog/91531710/• flickr.com/photos/celesterc/1069893367/• flickr.com/photos/spacematters/766372252/• flickr.com/photos/esti/147733640/• flickr.com/photos/rbp/2833593771/

• flickr.com/photos/jordanroher/228435564/• flickr.com/photos/tambako/2524829095/• flickr.com/photos/66132721@N00/2725908636/• flickr.com/photos/freeparking/1279927021/• flickr.com/photos/drurydrama/1352506223/• flickr.com/photos/mn_francis/397620193/• flickr.com/photos/dramaqueennorma/273371415/• flickr.com/photos/chasqui/2338990305/• flickr.com/photos/cityhunter12/2574288725/• flickr.com/photos/akbuthod/1508537255/• flickr.com/photos/nunoforos/2811186142/• flickr.com/photos/marcusjb/432600086/• flickr.com/photos/12495774@N02/2405297371/• flickr.com/photos/larimdame/572477975/• flickr.com/photos/harryharris/1525946537/• flickr.com/photos/davemorris/91808851/• flickr.com/photos/aplumb/121285138/• flickr.com/photos/peebot/825451566/• flickr.com/photos/reillyb/2216541900/• flickr.com/photos/steffe/423086866/• flickr.com/photos/ciordia/255983919/• flickr.com/photos/wwworks/2472230611/• flickr.com/photos/pnoid00/1909096140/• flickr.com/photos/jurvetson/2229899/• flickr.com/photos/foxypar4/766801643/• flickr.com/photos/wizardhere/2413404079/

DjangoCon 2008 184

these slides are online:

iamcal.com/talks