6. The person who want to know …
以下のことを知りたい方
Sharing them source code for job as a OSS.
仕事で使うコードをOSSとして公開すること
Structure of Django database backend
Djangoのdatabase backend周りの構造
How to bring up your code.
コードを育てていく方法
Target attendees
7. You can get some benefit if you open your (tiny) code
ちょっとしたコードでも公開しておくと良いことが
あるよ
「良いこと」って? / What is benefit?
誰かがバグを見つけれてくれたり / Somebody find
bugs
誰かがバグを直してくれたり / Somebody fix bugs
誰かが機能を追加してくれたり / Somebody add
features
動機 / Motivation
8. こんなコードだれも使わないから公開しても無駄だよ
Waste my time because nobody want to use such code
公開するの面倒くさいし..
publishing is messy work..
ライセンスとかよく分からない
I have no knowledge about license
会社やお客さんからどうやって許可をもらうの?
We must to get permission papers from business customer
いろんな人にコードがダサイとかバグだとか言われちゃ
う
I don’t want to hear somebody criticize my code
反論 / Objection
11. Open Source Software (OSS)
Web Application Framework
Monolithic
Full documented
Support several databases
SQLite, MySQL, PostgreSQL
and Oracle
Django ORM
Django Admin
Useful data management web console for Database
What is Django ?
12. Petabyte-scale data warehouse service
on Amazon Web Service
The complicated query for which it
takes several hours in MySQL will be
completed in tens of seconds.
Alternatively the query issuing cost is expensive.
Compatible with PostgreSQL-8.0.4
Many incompatibility also available…
Use identity instead of sequence, No INDEX, No ALTER
COLUMN, No SET TIME ZONE, No RETURNING, No
SELECT FOR UPDATE, …
What is Redshift ?
Amazon Redshift
16. DjangoからDatabaseへは、こ
んな感じで繋がっている
RedshiftというやつはPostgres
互換らしい
既存のDriverでうまく動いた
Django Admin で行を追加した
らクラッシュした
!?
Django uses “RETURNING”
SQL statement for model.save()
Redshift doesn’t support
“RETURNING”.
First Motivation – Why I created a backend
Django ORM
Django AdminYour Code (View)
Django Postgres Backend
supports postgresql 9.x or later
psycopg2 Driver
Redshift
based upon postgresql 8.0.2
CRUSH!!
17. PostgreSQL supports RETURNING from 8.2.
Redshift based upon PostgreSQL 8.0.2.
(´・ω・`)
おしい
near-miss
First Motivation – Why I created a backend
18. Anyway, I googled
A few questions on StackOverflow are found
SO: “Redshift is compat with PostgreSQL-8.0.2,
so you can use postgresql_psycopg2 backend”
(sigh) ..it’s not true
SO: “There is django-redshift repository on Github!”
/shrug Oh yes, it’s using `RETURNING` ..
First Motivation – Why I created a backend
22. No documentation for “How to
create new Django Database
Backend”
StackOverflow says “SQLite
backend is quite simple if you’re
looking to go that road.”
Djangoライブラリのどこかにあ
るpostgresql_psycopg2 Backend
の一部を変更して、Redshift用
のSQLに変換すればよさそう
なんだかたくさんあるけど、必
要なのは “RETURNING” を使っ
ている部分の変更だけ
ということで。
Based upon postgresql_psycopg2
23. 1. from django.db.backends import (
2. BaseDatabaseValidation,
3. )
4. from django.db.backends.postgresql_psycopg2.base import (
5. DatabaseFeatures as BasePGDatabaseFeatures,
6. DatabaseWrapper as BasePGDatabaseWrapper,
7. DatabaseOperations as BasePGDatabaseOperations,
8. DatabaseClient,
9. DatabaseCreation,
10. DatabaseIntrospection,
11. )
12.
13.
14. class DatabaseFeatures(BasePGDatabaseFeatures):
15. can_return_id_from_insert = False
16.
17.
18. class DatabaseOperations(BasePGDatabaseOperations):
19.
20. def last_insert_id(self, cursor, table_name, pk_name):
21. cursor.execute('SELECT MAX({pk}) from {table}'.format(pk=pk_name, table=self.quote_name(table_name)))
22. return cursor.fetchone()[0]
23.
24.
25. class DatabaseWrapper(BasePGDatabaseWrapper):
26. vendor = 'redshift'
27.
28. def __init__(self, *args, **kwargs):
29. super(DatabaseWrapper, self).__init__(*args, **kwargs)
30.
31. self.features = DatabaseFeatures(self)
32. self.ops = DatabaseOperations(self)
33. self.client = DatabaseClient(self)
34. self.creation = DatabaseCreation(self)
35. self.introspection = DatabaseIntrospection(self)
36. self.validation = BaseDatabaseValidation(self)
Source Code v 0.1 (2015-03-24)
Importing names to override
default behavior of
postgresql_psycopg2
Replacing attributes to override
default behavior of
postgresql_psycopg2
Replacing SQL statement
“RETURNING” …
with “SELECT MAX(pk)”
24. 1. index 1fd9e51..c4ad661 100644
2. --- a/django_redshift_backend/base.py
3. +++ b/django_redshift_backend/base.py
4. @@ -20,6 +20,7 @@ from django.db.backends.postgresql_psycopg2.base import (
5.
6. class DatabaseFeatures(BasePGDatabaseFeatures):
7. can_return_id_from_insert = False
8. + has_select_for_update = False
9.
10.
11. class DatabaseOperations(BasePGDatabaseOperations):
12. @@ -28,6 +29,9 @@ class DatabaseOperations(BasePGDatabaseOperations):
13. cursor.execute('SELECT MAX({pk}) from {table}'.format(pk=pk_name,
table=self.quote_name(table_name)))
14. return cursor.fetchone()[0]
15.
16. + def for_update_sql(self, nowait=False):
17. + raise NotImplementedError('SELECT FOR UPDATE is not implemented for this
database backend')
18. +
19.
20. class DatabaseWrapper(BasePGDatabaseWrapper):
21. vendor = 'redshift'
Source Code v 0.1.1 (2015-03-27)
Disable SELECT FOR UPDATE
If used, raise NotImplementadError
25. Why do I open my code?
NEEDS for Django Redshift Backend?
YES, but little.
WRONG information are there.
EXPOSED to the public eye
GIVE the code to next someone like me
27. よかったこと
Githubだけで公開したので身軽
この段階ではテストコードを書かなかった
今後やりたいこと
SET TIME ZONE を発行しない(設定で回避してい
た)
Django migration をサポートしたい
Summary of First Motivation
38. Django-1.7.x のサポートが2015/12末で終了
Django-1.8にバージョンアップしたら、 “SET TIME
ZONE” SQLを発行して落ちた
1.7:
settings.TIME_ZONE=None で SET TIME ZONE 抑止
1.8:
settings.TIME_ZONEとDBの実際の値を比較して違っ
ていたらSET TIME ZONE!
ドキュメント化されていない(´・Д・)
Third Motivation – Django-1.8
39. 0.2 (2016-01-08) SET TIME ZONE に対応
0.2.1 (2016-01-28) ちょっと修正
当初課題だった3つの問題が解決
1. RETURNING
2. SELECT FOR UPDATE
3. SET TIME ZONE
人目に付くところに置いて、もっと広く使って貰って
もらう時期が来た気がした。
Third Motivation – Django-1.8
43. Fourth Motivation – migration support
PR for migration support (2016-03-07)
• Use CustomSchemaEditor to support sqlmigrate
• Map DateTimeField to “TIMESTAMP”
• Map AutoField to “identity” to support sqlmigrate
44. Fourth Motivation – migration support
Mar 7
Mar 7
Mar 10
Mar 23
Apr 8
Apr 8
May 14
Merged!
45. Fourth Motivation – migration support
Mar 7
Mar 7
Mar 10
Mar 23
Apr 8
Apr 8
May 14
Thanks!
46. Fourth Motivation – migration support
Mar 7
Mar 7
Mar 10
Mar 23
Apr 8
Apr 8
May 14
Plz Release
0.3 to PyPI?
59. こんなコードだれも使わないから公開しても無駄だよ
Waste my time because nobody want to use such code
自分より先に誰かが作って公開してくれてたら嬉しかったよね?
公開するの面倒くさいし..
publishing is messy work..
素振りだと思ってやってみたら?
ライセンスとかよく分からない
I have no knowledge about license
やってればそのうち分かるよ
会社やお客さんからどうやって許可をもらうの?
We must to get permission papers from business customer
伝え方は色々あるよ
いろんな人にコードがダサイとかバグだとか言われちゃう
I don’t want to hear somebody criticize my code
だれかが自分の代わりにバグを見つけてくれるならラッキーだよね
反論への反論 / Objection to Objection
postgresql_psycopg2のSET TIME ZONE関連の実装が変わってしまった
Django-1.7: Noneを設定しておけばSET TIME ZONEが発行されない
Django-1.8: 設定した値と、DBのTIME ZONEが違ったら SET TIME ZONEを発行する!
Django-1.8 の非互換の変更としてドキュメント化されていない