나는 내 블로그 http://techspot.zzzeek.org/2012/01/11/django-style-database-routers-in-sqlalchemy/에서이를 수행하는 방법에 대한 예제를 가지고 있습니다. 기본적으로 세션을 향상시켜 쿼리 단위로 마스터 또는 슬레이브에서 선택하도록 할 수 있습니다. 이 접근법의 잠재적 인 결함 중 하나는 6 개의 쿼리를 호출하는 하나의 트랜잭션이있는 경우 한 요청에서 두 슬레이브 모두를 사용하여 종료 될 수 있다는 것입니다. 그러나 여기에는 장고의 기능을 모방하려고합니다.
A 약간 또한 더 명시 적으로 내가 사용했습니다 사용의 범위를 설정 덜 마법의 접근 방식은 (그들이 플라스크에서 호출하든)보기 callables에 장식은 다음과 같이이다 :
@with_slave
def my_view(...):
# ...
with_slave이 같은 것을 할 것입니다, 세션이 있고 일부 엔진이 설정되었다고 가정 할 경우 :
master = create_engine("some DB")
slave = create_engine("some other DB")
Session = scoped_session(sessionmaker(bind=master))
def with_slave(fn):
def go(*arg, **kw):
s = Session(bind=slave)
return fn(*arg, **kw)
return go
아이디어는 Session(bind=slave)
을 호출하면 현재 스레드에 대한 실제 Session 객체를 얻기 위해 레지스트리를 호출하고 존재하지 않는 경우 레지스트리를 생성한다는 것입니다. 그러나 인수를 전달하기 때문에 scoped_session은 우리가 가진 Session 여기 만드는 것은 확실히 새로운 것입니다.
모든 후속 SQL에 대해 "슬레이브"를 가리 키십시오. 그런 다음 요청이 끝나면 Flask 앱이 Session.remove()
을 호출하여 해당 스레드의 레지스트리를 지우도록해야합니다. 레지스트리가 다음에 동일한 스레드에서 사용될 때 "마스터"에 바인드 된 새 세션이됩니다. 이러한 장식의 각각에 대해
def with_slave(fn):
def go(*arg, **kw):
s = Session()
oldbind = s.bind
s.bind = slave
try:
return fn(*arg, **kw)
finally:
s.bind = oldbind
return go
:
또는 변형, 당신은 그냥 전화의 "노예"를 사용하려면,이는 다시 세션에 대한 기존의 바인딩을 복원하도록에서 "안전"입니다 당신은 일을 뒤집을 수 있고, Session이 쓰기 작업을 위해 "master"에 놓는 "slave"에 바인드되게 할 수 있습니다. 이 경우 랜덤 슬레이브를 원한다면, Flask에 어떤 종류의 "요청 시작"이벤트가 있다면 그 시점에서 설정할 수 있습니다.
가 Thnx zzzeek이 많은 도움이 : 여기
은 예입니다. sqlalchemy에 대한 모든 멋진 작업에 대한 명성. –Rad 주석, 훌륭한 코드 예제! sqlalchemy가 쿼리 분석과 자동 라우팅을 할 수있는 방법이 있다면 좋겠지 만 쿼리가 tmp 테이블이나 다른 쓰기 작업을 일으킬 수있는 세계에서 아마도 일반적으로 읽기만 가능한 것의 결과로 요청하는 것과 같은 것이 필요할 것입니다 쿼리를 제출하기 전에 백엔드에서 쿼리 계획을 수립하면 대부분의 경우 가치가있는 것보다 더 번거롭지 않게됩니다. –
"쿼리 분석"옵션이 있지만 분석을 직접 작성해야합니다. 수평 샤딩 시스템은 이러한 종류의 기술에 대한 예를 보여줍니다. http://docs.sqlalchemy.org/en/rel_0_7/orm/extensions/horizontal_shard.html을 참조하십시오. – zzzeek