PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Tes unit Django gagal untuk beberapa skema Postgres

Skema tidak digunakan di banyak mesin DB lainnya. Dengan menentukan skema dalam model Anda, Anda telah memperkenalkan ketergantungan pada kode Anda untuk postgres.

Ada dua rute yang dapat Anda ambil untuk menyelesaikan masalah Anda;

Pertama, Anda dapat menambahkan jalur pencarian default ke pengguna postgres Anda. Kerugian dari pendekatan ini adalah bahwa skema tidak lagi dapat digunakan untuk penspasian nama, tetapi keuntungannya adalah jika database Anda pernah berubah ke mesin yang berbeda, kode Anda akan berfungsi dengan baik. Penspasian nama tabel Anda dapat dicapai dengan memilih beberapa cara standar penamaan tabel Anda, mirip dengan cara Django melakukannya secara default (misalnya appName_className)

Ada dua cara untuk mencapai ini. Perintah postgres untuk melakukannya dengan cara ini adalah:

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

Cara satu-satunya Django untuk melakukannya adalah:

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

Anda juga ingin mengubah:

db_table = 'cedirData\".\"persons'

ke:

db_table = 'persons'

Sebagai bonus, sekarang Anda dapat menggunakan:

manage.py inspectdb > models.py

yang merupakan fitur bagus, sehingga Anda tidak perlu menyalin database yang ada secara manual.

Namun, solusi ini tidak akan membantu Anda, jika penspasian nama skema banyak digunakan pada database Anda dan aplikasi lain bergantung padanya. Pendekatan yang berbeda adalah dengan menulis testrunner khusus untuk membuat skema tersebut di database pengujian Anda. Ini agak lebih terlibat daripada pendekatan di atas, dan bisa agak berantakan. Saya tidak merekomendasikan melakukan ini, tetapi jika Anda tertarik, saya dapat mencoba membantu.

Cara yang tidak terlalu berantakan, tetapi lebih 'retas' adalah dengan mengganti meta saat pengujian dijalankan. Ini juga akan menjadi ujian.

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]

Anda juga ingin mendefinisikan ini sebagai testrunner di file settings.py Anda.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django bulk_create dengan mengabaikan baris yang menyebabkan IntegrityError?

  2. Bagaimana cara membulatkan tipe REAL ke NUMERIC?

  3. fungsi yang berbeda () (tidak memilih kualifikasi) di postgres

  4. Tidak dapat menyebarkan ke Heroku karena server menolak koneksi

  5. Mengganti teks yang cocok dengan regex dengan versi huruf besar di Postgresql