8. SQLAlchemy in Spoqa
‣ 첫 서비스 개발(2011.02)부터 이용
‣ PostgreSQL에 물려서 쓰고 있음
‣ 처음에 MySQL이었다가 변경
‣ 개발팀 6명 중 4명은 회사에서 처음 접함
9. 실전에서 부각되는
SQLAlchemy의 장점들
‣ 복잡한 쿼리도 만들 수 있다!
‣ DBA의 엄격한 설계 기준 맞추기
‣ 웹서비스 아닌 곳에서 ORM 쓰기
‣ 쌩판 처음 보는 테이블에 ORM 씌우기
10. Django ORM
class Manufacturer(models.Model):
name = models.CharField(max_length=30)
class Car(models.Model):
manufacturer = models.ForeignKey(Manufacturer,
related_name='cars')
name = models.CharField(max_length=30)
SQLAlchemy
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, backref
class Manufacturer(Base):
__tablename__ = 'manufacturers'
id = Column(Integer, primary_key=True)
name = Column(String(30))
class Car(models.Model):
__tablename__ = 'cars'
id = Column(Integer, primary_key=True)
manufacturer_id = Column(Integer, ForeignKey('manufacturers.id'))
name = Column(String(30))
manufacturer = relationship('Manufacturer', backref=
backref('cars', lazy='dynamic'))
http://lucumr.pocoo.org/2011/7/19/sqlachemy-and-you/
11. 어려워 보이는데요?
‣ 다른 ORM보다는 써야 할 것이 더 많은 편
‣ 하지만 회사처럼 장기적으로 제품을 개발해야 할 때
는 이러한 유연성이 문제 해결에 도움을 줌
‣ ORM이 자체적인 룰을 많이 가지고 그에 기반하여 스키마가
구성되면, 프로젝트 전체가 그 ORM에 의존하게 되어 막장이
될 수 있음
12. 저희는 이럴 때 좋았어요.
‣ LBS 법 때문에 위치 정보를 암호화해야 했음
‣ 기존 코드가 암호화하지 않은 위치정보를 다양히 참
조하여 꽤 큰 작업이 될 수도 있었음
‣ Hybrid Attributes 이용해 기존 코드를 거의 고치지
않고 저장 정보를 암호화함
‣ http://spoqa.github.com/2011/12/10/sqlalchemy-hybrid-
attributes.html
13. hybrid property 정의
@hybrid_property
def lat(self):
return float(aes_decrypt(self.encrypted_lat))
@lat.expression
def lat(cls):
decrypted = expr.func.aes_decrypt(
expr.func.unhex(cls.encrypted_lat), aes_key)
return cast(decrypted, db.Float(25))
@lat.setter
def lat(self, value):
self.encrypted_lat = aes_encrypt(str(value)[:16])
써보면...
>>> Place.query.filter(Place.lat - 37.52 > 0.01).count()
2011-12-10 02:26:57,731 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1
FROM ...
FROM place
WHERE aes_decrypt(unhex(place.encrypted_lat), %s) - %s > %s) AS anon_1
2011-12-10 02:26:57,731 INFO sqlalchemy.engine.base.Engine ('1234567890123456',
37.520000000000003, 0.01)
8L
>>>
15. 교육
‣ 일반적인 SQL 문법정도는 미리 알고 시작하세요.
‣ 스터디의 99%는 공식 사이트의 문서로!
‣ 처음엔 순서도 뒤죽박죽이고 알기 어려웠는데,
점점 보기 좋아지고 있어요.
‣ Flask-SQLAlchemy를 쓰신다면
해당 라이브러리의 튜토리얼도 아주 좋습니다.
17. DB Migration
‣ 과거엔 sqlalchemy-migrate를 많이 썼어요.
‣ 근데 이거 문제가 좀 있어요.
‣ http://blog.dahlia.kr/post/8153601295
‣ 그리고 불편해요.
18. alembic
‣ A new database migrations tool,
written by the author of SQLAlchemy
‣ Full support for transactional DDL
‣ "auto generation" of migrations
‣ 저희도 이번에 옮겨요. 많이 안정화 됐다길래...
20. 정리
‣ 복잡한 쿼리 작성과 처리가 어려운 예외 상황에 부딪
혀 ORM에 치를 떨고 계신 분들, 어서오세요.
‣ 여러 회사에서 적극적으로 쓰고 있으니 0.x라고 두려
워 마시고 시도해보셔도 좋아요.
‣ 교육은 공식 문서로. 오라일리북은 피하시고...
‣ 마이그레이션은 sqlalchemy-migrate가 많이 쓰여왔
으나 alembic을 시도해보세요.