sql >> Databáze >  >> RDS >> Mysql

Django a připojení k databázi pouze pro čtení

Setkal jsem se se stejným problémem (pomocí Django 1.11) a tato otázka byla v horní části mých výsledků Google pro ni.

Vašemu počátečnímu řešení chybí pouze jeden kritický kousek. Musíte Djangovi sdělit, jaké databázové modely 'C' a 'D' používají. Co se mi osvědčilo:

class ExternalModel(models.Model):
    class Meta:
        managed = False
        abstract = True    
        app_label = 'support'

Poté řekněte svému databázovému routeru, jak se má chovat, když narazí na app_label v sekci allow_migrate():

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label == 'support':
            return False
        return (db == 'default')

Nejsem si jistý, že je to v očích týmu Django nejsprávnější řešení, ale efekt je, že allow_migrate() vrací False pro všechny modely definované s touto hodnotou atributu app_label.

dokumentace o směrovačích Django nezmiňuje to explicitně (nebo alespoň s ukázkami modelového kódu, které objasňují, jak ORM předává hodnotu pro 'db' do allow_migrate()), ale mezi atributy 'app_label' a 'managed' to můžete získat do práce*.

* V mém případě je výchozí postgres a databáze pouze pro čtení je Oracle 12 přes cx_Oracle.



  1. Doporučené postupy replikace PostgreSQL – část 2

  2. Indexování databáze v kostce s porovnáním B+strom a hash

  3. Spojte dva stoly (se vztahem 1-M), kde je třeba druhý stůl „srovnat“ do jednoho řádku

  4. Psycopg2 nemá rád názvy tabulek, které začínají malým písmenem