sql >> Databáze >  >> RDS >> PostgreSQL

Test jednotky Django selhal pro více schémat Postgres

V mnoha jiných DB engine se schémata nepoužívají. Zadáním schématu ve svých modelech jste do kódu zavedli závislost pro postgres.

Existují dvě cesty, kterými můžete svůj problém vyřešit;

Nejprve můžete svému uživateli postgres přidat výchozí vyhledávací cestu. Nevýhodou tohoto přístupu je, že schémata již nelze používat pro jmenný prostor, ale výhodou je, že pokud se vaše databáze někdy změní na jiný stroj, váš kód bude fungovat dobře. Jmenného prostoru tabulek lze dosáhnout výběrem nějakého standardního způsobu pojmenování tabulek, podobně jako to dělá Django ve výchozím nastavení (např. appName_className)

Toho lze dosáhnout dvěma způsoby. Příkaz postgres, jak to udělat tímto způsobem, je:

ALTER USER (your user) SET search_path = "$user",(schema1),(schema2),(schema3),(...)

Jediný způsob, jak to udělat django, by byl:

# Warning! This is untested, I just glanced at the docs and it looks right.
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        # some configuration here
        'OPTIONS': {
            'options': '-c search_path=schema1,schema2,schema3'
        }
    }
}

Budete také chtít změnit:

db_table = 'cedirData\".\"persons'

komu:

db_table = 'persons'

Jako bonus nyní můžete použít:

manage.py inspectdb > models.py

což je příjemná funkce, takže nemusíte svou stávající databázi ručně kopírovat.

Toto řešení vám však nepomůže, pokud byl ve vaší databázi silně využíván jmenný prostor schématu a jiné aplikace na něj spoléhají. Jiným přístupem by bylo napsat vlastní testovací běžec pro vytvoření těchto schémat ve vaší testovací databázi. Tento přístup je poněkud složitější než výše uvedený přístup a může být poněkud chaotický. Toto opravdu nedoporučuji, ale pokud máte zájem, mohu se pokusit pomoci.

Méně chaotický, ale více „hacknutý“ způsob by byl jednoduše přepsat meta, když jsou spuštěny testy. To by byl také testovací běžec.

from django.test.simple import DjangoTestSuiteRunner
from django.db.models.loading import get_models

class SchemaModelTestRunner(DjangoTestSuiteRunner):
    """Docstring"""
    def setup_test_environment(self, *args, **kwargs):
        self.original_db_tables = {}
        self.schema_models = [m for m in get_models()
                                 if '"."' in m._meta.db_table]
        for m in self.schema_models:
            schema, table = m._meta.db_table.split('"."')
            self.original_db_tables[m] = m._meta.db_table
            m._meta.db_table = 'schema_'+schema+'_table_'+table

        super(SchemaModelTestRunner, self).setup_test_environment(*args,
                                                                   **kwargs)
    def teardown_test_environment(self, *args, **kwargs):
        super(SchemaModelTestRunner, self).teardown_test_environment(*args,
                                                                      **kwargs)
        # reset models
        for m in self.schema_models:
            m._meta.db_table = self.original_db_tables[m]

Také to budete chtít definovat jako testovací běžec v souboru settings.py.




  1. Doctrine 2 SUM() ekvivalentní pomocník?

  2. MySQL - Počítání dvou věcí s různými podmínkami

  3. 11 způsobů, jak získat primární klíč v SQL Server (příklady T-SQL)

  4. MySQL efektivně ukládá neorientované okraje grafu