PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Единичният тест на Django е неуспешен за множество схеми на Postgres

Схемите не се използват в много други DB машини. Като посочите схема във вашите модели, вие сте въвели зависимост във вашия код за postgres.

Има два начина, по които можете да решите проблема си;

Първо, можете да добавите път за търсене по подразбиране към вашия потребител на postgres. Недостатъкът на този подход е, че схемите вече не могат да се използват за пространство на имената, но предимството е, че ако вашата база данни някога се промени на различен двигател, вашият код ще функционира добре. Разпределението на имената на вашите таблици може да бъде постигнато чрез избор на някакъв стандартен начин за именуване на вашите таблици, подобно на начина, по който Django го прави по подразбиране (напр. appName_className)

Има два начина да постигнете това. Командата на postgres, за да го направите по този начин, е:

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

Начинът само за django да го направите е:

# 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'
        }
    }
}

Също така ще искате да промените:

db_table = 'cedirData\".\"persons'

до:

db_table = 'persons'

Като бонус вече можете да използвате:

manage.py inspectdb > models.py

което е хубава функция, така че не е необходимо да копирате на ръка съществуващата си база данни.

Това решение обаче няма да ви помогне, ако пространството на имената на схемата е било използвано силно във вашата база данни и други приложения разчитат на него. Друг подход би бил да напишете персонализиран тестов инструмент за създаване на тези схеми във вашата тестова база данни. Това е малко по-ангажиращо от горния подход и може да бъде доста объркващо. Наистина не препоръчвам да правите това, но ако се интересувате, мога да се опитам да помогна.

По-малко разхвърлян, но по-„хакерски“ начин би бил просто да замените meta, когато се изпълняват тестове. Това също ще бъде програма за тестване.

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]

Също така ще искате да дефинирате това като тестов инструмент във вашия файл settings.py.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Принудително SSL за Django Postgres връзка

  2. PostgreSQL - вмъкване на редове въз основа на избор от друга таблица и актуализиране на FK в тази таблица с нововмъкнатите редове

  3. Пропускане на двойните кавички за извършване на заявка в PostgreSQL

  4. Как да попълните външни ключове на таблица от други таблици

  5. PostgreSQL pg_ctl регистър грешка под Windows 7