PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

मैं django मॉडल में प्रारंभ में स्थगित तालिका बाधा कैसे सेट कर सकता हूं?

मैं इसे एक प्रवास के माध्यम से करूँगा। पहले प्रोग्रामिक रूप से अद्वितीय बाधा नाम प्राप्त करें, फिर ड्रॉप करें और फिर से जोड़ें (चूंकि इसे बदलने से ऐसा लगता है कि यह केवल एफके बाधाओं के लिए काम करता है, अद्वितीय बाधाएं नहीं)। रिवर्स माइग्रेशन जोड़ें जो इसे भी पूर्ववत कर देता है।

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL पर एक सशर्त अद्वितीय अनुक्रमणिका कैसे जोड़ें

  2. जेपीए में मूल क्वेरी से तर्क के रूप में समग्र प्रकार वाले फ़ंक्शन को कॉल करें

  3. PostgreSQL सर्वर से कनेक्ट करने में असमर्थ:सर्वर से कनेक्ट नहीं हो सका:अनुमति अस्वीकृत

  4. GitLab CI Django और Postgres

  5. स्थानीय और दूरस्थ सर्वर पर उच्च नेटवर्क TTFB समय