Mysql
 sql >> база данни >  >> RDS >> Mysql

Четене подчинен, четене-запис главна настройка

Имам пример как да направя това в моя блог на адрес http://techspot.zzzeek.org/2012/01/11/django-style-database-routers-in-sqlalchemy/ . По принцип можете да подобрите сесията, така че да избира от главен или подчинен на база заявка по заявка. Един потенциален проблем с този подход е, че ако имате една транзакция, която извиква шест заявки, може в крайна сметка да използвате и двата подчинени в една заявка.... но там ние просто се опитваме да имитираме функцията на Django :)

Малко по-малко магически подход, който също така установява обхвата на използване по-ясно, който използвах, е декоратор на извиквания за изглед (както и да се наричат ​​в Flask), като това:

@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 ще твърди, че сесията, която правим тук, определено е чисто нова.

Насочвате го към "подчинения" за всички следващи 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

За всеки от тези декоратори можете да обръщате нещата, да накарате сесията да бъде обвързана с "подчинен", където декораторът я поставя на "главен" за операции по запис. Ако искате произволен подчинен в този случай, ако Flask имаше някакво събитие „заявка започва“, бихте могли да го настроите в този момент.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Резултати от базата данни като обекти или масиви?

  2. Мога ли да използвам подготвен израз на PDO, за да обвържа идентификатор (име на таблица или поле) или ключова дума за синтаксис?

  3. Изберете всички дати между две дати, без да използвате таблица (генерирайте списък с дати)

  4. Как да оптимизирате изгледите на MySQL

  5. СЪЗДАЙТЕ ТИП на MySQL