Multiple Database

Menyetel Multiple Koneksi ke database secara dinamis sesuai dengan domain yang request

Setelan ini akan berguna jika aplikasi backend kamu memerlukan routing database untuk setiap domain yang melakukan request data. Berikut illustrasi kasus nya:

  • Backend Saba Framework Python kita beri nama : "api.domainku.oh.yeah"

  • Lalu aplikasi frontend "domainku.oh.yeah" milik corporate A & "domainlainnya.oh.yeah" milik corporate B meminta data pengguna ke backend kita.

  • Tentu data pengguna diberikan kepada "domainku.oh.yeah" & "domainlainnya.oh.yeah" harus berbeda,

  • Maka aplikasi Saba Framework Python kita harus melakukan routing ke database sesuai dengan domain yang request tersebut.

Cara melakukan routingnya seperti ini:

  1. Buka File config.py pada folder root config.py, lalu sesuaikan seperti contoh ini:

    SQLALCHEMY_BINDS = os.environ.get('DATABASE_URL_MULTI')
  2. Tambahkan sebuah decorator bawaan flask @app.before_request pada file run.py yang terletak di root. Fungsi ini akan dijalankan ketika ada user yang melakukan request ke aplikasi kita, contohnya seperti ini:

    import ast
    from flask import request
    
    connection_map = ast.literal_eval(os.environ.get('DATABASE_URL_MULTI'))
    
    @app.before_request
    def before_request():
        origin = request.headers.get('Origin')
        if origin:
            origin = origin.replace('http://', '').replace('https://', '').replace('/', '')
            # print(f'ORIGIN: {origin}')
            if origin in connection_map.keys():
                db.choose_connection(origin)
            else:
                db.choose_connection('default')
        else:
            db.choose_connection('default')
            
  3. Lalu buka file extension.py pada folder /app dan setel menjadi seperti ini:

    from flask import g
    
    class MultiTenantSQLAlchemy(SQLAlchemy):
        def choose_connection(self, bind_key):
            if hasattr(g, 'tenant'):
                raise RuntimeError('Switching tenant in the middle of the request.')
            g.tenant = bind_key
    
        def get_engine(self, app=None, bind=None):
            if bind is None:
                if not hasattr(g, 'tenant'):
                    raise RuntimeError('No Connection chosen.')
                bind = g.tenant
            return super().get_engine(app=app, bind=bind)
    
    
    db = MultiTenantSQLAlchemy()
    # db = SQLAlchemy()
    
  4. Buka file app/__init__.py lalu sesuaikan seperti ini:

    import ast
    import os
    app.config['SQLALCHEMY_BINDS'] = ast.literal_eval(os.environ.get('DATABASE_URL_MULTI'))
  5. Buka file .env lalu setel koneksi sesuai dengan domain yang nanti akan request seperti ini:

    DATABASE_URL_MULTI="{ 'default': 'mssql+pyodbc://sa:passwordrahasia@localhost/namadatabase_demo?driver=SQL+Server', 'domainku.oh.yeah': 'mssql+pyodbc://sa:passwordrahasia@localhost/namadatabase_1?driver=SQL+Server', 'domainlainnya.oh.yeah': 'mssql+pyodbc://sa:passwordrahasia@localhost/namadatabase_2?driver=SQL+Server' }"

  6. Jalankan kembali aplikasi backend, kemudian lakukan pengujian dari beberapa domain.

Last updated