sql >> データベース >  >> RDS >> PostgreSQL

Djangoおよびpostgresqlスキーマ

    Djangoはすぐに使用できるPostgresデータベーススキーマをサポートしていないため、これを機能させるには、データベースルーターを使用してください。

    これを試すためのテストデータベースを作成しました。これを再現する方法は次のとおりです。

    psqlを使用してテストデータベースを作成します:

    CREATE USER tester WITH PASSWORD 'lol so easy';
    CREATE DATABASE multi_schema_db WITH OWNER tester;
    CREATE SCHEMA samples AUTHORIZATION tester;
    CREATE TABLE samples.my_samples (
      id          INTEGER   NOT NULL PRIMARY KEY,
      description CHAR(255) NOT NULL
    );
    

    スキーマを別のデータベース接続として設定に追加します。HOSTを追加することを忘れないでください 「ピア認証に失敗しました」エラーを回避するため。

    DATABASES = {
    
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'OPTIONS': {
            'options': '-c search_path=django,public'
        },
        'NAME': 'multi_schema_db',
        'USER': 'tester',
        'PASSWORD': 'lol so easy',
        'HOST': 'localhost'
    
    },
    
    'samples': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'OPTIONS': {
            'options': '-c search_path=samples,public'
        },
        'NAME': 'multi_schema_db',
        'USER': 'tester',
        'PASSWORD': 'lol so easy',
        'HOST': 'localhost'
    },
    

    }

    次に、MySampleを作成します モデル:

    from django.db import models
    
    class MySample(models.Model):
        description = models.CharField(max_length=255, null=False)
    
        class Meta:
            managed = False
            db_table = 'my_samples'
    

    データベースルーターを作成して、サンプル関連のすべてのクエリをサンプルデータベースに送信します。

    from database_test.models import MySample
    
    ROUTED_MODELS = [MySample]
    
    
    class MyDBRouter(object):
    
        def db_for_read(self, model, **hints):
            if model in ROUTED_MODELS:
                return 'samples'
            return None
    
        def db_for_write(self, model, **hints):
            if model in ROUTED_MODELS:
                return 'samples'
            return None
    

    基本的に、ルーターはROUTED_MODELSで指定されたすべてのモデルをデータベース接続のsamplesにルーティングします。 他のすべてのモデルについてはNoneを返します。これにより、それらがdefaultにルーティングされます データベース接続。

    最後に、ルーターをsettings.pyに追加します

    DATABASE_ROUTERS = ('database_test.db_router.MyDBRouter',)
    

    そして今、MySampleのクエリを実行するとき モデルの場合、samplesからデータをフェッチします スキーマ。



    1. ヒンディー語でUnicodeでデータを保存する方法

    2. 関係は存在しません

    3. SQLで列の値を合計する方法は?

    4. 制約を一時的にオフにする(MS SQL)