Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Đọc phụ, đọc-ghi thiết lập chính

Tôi có một ví dụ về cách thực hiện việc này trên blog của mình tại http://techspot.zzzeek.org/2012/01/11/django-style-database-routers-in-sqlalchemy/ . Về cơ bản, bạn có thể nâng cao Phiên để nó chọn từ chủ hoặc tớ trên cơ sở từng truy vấn. Một trục trặc tiềm ẩn với cách tiếp cận đó là nếu bạn có một giao dịch gọi sáu truy vấn, bạn có thể kết thúc bằng việc sử dụng cả hai nô lệ trong một yêu cầu .... nhưng ở đó chúng tôi chỉ đang cố gắng bắt chước tính năng của Django :)

Một cách tiếp cận ít ma thuật hơn một chút cũng thiết lập phạm vi sử dụng rõ ràng hơn mà tôi đã sử dụng là trình trang trí trên các bảng gọi dạng xem (bất kỳ cái gì chúng được gọi trong Flask), như thế này:

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

with_slave sẽ làm điều gì đó như thế này, giả sử bạn có một Phiên và một số công cụ được thiết lập:

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

Ý tưởng là gọi Session(bind=slave) gọi sổ đăng ký đến đối tượng Session thực tế cho luồng hiện tại, tạo nó nếu nó không tồn tại - tuy nhiên vì chúng ta đang truyền một đối số, scoped_session sẽ khẳng định rằng Session mà chúng ta đang tạo ở đây chắc chắn là hoàn toàn mới.

Bạn trỏ nó vào "nô lệ" cho tất cả các SQL tiếp theo. Sau đó, khi yêu cầu kết thúc, bạn phải đảm bảo rằng ứng dụng Flask của mình đang gọi Session.remove() để xóa sổ đăng ký cho chủ đề đó. Khi sổ đăng ký được sử dụng tiếp theo trên cùng một chuỗi, nó sẽ là một Phiên mới bị ràng buộc trở lại "chủ".

Hoặc một biến thể, bạn chỉ muốn sử dụng "nô lệ" cho lệnh gọi đó, điều này "an toàn hơn" ở chỗ nó khôi phục mọi ràng buộc hiện có trở lại Phiên:

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

Đối với mỗi trình trang trí này, bạn có thể đảo ngược mọi thứ, yêu cầu Phiên bị ràng buộc với một "nô lệ" nơi trình trang trí đặt nó trên "chủ" cho các hoạt động ghi. Nếu bạn muốn một nô lệ ngẫu nhiên trong trường hợp đó, nếu Flask có một số loại sự kiện "bắt đầu yêu cầu", bạn có thể thiết lập nó tại thời điểm đó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL gia tăng giá trị

  2. PyInstaller, tệp đặc tả, Lỗi nhập khẩu:Không có mô-đun nào có tên 'blah'

  3. Nối dữ liệu vào trường cơ sở dữ liệu MySQL đã có dữ liệu trong đó

  4. cách tìm số ngày trong tháng trong mysql

  5. Cách giải quyết vấn đề Không thể tải plugin xác thực 'caching_sha2_password'