Upload
jc-kim
View
3.030
Download
8
Embed Size (px)
DESCRIPTION
Citation preview
회사에서 써보는 SQLAlchemy
김재석
저는 이런 사람입니다.
‣ (주)스포카 공동창업자 / 기술 총괄
‣ 도도포인트 서비스 개발중
‣ 쉽고 빠른 적립, 스마트한 고객관리
‣ 300여개 매장 이용 중
‣ http://dodopoint.com/
SQLAlchemy 소개
이게 뭔가요.
‣ The Python SQL Toolkit and
Object Relational Mapper
‣ http://www.sqlalchemy.org/
뭐가 좋은가요.
‣ Function-based query construction
‣ Framework independent
‣ High Performing Architecture
‣ Non-Opinionated
이렇게들 쓰고 있습니다.
현업에서의 장점?
SQLAlchemy in Spoqa
‣ 첫 서비스 개발(2011.02)부터 이용
‣ PostgreSQL에 물려서 쓰고 있음
‣ 처음에 MySQL이었다가 변경
‣ 개발팀 6명 중 4명은 회사에서 처음 접함
실전에서 부각되는 SQLAlchemy의 장점들
‣ 복잡한 쿼리도 만들 수 있다!
‣ DBA의 엄격한 설계 기준 맞추기
‣ 웹서비스 아닌 곳에서 ORM 쓰기
‣ 쌩판 처음 보는 테이블에 ORM 씌우기
from sqlalchemy import Column, Integer, String, ForeignKeyfrom 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'))
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)
Django ORM
SQLAlchemy
http://lucumr.pocoo.org/2011/7/19/sqlachemy-and-you/
어려워 보이는데요?
‣ 다른 ORM보다는 써야 할 것이 더 많은 편
‣ 하지만 회사처럼 장기적으로 제품을 개발해야 할 때
는 이러한 유연성이 문제 해결에 도움을 줌
‣ ORM이 자체적인 룰을 많이 가지고 그에 기반하여 스키마가
구성되면, 프로젝트 전체가 그 ORM에 의존하게 되어 막장이
될 수 있음
저희는 이럴 때 좋았어요.
‣ LBS 법 때문에 위치 정보를 암호화해야 했음
‣ 기존 코드가 암호화하지 않은 위치정보를 다양히 참
조하여 꽤 큰 작업이 될 수도 있었음
‣ Hybrid Attributes 이용해 기존 코드를 거의 고치지
않고 저장 정보를 암호화함
‣ http://spoqa.github.com/2011/12/10/sqlalchemy-hybrid-
attributes.html
@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_12011-12-10 02:26:57,731 INFO sqlalchemy.engine.base.Engine ('1234567890123456', 37.520000000000003, 0.01)8L>>>
hybrid property 정의
써보면...
도입시 고민할 것들
교육
‣ 일반적인 SQL 문법정도는 미리 알고 시작하세요.
‣ 스터디의 99%는 공식 사이트의 문서로!
‣ 처음엔 순서도 뒤죽박죽이고 알기 어려웠는데,
점점 보기 좋아지고 있어요.
‣ Flask-SQLAlchemy를 쓰신다면
해당 라이브러리의 튜토리얼도 아주 좋습니다.
이거 보지 마세요.
DB Migration
‣ 과거엔 sqlalchemy-migrate를 많이 썼어요.
‣ 근데 이거 문제가 좀 있어요.
‣ http://blog.dahlia.kr/post/8153601295
‣ 그리고 불편해요.
alembic
‣ A new database migrations tool,
written by the author of SQLAlchemy
‣ Full support for transactional DDL
‣ "auto generation" of migrations
‣ 저희도 이번에 옮겨요. 많이 안정화 됐다길래...
정리
정리
‣ 복잡한 쿼리 작성과 처리가 어려운 예외 상황에 부딪
혀 ORM에 치를 떨고 계신 분들, 어서오세요.
‣ 여러 회사에서 적극적으로 쓰고 있으니 0.x라고 두려
워 마시고 시도해보셔도 좋아요.
‣ 교육은 공식 문서로. 오라일리북은 피하시고...
‣ 마이그레이션은 sqlalchemy-migrate가 많이 쓰여왔
으나 alembic을 시도해보세요.
감사합니다.