Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Baca budak, baca-tulis pengaturan master

Saya memiliki contoh bagaimana melakukan ini di blog saya di http://techspot.zzzeek.org/2012/01/11/django-style-database-routers-in-sqlalchemy/ . Pada dasarnya Anda dapat meningkatkan Sesi sehingga memilih dari master atau slave berdasarkan kueri demi kueri. Satu kesalahan potensial dengan pendekatan itu adalah jika Anda memiliki satu transaksi yang memanggil enam kueri, Anda mungkin berakhir menggunakan kedua budak dalam satu permintaan....tetapi di sana kami hanya mencoba meniru fitur Django :)

Pendekatan ajaib yang sedikit lebih sedikit yang juga menetapkan ruang lingkup penggunaan secara lebih eksplisit yang saya gunakan adalah dekorator pada tampilan yang dapat dipanggil (apa pun namanya di Flask), seperti ini:

@with_slave
def my_view(...):
   # ...

with_slave akan melakukan sesuatu seperti ini, dengan asumsi Anda memiliki Sesi dan beberapa mesin yang disiapkan:

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

Idenya adalah memanggil Session(bind=slave) memanggil registri untuk mendapatkan objek Sesi yang sebenarnya untuk utas saat ini, membuatnya jika tidak ada - namun karena kami memberikan argumen, scoped_session akan menegaskan bahwa Sesi yang kami buat di sini pasti baru.

Anda mengarahkannya ke "slave" untuk semua SQL berikutnya. Kemudian, ketika permintaan selesai, Anda akan memastikan bahwa aplikasi Flask Anda memanggil Session.remove() untuk menghapus registri untuk utas itu. Ketika registri selanjutnya digunakan pada utas yang sama, itu akan menjadi Sesi baru yang diikat kembali ke "master".

Atau varian, Anda ingin menggunakan "slave" hanya untuk panggilan itu, ini "lebih aman" karena mengembalikan semua ikatan yang ada kembali ke Sesi:

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

Untuk masing-masing dekorator ini, Anda dapat membalikkan keadaan, membuat Sesi diikat ke "budak" di mana dekorator meletakkannya di "master" untuk operasi penulisan. Jika Anda menginginkan budak acak dalam kasus itu, jika Flask memiliki semacam acara "permintaan dimulai", Anda dapat mengaturnya pada saat itu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. GALAT:HHH000299:Tidak dapat menyelesaikan pembaruan skema java.lang.NullPointerException

  2. MySQL FULLTEXT Cari di>1 Tabel

  3. Dapatkan nilai dari database menggunakan PHP PDO dan perbarui input untuk diperiksa

  4. Kode PHP untuk memasukkan nilai kotak centang ke kolom tertentu di mysql dengan formulir pilih

  5. WAMP Tidak dapat mengakses di jaringan lokal 403 Dilarang