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

djangoモデルで最初に延期されたテーブル制約を延期するにはどうすればよいですか?

    これは、1回の移行で行います。最初にプログラムで一意の制約名を取得し、次に削除して再度追加します(変更すると、一意の制約ではなく、FK制約に対してのみ機能するように見えるため)。これも元に戻す逆移行を追加します。

    from django.db import migrations, connection
    
    
    
    def _make_deferrable(apps, schema_editor):
        """
        Change the unique constraint to be deferrable
        """
        # Get the db name of the constraint
        MyModel = apps.get_model('myapp', 'MyModel')
        CONSTRAINT_NAME = schema_editor._constraint_names(MYModel,
                                                                       ['col1', 'col2'],
                                                                       unique=True)[0]
        TABLE_NAME = MyModel._meta.db_table
    
    
        # Drop then re-add with deferrable as ALTER doesnt seem to work for unique constraints in psql
        with schema_editor.connection.create_cursor() as curs:
            curs.execute(
                f'ALTER TABLE {TABLE_NAME} DROP CONSTRAINT "{CONSTRAINT_NAME}";'
            )
            curs.execute(
                f'ALTER TABLE {TABLE_NAME} ADD CONSTRAINT'
                f' {CONSTRAINT_NAME}'
                f' UNIQUE (col1, col2) DEFERRABLE INITIALLY DEFERRED;'
            )
    
    
    def _unmake_deferrable(apps, schema_editor):
        """
        Reverse the unique constraint to be not deferrable
        """
        # Get the db name of unique constraint
        MyModel = apps.get_model('myapp', 'MyModel')
        CONSTRAINT_NAME = schema_editor._constraint_names(MyModel,
                                                                       ['col1', 'col2'],
                                                                       unique=True)[0]
        TABLE_NAME = MyModel._meta.db_table
    
        with schema_editor.connection.create_cursor() as curs:
            curs.execute(
                f'ALTER TABLE {TABLE_NAME} DROP CONSTRAINT "{CONSTRAINT_NAME}";'
            ) 
            curs.execute(
                f'ALTER TABLE {TABLE_NAME} ADD CONSTRAINT'
                f' {CONSTRAINT_NAME}'
                f' UNIQUE (col1, col2) NOT DEFERRABLE;'
            )
    
    class Migration(migrations.Migration):
    
        dependencies = [
            ('myapp', '<previous_mig>'),
        ]
    
        operations = [
            migrations.RunPython(code=_make_deferrable,  reverse_code=_unmake_deferrable)
        ]
    


    1. UTF-8をエンコードする文字0xc286は、WIN1252に同等のものがありません....iconvpostgresでの変換時に復元がクラッシュします

    2. (IPまたはドメイン名)でMySQLサーバーに接続できません

    3. コマンドプロンプトを使用してmysqlサーバーに接続する方法:エラー

    4. SQLDeveloperを使用したOracleへのXMLインポート