PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Kiểm tra đơn vị Django không thành công cho nhiều lược đồ Postgres

Các lược đồ không được sử dụng trong nhiều công cụ DB khác. Bằng cách chỉ định một lược đồ trong các mô hình của mình, bạn đã giới thiệu một phần phụ thuộc trong mã của mình cho các postgres.

Có hai cách bạn có thể thực hiện để giải quyết vấn đề của mình;

Đầu tiên, bạn có thể thêm một đường dẫn tìm kiếm mặc định cho người dùng postgres của mình. Nhược điểm của cách tiếp cận này là các lược đồ không còn có thể được sử dụng cho không gian tên, nhưng ưu điểm là nếu cơ sở dữ liệu của bạn thay đổi sang một công cụ khác, mã của bạn sẽ hoạt động tốt. Việc đặt tên bảng của bạn có thể đạt được bằng cách chọn một số cách đặt tên bảng tiêu chuẩn, tương tự như cách Django thực hiện theo mặc định (ví dụ:appName_className)

Có hai cách để đạt được điều này. Lệnh postgres để thực hiện theo cách này là:

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

Cách duy nhất để làm điều đó sẽ là:

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

Bạn cũng sẽ muốn thay đổi:

db_table = 'cedirData\".\"persons'

tới:

db_table = 'persons'

Như một phần thưởng, bây giờ bạn có thể sử dụng:

manage.py inspectdb > models.py

đó là một tính năng hay, theo cách đó bạn không phải sao chép thủ công cơ sở dữ liệu hiện có của mình.

Tuy nhiên, giải pháp này sẽ không giúp được gì cho bạn, nếu không gian tên lược đồ được sử dụng nhiều trên cơ sở dữ liệu của bạn và các ứng dụng khác dựa vào nó. Một cách tiếp cận khác sẽ là viết một trình chạy thử nghiệm tùy chỉnh để tạo các lược đồ đó trong cơ sở dữ liệu thử nghiệm của bạn. Điều này có phần liên quan hơn so với cách tiếp cận ở trên và có thể hơi lộn xộn. Tôi không thực sự khuyên bạn nên làm điều này, nhưng nếu bạn quan tâm, tôi có thể cố gắng giúp.

Một cách ít lộn xộn hơn, nhưng 'hacky' hơn sẽ đơn giản là ghi đè meta khi các thử nghiệm đang được chạy. Đây cũng sẽ là một trình chạy thử nghiệm.

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]

Bạn cũng sẽ muốn xác định đây là trình chạy thử trong tệp settings.py của mình.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Python psycopg2 copy_from () để tải dữ liệu ném ra lỗi cho các giá trị số nguyên rỗng:DataError:cú pháp đầu vào không hợp lệ cho số nguyên:

  2. Đó có phải là một lỗi của công cụ SQL PostgreSQL và làm thế nào để tránh (giải pháp thay thế) nó?

  3. Làm cách nào để tìm tất cả các hàm do người dùng xác định (không liên quan đến tiện ích mở rộng)?

  4. Cách sử dụng hàm chuỗi con trong PostgreSQL và Redshift

  5. Đặt hàng chuỗi varchar dưới dạng số