[{"data":1,"prerenderedAt":10040},["ShallowReactive",2],{"navigation":3,"/migrations/how-migrations-work":1016,"/migrations/how-migrations-work-surround":10035},[4,54,89,123,165,211,253,331,389,439,462,488,514,540,578,624,650,672,702,736,774,800,850,856,862,868,874,928],{"title":5,"path":6,"stem":7,"children":8},"Introduction and Foundations","/introduction-and-foundations","01.introduction-and-foundations/01.index",[9,10,14,18,22,26,30,34,38,42,46,50],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"What is Django","/introduction-and-foundations/what-is-django","01.introduction-and-foundations/02.what-is-django",{"title":15,"path":16,"stem":17},"Key Concepts and Philosophy","/introduction-and-foundations/key-concepts-and-philosophy","01.introduction-and-foundations/03.key-concepts-and-philosophy",{"title":19,"path":20,"stem":21},"MVC vs MVT: Understanding Django's Architecture","/introduction-and-foundations/mvc-vs-mvt","01.introduction-and-foundations/04.mvc-vs-mvt",{"title":23,"path":24,"stem":25},"Project Structure Overview","/introduction-and-foundations/project-structure-overview","01.introduction-and-foundations/05.project-structure-overview",{"title":27,"path":28,"stem":29},"Installing Django","/introduction-and-foundations/installing-django","01.introduction-and-foundations/06.installing-django",{"title":31,"path":32,"stem":33},"Creating Your First Django Project","/introduction-and-foundations/creating-first-project","01.introduction-and-foundations/07.creating-first-project",{"title":35,"path":36,"stem":37},"Creating Your First Django App","/introduction-and-foundations/creating-first-app","01.introduction-and-foundations/08.creating-first-app",{"title":39,"path":40,"stem":41},"Your First Django \"Hello World\"","/introduction-and-foundations/hello-world","01.introduction-and-foundations/09.hello-world",{"title":43,"path":44,"stem":45},"Django Quick Start Guide","/introduction-and-foundations/quick-start-guide","01.introduction-and-foundations/10.quick-start-guide",{"title":47,"path":48,"stem":49},"How Django Handles Requests","/introduction-and-foundations/how-django-handles-requests","01.introduction-and-foundations/11.how-django-handles-requests",{"title":51,"path":52,"stem":53},"Django Settings","/introduction-and-foundations/django-settings","01.introduction-and-foundations/12.django-settings",{"title":55,"path":56,"stem":57,"children":58},"The Development Environment","/development-environment","02.development-environment/1.index",[59,61,65,69,73,77,81,85],{"title":60,"path":56,"stem":57},"Development Environment",{"title":62,"path":63,"stem":64},"Recommended Tooling for Django Development","/development-environment/recommended-tooling","02.development-environment/2.recommended-tooling",{"title":66,"path":67,"stem":68},"Virtual Environments","/development-environment/virtual-environments","02.development-environment/3.virtual-environments",{"title":70,"path":71,"stem":72},"Django Admin and Management Commands","/development-environment/admin-and-management-commands","02.development-environment/4.admin-and-management-commands",{"title":74,"path":75,"stem":76},"Django Project Settings","/development-environment/project-settings","02.development-environment/5.project-settings",{"title":78,"path":79,"stem":80},"Managing Django Environments: Local, Staging, and Production","/development-environment/environments-local-staging-production","02.development-environment/6.environments-local-staging-production",{"title":82,"path":83,"stem":84},"Running Django Development Server","/development-environment/running-development-server","02.development-environment/7.running-development-server",{"title":86,"path":87,"stem":88},"Working with Django Shell","/development-environment/working-with-shell","02.development-environment/8.working-with-shell",{"title":90,"path":91,"stem":92,"children":93},"Templates and Presentation Layer","/templates-and-presentation","03.templates-and-presentation/1.index",[94,95,99,103,107,111,115,119],{"title":90,"path":91,"stem":92},{"title":96,"path":97,"stem":98},"Introduction to Django Templates","/templates-and-presentation/introduction-to-templates","03.templates-and-presentation/2.introduction-to-templates",{"title":100,"path":101,"stem":102},"The Django Template Language","/templates-and-presentation/django-template-language","03.templates-and-presentation/3.django-template-language",{"title":104,"path":105,"stem":106},"Template Inheritance","/templates-and-presentation/template-inheritance","03.templates-and-presentation/4.template-inheritance",{"title":108,"path":109,"stem":110},"Built-in Template Tags and Filters","/templates-and-presentation/built-in-template-tags-and-filters","03.templates-and-presentation/5.built-in-template-tags-and-filters",{"title":112,"path":113,"stem":114},"Including Static Files","/templates-and-presentation/including-static-files","03.templates-and-presentation/6.including-static-files",{"title":116,"path":117,"stem":118},"Working with Media Files","/templates-and-presentation/working-with-media-files","03.templates-and-presentation/7.working-with-media-files",{"title":120,"path":121,"stem":122},"Using Alternative Template Engines","/templates-and-presentation/using-alternative-template-engines","03.templates-and-presentation/8.using-alternative-template-engines",{"title":124,"path":125,"stem":126,"children":127},"URLs and Views","/urls-and-views","04.urls-and-views/01.index",[128,129,133,137,141,145,149,153,157,161],{"title":124,"path":125,"stem":126},{"title":130,"path":131,"stem":132},"The URL Dispatcher","/urls-and-views/the-url-dispatcher","04.urls-and-views/02.the-url-dispatcher",{"title":134,"path":135,"stem":136},"Writing Function-Based Views","/urls-and-views/writing-function-based-views","04.urls-and-views/03.writing-function-based-views",{"title":138,"path":139,"stem":140},"View Decorators","/urls-and-views/view-decorators","04.urls-and-views/04.view-decorators",{"title":142,"path":143,"stem":144},"Rendering Responses","/urls-and-views/rendering-responses","04.urls-and-views/05.rendering-responses",{"title":146,"path":147,"stem":148},"Redirects","/urls-and-views/redirects","04.urls-and-views/06.redirects",{"title":150,"path":151,"stem":152},"Handling HTTP Methods","/urls-and-views/handling-http-methods","04.urls-and-views/07.handling-http-methods",{"title":154,"path":155,"stem":156},"Conditional View Processing","/urls-and-views/conditional-view-processing","04.urls-and-views/08.conditional-view-processing",{"title":158,"path":159,"stem":160},"File Uploads","/urls-and-views/file-uploads","04.urls-and-views/09.file-uploads",{"title":162,"path":163,"stem":164},"Using Django Shortcut Functions","/urls-and-views/using-django-shortcut-functions","04.urls-and-views/10.using-django-shortcut-functions",{"title":166,"path":167,"stem":168,"children":169},"Class Based Views","/class-based-views","05.class-based-views/01.index",[170,171,175,179,183,187,191,195,199,203,207],{"title":166,"path":167,"stem":168},{"title":172,"path":173,"stem":174},"Introduction to Class-Based Views","/class-based-views/introduction-to-class-based-views","05.class-based-views/02.introduction-to-class-based-views",{"title":176,"path":177,"stem":178},"Common Base Classes","/class-based-views/common-base-classes","05.class-based-views/03.common-base-classes",{"title":180,"path":181,"stem":182},"Built-in Generic Views","/class-based-views/built-in-generic-views","05.class-based-views/04.built-in-generic-views",{"title":184,"path":185,"stem":186},"Views for CRUD Operations","/class-based-views/views-for-crud-operations","05.class-based-views/05.views-for-crud-operations",{"title":188,"path":189,"stem":190},"Handling Forms with Class-Based Views","/class-based-views/handling-forms-with-class-based-views","05.class-based-views/06.handling-forms-with-class-based-views",{"title":192,"path":193,"stem":194},"Using Mixins","/class-based-views/using-mixins","05.class-based-views/07.using-mixins",{"title":196,"path":197,"stem":198},"URL Configuration with Class-Based Views","/class-based-views/url-configuration-with-class-based-views","05.class-based-views/08.url-configuration-with-class-based-views",{"title":200,"path":201,"stem":202},"Subclassing Generic Views","/class-based-views/subclassing-generic-views","05.class-based-views/09.subclassing-generic-views",{"title":204,"path":205,"stem":206},"Asynchronous Class-Based Views","/class-based-views/asynchronous-class-based-views","05.class-based-views/10.asynchronous-class-based-views",{"title":208,"path":209,"stem":210},"Pagination","/class-based-views/pagination","05.class-based-views/11.pagination",{"title":212,"path":213,"stem":214,"children":215},"Forms and User Input","/forms-and-user-input","06.forms-and-user-input/01.index",[216,217,221,225,229,233,237,241,245,249],{"title":212,"path":213,"stem":214},{"title":218,"path":219,"stem":220},"Understanding HTML Forms","/forms-and-user-input/understanding-html-forms","06.forms-and-user-input/02.understanding-html-forms",{"title":222,"path":223,"stem":224},"Django's Role in Form Handling","/forms-and-user-input/djangos-role-in-form-handling","06.forms-and-user-input/03.djangos-role-in-form-handling",{"title":226,"path":227,"stem":228},"Creating Forms with Forms API","/forms-and-user-input/creating-forms-with-forms-api","06.forms-and-user-input/04.creating-forms-with-forms-api",{"title":230,"path":231,"stem":232},"Form Validation","/forms-and-user-input/form-validation","06.forms-and-user-input/05.form-validation",{"title":234,"path":235,"stem":236},"Built-in Fields and Widgets","/forms-and-user-input/built-in-fields-and-widgets","06.forms-and-user-input/06.built-in-fields-and-widgets",{"title":238,"path":239,"stem":240},"Form Rendering in Templates","/forms-and-user-input/form-rendering-in-templates","06.forms-and-user-input/07.form-rendering-in-templates",{"title":242,"path":243,"stem":244},"Model Forms","/forms-and-user-input/model-forms","06.forms-and-user-input/08.model-forms",{"title":246,"path":247,"stem":248},"Advanced Form Techniques","/forms-and-user-input/advanced-form-techniques","06.forms-and-user-input/09.advanced-form-techniques",{"title":250,"path":251,"stem":252},"Security Considerations for Forms","/forms-and-user-input/security-considerations-for-forms","06.forms-and-user-input/10.security-considerations-for-forms",{"title":254,"path":255,"stem":256,"children":257},"Models and Databases","/models-and-databases","07.models-and-databases/01.index",[258,259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327],{"title":254,"path":255,"stem":256},{"title":260,"path":261,"stem":262},"Understanding Django Models","/models-and-databases/understanding-django-models","07.models-and-databases/02.understanding-django-models",{"title":264,"path":265,"stem":266},"Defining Fields","/models-and-databases/defining-fields","07.models-and-databases/03.defining-fields",{"title":268,"path":269,"stem":270},"Relationships and Foreign Keys","/models-and-databases/relationships-and-foreign-keys","07.models-and-databases/04.relationships-and-foreign-keys",{"title":272,"path":273,"stem":274},"Examples of Relationship Patterns","/models-and-databases/examples-of-relationship-patterns","07.models-and-databases/05.examples-of-relationship-patterns",{"title":276,"path":277,"stem":278},"Making Queries","/models-and-databases/making-queries","07.models-and-databases/06.making-queries",{"title":280,"path":281,"stem":282},"Filtering, Ordering, and Slicing","/models-and-databases/filtering-ordering-slicing","07.models-and-databases/07.filtering-ordering-slicing",{"title":284,"path":285,"stem":286},"Managers and QuerySets","/models-and-databases/managers-and-querysets","07.models-and-databases/08.managers-and-querysets",{"title":288,"path":289,"stem":290},"Aggregation","/models-and-databases/aggregation","07.models-and-databases/09.aggregation",{"title":292,"path":293,"stem":294},"Search","/models-and-databases/search","07.models-and-databases/10.search",{"title":296,"path":297,"stem":298},"Raw SQL Queries","/models-and-databases/raw-sql-queries","07.models-and-databases/11.raw-sql-queries",{"title":300,"path":301,"stem":302},"Transactions","/models-and-databases/transactions","07.models-and-databases/12.transactions",{"title":304,"path":305,"stem":306},"Multiple Databases","/models-and-databases/multiple-databases","07.models-and-databases/13.multiple-databases",{"title":308,"path":309,"stem":310},"Tablespaces","/models-and-databases/tablespaces","07.models-and-databases/14.tablespaces",{"title":312,"path":313,"stem":314},"Composite Primary Keys","/models-and-databases/composite-primary-keys","07.models-and-databases/15.composite-primary-keys",{"title":316,"path":317,"stem":318},"Database Instrumentation","/models-and-databases/database-instrumentation","07.models-and-databases/16.database-instrumentation",{"title":320,"path":321,"stem":322},"Database Optimization","/models-and-databases/database-optimization","07.models-and-databases/17.database-optimization",{"title":324,"path":325,"stem":326},"Fixtures","/models-and-databases/fixtures","07.models-and-databases/18.fixtures",{"title":328,"path":329,"stem":330},"Signals","/models-and-databases/signals","07.models-and-databases/19.signals",{"title":332,"path":333,"stem":334,"children":335},"Migrations","/migrations","08.migrations/01.index",[336,337,341,345,349,353,357,361,365,369,373,377,381,385],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"How Migrations Work","/migrations/how-migrations-work","08.migrations/02.how-migrations-work",{"title":342,"path":343,"stem":344},"Management Commands","/migrations/management-commands","08.migrations/03.management-commands",{"title":346,"path":347,"stem":348},"Dependencies and Workflow","/migrations/dependencies-and-workflow","08.migrations/04.dependencies-and-workflow",{"title":350,"path":351,"stem":352},"Transaction Handling","/migrations/transaction-handling","08.migrations/05.transaction-handling",{"title":354,"path":355,"stem":356},"Adding Migrations to Apps","/migrations/adding-migrations-to-apps","08.migrations/06.adding-migrations-to-apps",{"title":358,"path":359,"stem":360},"Reversing Migrations","/migrations/reversing-migrations","08.migrations/07.reversing-migrations",{"title":362,"path":363,"stem":364},"Historical Models","/migrations/historical-models","08.migrations/08.historical-models",{"title":366,"path":367,"stem":368},"Considerations When Removing Fields","/migrations/considerations-when-removing-fields","08.migrations/09.considerations-when-removing-fields",{"title":370,"path":371,"stem":372},"Data Migrations","/migrations/data-migrations","08.migrations/10.data-migrations",{"title":374,"path":375,"stem":376},"Squashing Migrations","/migrations/squashing-migrations","08.migrations/11.squashing-migrations",{"title":378,"path":379,"stem":380},"Serializing Values","/migrations/serializing-values","08.migrations/12.serializing-values",{"title":382,"path":383,"stem":384},"Supporting Multiple Django Versions","/migrations/supporting-multiple-django-versions","08.migrations/13.supporting-multiple-django-versions",{"title":386,"path":387,"stem":388},"Django Serialization Framework","/migrations/django-serialization-framework","08.migrations/14.django-serialization-framework",{"title":390,"path":391,"stem":392,"children":393},"Authentication and Authorization","/authentication-and-authorization","09.authentication-and-authorization/01.index",[394,395,399,403,407,411,415,419,423,427,431,435],{"title":390,"path":391,"stem":392},{"title":396,"path":397,"stem":398},"Overview of Django's Authentication System","/authentication-and-authorization/overview-of-django-authentication-system","09.authentication-and-authorization/02.overview-of-django-authentication-system",{"title":400,"path":401,"stem":402},"Users and Groups","/authentication-and-authorization/users-and-groups","09.authentication-and-authorization/03.users-and-groups",{"title":404,"path":405,"stem":406},"Permissions","/authentication-and-authorization/permissions","09.authentication-and-authorization/04.permissions",{"title":408,"path":409,"stem":410},"Password Management","/authentication-and-authorization/password-management","09.authentication-and-authorization/05.password-management",{"title":412,"path":413,"stem":414},"Authentication Views","/authentication-and-authorization/authentication-views","09.authentication-and-authorization/06.authentication-views",{"title":416,"path":417,"stem":418},"Login and Logout","/authentication-and-authorization/login-and-logout","09.authentication-and-authorization/07.login-and-logout",{"title":420,"path":421,"stem":422},"Custom User Models","/authentication-and-authorization/custom-user-models","09.authentication-and-authorization/08.custom-user-models",{"title":424,"path":425,"stem":426},"Middleware for Authentication","/authentication-and-authorization/middleware-for-authentication","09.authentication-and-authorization/09.middleware-for-authentication",{"title":428,"path":429,"stem":430},"Authorization in Views and Templates","/authentication-and-authorization/authorization-in-views-and-templates","09.authentication-and-authorization/10.authorization-in-views-and-templates",{"title":432,"path":433,"stem":434},"Integrating Social Authentication","/authentication-and-authorization/integrating-social-authentication","09.authentication-and-authorization/11.integrating-social-authentication",{"title":436,"path":437,"stem":438},"Security Best Practices","/authentication-and-authorization/security-best-practices","09.authentication-and-authorization/12.security-best-practices",{"title":440,"path":441,"stem":442,"children":443},"Sessions, Cookies, and State","/sessions-cookies-state","10.sessions-cookies-state/01.index",[444,446,450,454,458],{"title":445,"path":441,"stem":442},"Sessions, Cookies, and State Management",{"title":447,"path":448,"stem":449},"Introduction to Sessions","/sessions-cookies-state/introduction-to-sessions","10.sessions-cookies-state/02.introduction-to-sessions",{"title":451,"path":452,"stem":453},"Working with Cookies","/sessions-cookies-state/working-with-cookies","10.sessions-cookies-state/03.working-with-cookies",{"title":455,"path":456,"stem":457},"Server-Side Session Storage Options","/sessions-cookies-state/server-side-session-storage-options","10.sessions-cookies-state/04.server-side-session-storage-options",{"title":459,"path":460,"stem":461},"Session Security","/sessions-cookies-state/session-security","10.sessions-cookies-state/05.session-security",{"title":463,"path":464,"stem":465,"children":466},"Working with Files","/working-with-files","11.working-with-files/01.index",[467,468,472,476,480,484],{"title":463,"path":464,"stem":465},{"title":469,"path":470,"stem":471},"Files in Models","/working-with-files/files-in-models","11.working-with-files/02.files-in-models",{"title":473,"path":474,"stem":475},"The File Object","/working-with-files/the-file-object","11.working-with-files/03.the-file-object",{"title":477,"path":478,"stem":479},"Storage Backends","/working-with-files/storage-backends","11.working-with-files/04.storage-backends",{"title":481,"path":482,"stem":483},"Using Cloud Storage Providers","/working-with-files/using-cloud-storage-providers","11.working-with-files/05.using-cloud-storage-providers",{"title":485,"path":486,"stem":487},"Managing Media in Production","/working-with-files/managing-media-in-production","11.working-with-files/06.managing-media-in-production",{"title":489,"path":490,"stem":491,"children":492},"Admin Site","/admin-site","12.admin-site/01.index",[493,494,498,502,506,510],{"title":489,"path":490,"stem":491},{"title":495,"path":496,"stem":497},"Enabling the Admin","/admin-site/enabling-the-admin","12.admin-site/02.enabling-the-admin",{"title":499,"path":500,"stem":501},"Registering Models","/admin-site/registering-models","12.admin-site/03.registering-models",{"title":503,"path":504,"stem":505},"Customizing Admin Display","/admin-site/customizing-admin-display","12.admin-site/04.customizing-admin-display",{"title":507,"path":508,"stem":509},"Admin Actions","/admin-site/admin-actions","12.admin-site/05.admin-actions",{"title":511,"path":512,"stem":513},"Admin Security Best Practices","/admin-site/admin-security-best-practices","12.admin-site/06.admin-security-best-practices",{"title":515,"path":516,"stem":517,"children":518},"Middleware","/middleware","13.middleware/01.index",[519,520,524,528,532,536],{"title":515,"path":516,"stem":517},{"title":521,"path":522,"stem":523},"Middleware Overview","/middleware/middleware-overview","13.middleware/02.middleware-overview",{"title":525,"path":526,"stem":527},"Built-in Middleware","/middleware/built-in-middleware","13.middleware/03.built-in-middleware",{"title":529,"path":530,"stem":531},"Creating Custom Middleware","/middleware/creating-custom-middleware","13.middleware/04.creating-custom-middleware",{"title":533,"path":534,"stem":535},"Middleware Ordering","/middleware/middleware-ordering","13.middleware/05.middleware-ordering",{"title":537,"path":538,"stem":539},"Performance and Debugging","/middleware/performance-and-debugging","13.middleware/06.performance-and-debugging",{"title":541,"path":542,"stem":543,"children":544},"Security","/security","14.security/01.index",[545,546,550,554,558,562,566,570,574],{"title":541,"path":542,"stem":543},{"title":547,"path":548,"stem":549},"Django Security Philosophy","/security/django-security-philosophy","14.security/02.django-security-philosophy",{"title":551,"path":552,"stem":553},"Cross Site Request Forgery","/security/cross-site-request-forgery","14.security/03.cross-site-request-forgery",{"title":555,"path":556,"stem":557},"Cross Site Scripting","/security/cross-site-scripting","14.security/04.cross-site-scripting",{"title":559,"path":560,"stem":561},"SQL Injection Protection","/security/sql-injection-protection","14.security/05.sql-injection-protection",{"title":563,"path":564,"stem":565},"Clickjacking Protection","/security/clickjacking-protection","14.security/06.clickjacking-protection",{"title":567,"path":568,"stem":569},"HTTPS Setup and HSTS","/security/https-setup-and-hsts","14.security/07.https-setup-and-hsts",{"title":571,"path":572,"stem":573},"Password Storage and Cryptography","/security/password-storage-and-cryptography","14.security/08.password-storage-and-cryptography",{"title":575,"path":576,"stem":577},"Secure Deployment Checklist","/security/secure-deployment-checklist","14.security/09.secure-deployment-checklist",{"title":579,"path":580,"stem":581,"children":582},"Testing","/testing","15.testing/01.index",[583,584,588,592,596,600,604,608,612,616,620],{"title":579,"path":580,"stem":581},{"title":585,"path":586,"stem":587},"Introduction to Django Testing","/testing/introduction-to-django-testing","15.testing/02.introduction-to-django-testing",{"title":589,"path":590,"stem":591},"Writing and Running Tests","/testing/writing-and-running-tests","15.testing/03.writing-and-running-tests",{"title":593,"path":594,"stem":595},"Test Tools","/testing/test-tools","15.testing/04.test-tools",{"title":597,"path":598,"stem":599},"Testing Models","/testing/testing-models","15.testing/05.testing-models",{"title":601,"path":602,"stem":603},"Testing Views","/testing/testing-views","15.testing/06.testing-views",{"title":605,"path":606,"stem":607},"Testing Forms","/testing/testing-forms","15.testing/07.testing-forms",{"title":609,"path":610,"stem":611},"Testing Templates","/testing/testing-templates","15.testing/08.testing-templates",{"title":613,"path":614,"stem":615},"Testing Authentication","/testing/testing-authentication","15.testing/09.testing-authentication",{"title":617,"path":618,"stem":619},"Advanced Testing Topics","/testing/advanced-testing-topics","15.testing/10.advanced-testing-topics",{"title":621,"path":622,"stem":623},"Performance Testing","/testing/performance-testing","15.testing/11.performance-testing",{"title":625,"path":626,"stem":627,"children":628},"Static Assets and Frontend Integration","/static-assets-and-frontend-integration","16.static-assets-and-frontend-integration/01.index",[629,630,634,638,642,646],{"title":625,"path":626,"stem":627},{"title":631,"path":632,"stem":633},"Working with Static Files","/static-assets-and-frontend-integration/working-with-static-files","16.static-assets-and-frontend-integration/02.working-with-static-files",{"title":635,"path":636,"stem":637},"Integrating CSS and JavaScript","/static-assets-and-frontend-integration/integrating-css-and-javascript","16.static-assets-and-frontend-integration/03.integrating-css-and-javascript",{"title":639,"path":640,"stem":641},"Using Build Tools like Vite or Webpack","/static-assets-and-frontend-integration/using-build-tools-like-vite-or-webpack","16.static-assets-and-frontend-integration/04.using-build-tools-like-vite-or-webpack",{"title":643,"path":644,"stem":645},"Using React or Vue with Django","/static-assets-and-frontend-integration/using-react-or-vue-with-django","16.static-assets-and-frontend-integration/05.using-react-or-vue-with-django",{"title":647,"path":648,"stem":649},"Managing CORS","/static-assets-and-frontend-integration/managing-cors","16.static-assets-and-frontend-integration/06.managing-cors",{"title":651,"path":652,"stem":653,"children":654},"Internationalization and Localization","/internationalization-and-localization","17.internationalization-and-localization/01.index",[655,656,660,664,668],{"title":651,"path":652,"stem":653},{"title":657,"path":658,"stem":659},"Enabling Translation","/internationalization-and-localization/enabling-translation","17.internationalization-and-localization/02.enabling-translation",{"title":661,"path":662,"stem":663},"Translating Text in Code and Templates","/internationalization-and-localization/translating-text-in-code-and-templates","17.internationalization-and-localization/03.translating-text-in-code-and-templates",{"title":665,"path":666,"stem":667},"Timezone Support","/internationalization-and-localization/timezone-support","17.internationalization-and-localization/04.timezone-support",{"title":669,"path":670,"stem":671},"Locale Middleware","/internationalization-and-localization/locale-middleware","17.internationalization-and-localization/05.locale-middleware",{"title":673,"path":674,"stem":675,"children":676},"Caching","/caching","18.caching/01.index",[677,678,682,686,690,694,698],{"title":673,"path":674,"stem":675},{"title":679,"path":680,"stem":681},"Introduction to Caching","/caching/introduction-to-caching","18.caching/02.introduction-to-caching",{"title":683,"path":684,"stem":685},"Cache Backends","/caching/cache-backends","18.caching/03.cache-backends",{"title":687,"path":688,"stem":689},"Per View Caching","/caching/per-view-caching","18.caching/04.per-view-caching",{"title":691,"path":692,"stem":693},"Low Level Cache API","/caching/low-level-cache-api","18.caching/05.low-level-cache-api",{"title":695,"path":696,"stem":697},"Template Fragment Caching","/caching/template-fragment-caching","18.caching/06.template-fragment-caching",{"title":699,"path":700,"stem":701},"Deployment Level Caching Patterns","/caching/deployment-level-caching-patterns","18.caching/07.deployment-level-caching-patterns",{"title":703,"path":704,"stem":705,"children":706},"Asynchronous Django","/asynchronous-django","19.asynchronous-django/01.index",[707,708,712,716,720,724,728,732],{"title":703,"path":704,"stem":705},{"title":709,"path":710,"stem":711},"Introduction to ASGI","/asynchronous-django/introduction-to-asgi","19.asynchronous-django/02.introduction-to-asgi",{"title":713,"path":714,"stem":715},"Async Views","/asynchronous-django/async-views","19.asynchronous-django/03.async-views",{"title":717,"path":718,"stem":719},"Async ORM Status","/asynchronous-django/async-orm-status","19.asynchronous-django/04.async-orm-status",{"title":721,"path":722,"stem":723},"WebSockets with Channels","/asynchronous-django/websockets-with-channels","19.asynchronous-django/05.websockets-with-channels",{"title":725,"path":726,"stem":727},"Background Tasks with Celery or RQ","/asynchronous-django/background-tasks-with-celery-or-rq","19.asynchronous-django/06.background-tasks-with-celery-or-rq",{"title":729,"path":730,"stem":731},"Asynchronous Support","/asynchronous-django/asynchronous-support","19.asynchronous-django/07.asynchronous-support",{"title":733,"path":734,"stem":735},"Django's Tasks Framework","/asynchronous-django/django-tasks-framework","19.asynchronous-django/08.django-tasks-framework",{"title":737,"path":738,"stem":739,"children":740},"Deployment","/deployment","20.deployment/01.index",[741,742,746,750,754,758,762,766,770],{"title":737,"path":738,"stem":739},{"title":743,"path":744,"stem":745},"Preparing for Production","/deployment/preparing-for-production","20.deployment/02.preparing-for-production",{"title":747,"path":748,"stem":749},"Using WSGI and ASGI Servers","/deployment/using-wsgi-and-asgi-servers","20.deployment/03.using-wsgi-and-asgi-servers",{"title":751,"path":752,"stem":753},"Deploying on Linux Servers","/deployment/deploying-on-linux-servers","20.deployment/04.deploying-on-linux-servers",{"title":755,"path":756,"stem":757},"Using Docker","/deployment/using-docker","20.deployment/05.using-docker",{"title":759,"path":760,"stem":761},"Cloud Deployment Guides","/deployment/cloud-deployment-guides","20.deployment/06.cloud-deployment-guides",{"title":763,"path":764,"stem":765},"Scaling and Load Balancing","/deployment/scaling-and-load-balancing","20.deployment/07.scaling-and-load-balancing",{"title":767,"path":768,"stem":769},"Monitoring and Logging","/deployment/monitoring-and-logging","20.deployment/08.monitoring-and-logging",{"title":771,"path":772,"stem":773},"Backup Strategies","/deployment/backup-strategies","20.deployment/09.backup-strategies",{"title":775,"path":776,"stem":777,"children":778},"Performance and Optimization","/performance-and-optimization","21.performance-and-optimization/01.index",[779,780,784,788,792,796],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783},"Query Optimization","/performance-and-optimization/query-optimization","21.performance-and-optimization/02.query-optimization",{"title":785,"path":786,"stem":787},"Template Rendering Optimization","/performance-and-optimization/template-rendering-optimization","21.performance-and-optimization/03.template-rendering-optimization",{"title":789,"path":790,"stem":791},"Using Select Related and Prefetch Related","/performance-and-optimization/using-select-related-and-prefetch-related","21.performance-and-optimization/04.using-select-related-and-prefetch-related",{"title":793,"path":794,"stem":795},"Caching Strategies","/performance-and-optimization/caching-strategies","21.performance-and-optimization/05.caching-strategies",{"title":797,"path":798,"stem":799},"Profiling Django Apps","/performance-and-optimization/profiling-django-apps","21.performance-and-optimization/06.profiling-django-apps",{"title":801,"path":802,"stem":803,"children":804},"Advanced and Expert Topics","/advanced-and-expert-topics","22.advanced-and-expert-topics/01.index",[805,806,810,814,818,822,826,830,834,838,842,846],{"title":801,"path":802,"stem":803},{"title":807,"path":808,"stem":809},"System Architecture Patterns","/advanced-and-expert-topics/system-architecture-patterns","22.advanced-and-expert-topics/02.system-architecture-patterns",{"title":811,"path":812,"stem":813},"Domain Driven Design with Django","/advanced-and-expert-topics/domain-driven-design-with-django","22.advanced-and-expert-topics/03.domain-driven-design-with-django",{"title":815,"path":816,"stem":817},"Building Large Scale Django Projects","/advanced-and-expert-topics/building-large-scale-django-projects","22.advanced-and-expert-topics/04.building-large-scale-django-projects",{"title":819,"path":820,"stem":821},"Plugin Architectures for Django Apps","/advanced-and-expert-topics/plugin-architectures-for-django-apps","22.advanced-and-expert-topics/05.plugin-architectures-for-django-apps",{"title":823,"path":824,"stem":825},"Extending Django's Core","/advanced-and-expert-topics/extending-djangos-core","22.advanced-and-expert-topics/06.extending-djangos-core",{"title":827,"path":828,"stem":829},"Custom ORM Expressions","/advanced-and-expert-topics/custom-orm-expressions","22.advanced-and-expert-topics/07.custom-orm-expressions",{"title":831,"path":832,"stem":833},"Custom Management Commands","/advanced-and-expert-topics/custom-management-commands","22.advanced-and-expert-topics/08.custom-management-commands",{"title":835,"path":836,"stem":837},"Working with Signals","/advanced-and-expert-topics/working-with-signals","22.advanced-and-expert-topics/09.working-with-signals",{"title":839,"path":840,"stem":841},"Building Reusable Django Packages","/advanced-and-expert-topics/building-reusable-django-packages","22.advanced-and-expert-topics/10.building-reusable-django-packages",{"title":843,"path":844,"stem":845},"Integrating Microservices","/advanced-and-expert-topics/integrating-microservices","22.advanced-and-expert-topics/11.integrating-microservices",{"title":847,"path":848,"stem":849},"Advanced Security Hardening","/advanced-and-expert-topics/advanced-security-hardening","22.advanced-and-expert-topics/12.advanced-security-hardening",{"title":851,"path":852,"stem":853,"children":854},"Logging in Django","/logging-in-django","23.logging-in-django/01.index",[855],{"title":851,"path":852,"stem":853},{"title":857,"path":858,"stem":859,"children":860},"FAQ and Troubleshooting","/faq-and-troubleshooting","24.faq-and-troubleshooting/01.index",[861],{"title":857,"path":858,"stem":859},{"title":863,"path":864,"stem":865,"children":866},"External Packages and Ecosystem","/external-packages-and-ecosystem","25.external-packages-and-ecosystem/01.index",[867],{"title":863,"path":864,"stem":865},{"title":869,"path":870,"stem":871,"children":872},"Django Internals and Contributing","/django-internals-and-contributing","26.django-internals-and-contributing/01.index",[873],{"title":869,"path":870,"stem":871},{"title":875,"path":876,"stem":877,"children":878},"Microservices with Django","/microservices-with-django","27.microservices-with-django/01.index",[879,880,884,888,892,896,900,904,908,912,916,920,924],{"title":875,"path":876,"stem":877},{"title":881,"path":882,"stem":883},"What Is a Microservice?","/microservices-with-django/what-is-a-microservice","27.microservices-with-django/02.what-is-a-microservice",{"title":885,"path":886,"stem":887},"Introducing the Django Microservices Architecture","/microservices-with-django/django-microservices-architecture","27.microservices-with-django/03.django-microservices-architecture",{"title":889,"path":890,"stem":891},"Setting Up the Development and Runtime Environment","/microservices-with-django/development-environment","27.microservices-with-django/04.development-environment",{"title":893,"path":894,"stem":895},"Cloud-native Data Processing with MongoDB","/microservices-with-django/cloud-native-data-processing","27.microservices-with-django/05.cloud-native-data-processing",{"title":897,"path":898,"stem":899},"Creating RESTful APIs for Microservices","/microservices-with-django/restful-apis","27.microservices-with-django/06.restful-apis",{"title":901,"path":902,"stem":903},"Orchestrating Microservices with Celery and RabbitMQ","/microservices-with-django/orchestrating-celery-rabbitmq","27.microservices-with-django/07.orchestrating-celery-rabbitmq",{"title":905,"path":906,"stem":907},"Testing Microservices","/microservices-with-django/testing-microservices","27.microservices-with-django/08.testing-microservices",{"title":909,"path":910,"stem":911},"Deploying Microservices","/microservices-with-django/deploying-microservices","27.microservices-with-django/09.deploying-microservices",{"title":913,"path":914,"stem":915},"Securing Microservices","/microservices-with-django/securing-microservices","27.microservices-with-django/10.securing-microservices",{"title":917,"path":918,"stem":919},"Improving Microservices Performance with Caching","/microservices-with-django/performance-caching","27.microservices-with-django/11.performance-caching",{"title":921,"path":922,"stem":923},"Best Practices","/microservices-with-django/best-practices","27.microservices-with-django/12.best-practices",{"title":925,"path":926,"stem":927},"Transforming a Monolithic Web App into a Microservice version","/microservices-with-django/monolith-to-microservices","27.microservices-with-django/13.monolith-to-microservices",{"title":929,"path":930,"stem":931,"children":932},"Releases","/releases","releases",[933,936,940,944,948,952,956,960,964,968,972,976,980,984,988,992,996,1000,1004,1008,1012],{"title":934,"path":930,"stem":935},"Django Releases","releases/index",{"title":937,"path":938,"stem":939},"Django 5.1.10 release notes","/releases/5.1.10","releases/5.1.10",{"title":941,"path":942,"stem":943},"Django 5.1.11 release notes","/releases/5.1.11","releases/5.1.11",{"title":945,"path":946,"stem":947},"Django 5.1.12 release notes","/releases/5.1.12","releases/5.1.12",{"title":949,"path":950,"stem":951},"Django 5.1.13 release notes","/releases/5.1.13","releases/5.1.13",{"title":953,"path":954,"stem":955},"Django 5.1.14 release notes","/releases/5.1.14","releases/5.1.14",{"title":957,"path":958,"stem":959},"Django 5.1.15 release notes","/releases/5.1.15","releases/5.1.15",{"title":961,"path":962,"stem":963},"Django 5.2 release notes","/releases/5.2","releases/5.2",{"title":965,"path":966,"stem":967},"Django 5.2.1 release notes","/releases/5.2.1","releases/5.2.1",{"title":969,"path":970,"stem":971},"Django 5.2.10 release notes","/releases/5.2.10","releases/5.2.10",{"title":973,"path":974,"stem":975},"Django 5.2.2 release notes","/releases/5.2.2","releases/5.2.2",{"title":977,"path":978,"stem":979},"Django 5.2.3 release notes","/releases/5.2.3","releases/5.2.3",{"title":981,"path":982,"stem":983},"Django 5.2.4 release notes","/releases/5.2.4","releases/5.2.4",{"title":985,"path":986,"stem":987},"Django 5.2.5 release notes","/releases/5.2.5","releases/5.2.5",{"title":989,"path":990,"stem":991},"Django 5.2.6 release notes","/releases/5.2.6","releases/5.2.6",{"title":993,"path":994,"stem":995},"Django 5.2.7 release notes","/releases/5.2.7","releases/5.2.7",{"title":997,"path":998,"stem":999},"Django 5.2.8 release notes","/releases/5.2.8","releases/5.2.8",{"title":1001,"path":1002,"stem":1003},"Django 5.2.9 release notes","/releases/5.2.9","releases/5.2.9",{"title":1005,"path":1006,"stem":1007},"Django 6.0 release notes","/releases/6.0","releases/6.0",{"title":1009,"path":1010,"stem":1011},"Django 6.0.1 release notes","/releases/6.0.1","releases/6.0.1",{"title":1013,"path":1014,"stem":1015},"Django 6.1 release notes - UNDER DEVELOPMENT","/releases/6.1","releases/6.1",{"id":1017,"title":338,"body":1018,"description":1028,"extension":10030,"links":10031,"meta":10032,"navigation":1069,"path":339,"seo":10033,"stem":340,"__hash__":10034},"docs/08.migrations/02.how-migrations-work.md",{"type":1019,"value":1020,"toc":10021},"minimark",[1021,1025,1029,1034,1039,2467,2471,5638,5642,5646,10014,10017],[1022,1023,338],"h1",{"id":1024},"how-migrations-work",[1026,1027,1028],"p",{},"Understanding the internal mechanics of Django migrations helps you write better migrations, debug issues, and optimize database schema changes. This deep dive explores how Django tracks, generates, and applies migrations.",[1030,1031,1033],"h2",{"id":1032},"migration-system-architecture","Migration System Architecture",[1035,1036,1038],"h3",{"id":1037},"migration-state-tracking","Migration State Tracking",[1040,1041,1046],"pre",{"className":1042,"code":1043,"language":1044,"meta":1045,"style":1045},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Django tracks migration state using the django_migrations table\n# This table stores which migrations have been applied\n\n# Database schema for django_migrations table:\n\"\"\"\nCREATE TABLE django_migrations (\n    id INTEGER PRIMARY KEY,\n    app VARCHAR(255) NOT NULL,\n    name VARCHAR(255) NOT NULL,\n    applied DATETIME NOT NULL\n);\n\"\"\"\n\n# Example entries in django_migrations table:\n\"\"\"\n| id | app  | name                    | applied             |\n|----|------|-------------------------|---------------------|\n| 1  | auth | 0001_initial           | 2023-01-01 10:00:00 |\n| 2  | blog | 0001_initial           | 2023-01-01 10:01:00 |\n| 3  | blog | 0002_post_author       | 2023-01-02 14:30:00 |\n\"\"\"\n\nfrom django.db.migrations.recorder import MigrationRecorder\n\nclass MigrationStateManager:\n    \"\"\"Understand how Django tracks migration state\"\"\"\n    \n    @staticmethod\n    def get_applied_migrations():\n        \"\"\"Get all applied migrations\"\"\"\n        recorder = MigrationRecorder(connection)\n        return recorder.applied_migrations()\n    \n    @staticmethod\n    def check_migration_status(app_label, migration_name):\n        \"\"\"Check if a specific migration has been applied\"\"\"\n        recorder = MigrationRecorder(connection)\n        return (app_label, migration_name) in recorder.applied_migrations()\n    \n    @staticmethod\n    def get_migration_history():\n        \"\"\"Get complete migration history\"\"\"\n        from django.db.migrations.executor import MigrationExecutor\n        \n        executor = MigrationExecutor(connection)\n        \n        # Get migration graph\n        graph = executor.loader.graph\n        \n        # Get all migrations\n        all_migrations = []\n        for app_label in graph.nodes:\n            for migration_name in graph.nodes[app_label]:\n                migration = graph.nodes[app_label][migration_name]\n                all_migrations.append({\n                    'app': app_label,\n                    'name': migration_name,\n                    'applied': (app_label, migration_name) in executor.loader.applied_migrations,\n                    'dependencies': migration.dependencies,\n                })\n        \n        return all_migrations\n\n# Migration loader and graph\nclass MigrationGraphExplorer:\n    \"\"\"Explore the migration dependency graph\"\"\"\n    \n    def __init__(self):\n        from django.db.migrations.loader import MigrationLoader\n        self.loader = MigrationLoader(connection)\n        self.graph = self.loader.graph\n    \n    def get_migration_plan(self, targets):\n        \"\"\"Get the plan to reach target migrations\"\"\"\n        from django.db.migrations.executor import MigrationExecutor\n        \n        executor = MigrationExecutor(connection)\n        plan = executor.migration_plan(targets)\n        \n        return [\n            {\n                'migration': f\"{migration.app_label}.{migration.name}\",\n                'backwards': backwards,\n                'dependencies': migration.dependencies,\n            }\n            for migration, backwards in plan\n        ]\n    \n    def find_migration_conflicts(self):\n        \"\"\"Find conflicting migrations\"\"\"\n        conflicts = {}\n        \n        for app_label in self.graph.nodes:\n            app_conflicts = []\n            \n            # Check for multiple leaf nodes (potential conflicts)\n            leaves = self.graph.leaf_nodes(app_label)\n            if len(leaves) > 1:\n                app_conflicts.extend(leaves)\n            \n            if app_conflicts:\n                conflicts[app_label] = app_conflicts\n        \n        return conflicts\n    \n    def get_unapplied_migrations(self):\n        \"\"\"Get all unapplied migrations\"\"\"\n        unapplied = []\n        \n        for app_label in self.graph.nodes:\n            for migration_name in self.graph.nodes[app_label]:\n                if (app_label, migration_name) not in self.loader.applied_migrations:\n                    unapplied.append((app_label, migration_name))\n        \n        return unapplied\n","python","",[1047,1048,1049,1058,1064,1071,1077,1084,1091,1097,1103,1109,1115,1121,1126,1131,1137,1142,1148,1154,1160,1166,1172,1177,1182,1216,1221,1235,1246,1252,1262,1275,1286,1308,1325,1330,1337,1360,1370,1385,1414,1419,1426,1436,1446,1472,1478,1495,1500,1506,1528,1533,1539,1550,1572,1597,1624,1638,1661,1677,1713,1734,1740,1745,1753,1758,1764,1774,1784,1789,1806,1831,1854,1877,1882,1901,1911,1934,1939,1954,1976,1981,1989,1995,2043,2060,2079,2085,2102,2108,2113,2127,2137,2148,2153,2174,2184,2190,2196,2221,2246,2263,2268,2278,2296,2301,2309,2314,2328,2338,2348,2353,2374,2399,2432,2454,2459],"code",{"__ignoreMap":1045},[1050,1051,1054],"span",{"class":1052,"line":1053},"line",1,[1050,1055,1057],{"class":1056},"s9Tkl","# Django tracks migration state using the django_migrations table\n",[1050,1059,1061],{"class":1052,"line":1060},2,[1050,1062,1063],{"class":1056},"# This table stores which migrations have been applied\n",[1050,1065,1067],{"class":1052,"line":1066},3,[1050,1068,1070],{"emptyLinePlaceholder":1069},true,"\n",[1050,1072,1074],{"class":1052,"line":1073},4,[1050,1075,1076],{"class":1056},"# Database schema for django_migrations table:\n",[1050,1078,1080],{"class":1052,"line":1079},5,[1050,1081,1083],{"class":1082},"sm7ve","\"\"\"\n",[1050,1085,1087],{"class":1052,"line":1086},6,[1050,1088,1090],{"class":1089},"sVyVU","CREATE TABLE django_migrations (\n",[1050,1092,1094],{"class":1052,"line":1093},7,[1050,1095,1096],{"class":1089},"    id INTEGER PRIMARY KEY,\n",[1050,1098,1100],{"class":1052,"line":1099},8,[1050,1101,1102],{"class":1089},"    app VARCHAR(255) NOT NULL,\n",[1050,1104,1106],{"class":1052,"line":1105},9,[1050,1107,1108],{"class":1089},"    name VARCHAR(255) NOT NULL,\n",[1050,1110,1112],{"class":1052,"line":1111},10,[1050,1113,1114],{"class":1089},"    applied DATETIME NOT NULL\n",[1050,1116,1118],{"class":1052,"line":1117},11,[1050,1119,1120],{"class":1089},");\n",[1050,1122,1124],{"class":1052,"line":1123},12,[1050,1125,1083],{"class":1082},[1050,1127,1129],{"class":1052,"line":1128},13,[1050,1130,1070],{"emptyLinePlaceholder":1069},[1050,1132,1134],{"class":1052,"line":1133},14,[1050,1135,1136],{"class":1056},"# Example entries in django_migrations table:\n",[1050,1138,1140],{"class":1052,"line":1139},15,[1050,1141,1083],{"class":1082},[1050,1143,1145],{"class":1052,"line":1144},16,[1050,1146,1147],{"class":1089},"| id | app  | name                    | applied             |\n",[1050,1149,1151],{"class":1052,"line":1150},17,[1050,1152,1153],{"class":1089},"|----|------|-------------------------|---------------------|\n",[1050,1155,1157],{"class":1052,"line":1156},18,[1050,1158,1159],{"class":1089},"| 1  | auth | 0001_initial           | 2023-01-01 10:00:00 |\n",[1050,1161,1163],{"class":1052,"line":1162},19,[1050,1164,1165],{"class":1089},"| 2  | blog | 0001_initial           | 2023-01-01 10:01:00 |\n",[1050,1167,1169],{"class":1052,"line":1168},20,[1050,1170,1171],{"class":1089},"| 3  | blog | 0002_post_author       | 2023-01-02 14:30:00 |\n",[1050,1173,1175],{"class":1052,"line":1174},21,[1050,1176,1083],{"class":1082},[1050,1178,1180],{"class":1052,"line":1179},22,[1050,1181,1070],{"emptyLinePlaceholder":1069},[1050,1183,1185,1189,1193,1197,1200,1202,1205,1207,1210,1213],{"class":1052,"line":1184},23,[1050,1186,1188],{"class":1187},"siDh9","from",[1050,1190,1192],{"class":1191},"sftqT"," django",[1050,1194,1196],{"class":1195},"soVBu",".",[1050,1198,1199],{"class":1191},"db",[1050,1201,1196],{"class":1195},[1050,1203,1204],{"class":1191},"migrations",[1050,1206,1196],{"class":1195},[1050,1208,1209],{"class":1191},"recorder ",[1050,1211,1212],{"class":1187},"import",[1050,1214,1215],{"class":1191}," MigrationRecorder\n",[1050,1217,1219],{"class":1052,"line":1218},24,[1050,1220,1070],{"emptyLinePlaceholder":1069},[1050,1222,1224,1228,1232],{"class":1052,"line":1223},25,[1050,1225,1227],{"class":1226},"s5Kfy","class",[1050,1229,1231],{"class":1230},"sD-vU"," MigrationStateManager",[1050,1233,1234],{"class":1195},":\n",[1050,1236,1238,1241,1244],{"class":1052,"line":1237},26,[1050,1239,1240],{"class":1082},"    \"\"\"",[1050,1242,1243],{"class":1089},"Understand how Django tracks migration state",[1050,1245,1083],{"class":1082},[1050,1247,1249],{"class":1052,"line":1248},27,[1050,1250,1251],{"class":1191},"    \n",[1050,1253,1255,1258],{"class":1052,"line":1254},28,[1050,1256,1257],{"class":1195},"    @",[1050,1259,1261],{"class":1260},"sa2tF","staticmethod\n",[1050,1263,1265,1268,1272],{"class":1052,"line":1264},29,[1050,1266,1267],{"class":1226},"    def",[1050,1269,1271],{"class":1270},"sljsM"," get_applied_migrations",[1050,1273,1274],{"class":1195},"():\n",[1050,1276,1278,1281,1284],{"class":1052,"line":1277},30,[1050,1279,1280],{"class":1082},"        \"\"\"",[1050,1282,1283],{"class":1089},"Get all applied migrations",[1050,1285,1083],{"class":1082},[1050,1287,1289,1292,1295,1299,1302,1305],{"class":1052,"line":1288},31,[1050,1290,1291],{"class":1191},"        recorder ",[1050,1293,1294],{"class":1195},"=",[1050,1296,1298],{"class":1297},"siWMO"," MigrationRecorder",[1050,1300,1301],{"class":1195},"(",[1050,1303,1304],{"class":1297},"connection",[1050,1306,1307],{"class":1195},")\n",[1050,1309,1311,1314,1317,1319,1322],{"class":1052,"line":1310},32,[1050,1312,1313],{"class":1187},"        return",[1050,1315,1316],{"class":1191}," recorder",[1050,1318,1196],{"class":1195},[1050,1320,1321],{"class":1297},"applied_migrations",[1050,1323,1324],{"class":1195},"()\n",[1050,1326,1328],{"class":1052,"line":1327},33,[1050,1329,1251],{"class":1191},[1050,1331,1333,1335],{"class":1052,"line":1332},34,[1050,1334,1257],{"class":1195},[1050,1336,1261],{"class":1260},[1050,1338,1340,1342,1345,1347,1351,1354,1357],{"class":1052,"line":1339},35,[1050,1341,1267],{"class":1226},[1050,1343,1344],{"class":1270}," check_migration_status",[1050,1346,1301],{"class":1195},[1050,1348,1350],{"class":1349},"sCyAa","app_label",[1050,1352,1353],{"class":1195},",",[1050,1355,1356],{"class":1349}," migration_name",[1050,1358,1359],{"class":1195},"):\n",[1050,1361,1363,1365,1368],{"class":1052,"line":1362},36,[1050,1364,1280],{"class":1082},[1050,1366,1367],{"class":1089},"Check if a specific migration has been applied",[1050,1369,1083],{"class":1082},[1050,1371,1373,1375,1377,1379,1381,1383],{"class":1052,"line":1372},37,[1050,1374,1291],{"class":1191},[1050,1376,1294],{"class":1195},[1050,1378,1298],{"class":1297},[1050,1380,1301],{"class":1195},[1050,1382,1304],{"class":1297},[1050,1384,1307],{"class":1195},[1050,1386,1388,1390,1393,1395,1397,1399,1402,1406,1408,1410,1412],{"class":1052,"line":1387},38,[1050,1389,1313],{"class":1187},[1050,1391,1392],{"class":1195}," (",[1050,1394,1350],{"class":1191},[1050,1396,1353],{"class":1195},[1050,1398,1356],{"class":1191},[1050,1400,1401],{"class":1195},")",[1050,1403,1405],{"class":1404},"sVsLi"," in",[1050,1407,1316],{"class":1191},[1050,1409,1196],{"class":1195},[1050,1411,1321],{"class":1297},[1050,1413,1324],{"class":1195},[1050,1415,1417],{"class":1052,"line":1416},39,[1050,1418,1251],{"class":1191},[1050,1420,1422,1424],{"class":1052,"line":1421},40,[1050,1423,1257],{"class":1195},[1050,1425,1261],{"class":1260},[1050,1427,1429,1431,1434],{"class":1052,"line":1428},41,[1050,1430,1267],{"class":1226},[1050,1432,1433],{"class":1270}," get_migration_history",[1050,1435,1274],{"class":1195},[1050,1437,1439,1441,1444],{"class":1052,"line":1438},42,[1050,1440,1280],{"class":1082},[1050,1442,1443],{"class":1089},"Get complete migration history",[1050,1445,1083],{"class":1082},[1050,1447,1449,1452,1454,1456,1458,1460,1462,1464,1467,1469],{"class":1052,"line":1448},43,[1050,1450,1451],{"class":1187},"        from",[1050,1453,1192],{"class":1191},[1050,1455,1196],{"class":1195},[1050,1457,1199],{"class":1191},[1050,1459,1196],{"class":1195},[1050,1461,1204],{"class":1191},[1050,1463,1196],{"class":1195},[1050,1465,1466],{"class":1191},"executor ",[1050,1468,1212],{"class":1187},[1050,1470,1471],{"class":1191}," MigrationExecutor\n",[1050,1473,1475],{"class":1052,"line":1474},44,[1050,1476,1477],{"class":1191},"        \n",[1050,1479,1481,1484,1486,1489,1491,1493],{"class":1052,"line":1480},45,[1050,1482,1483],{"class":1191},"        executor ",[1050,1485,1294],{"class":1195},[1050,1487,1488],{"class":1297}," MigrationExecutor",[1050,1490,1301],{"class":1195},[1050,1492,1304],{"class":1297},[1050,1494,1307],{"class":1195},[1050,1496,1498],{"class":1052,"line":1497},46,[1050,1499,1477],{"class":1191},[1050,1501,1503],{"class":1052,"line":1502},47,[1050,1504,1505],{"class":1056},"        # Get migration graph\n",[1050,1507,1509,1512,1514,1517,1519,1523,1525],{"class":1052,"line":1508},48,[1050,1510,1511],{"class":1191},"        graph ",[1050,1513,1294],{"class":1195},[1050,1515,1516],{"class":1191}," executor",[1050,1518,1196],{"class":1195},[1050,1520,1522],{"class":1521},"sBPpx","loader",[1050,1524,1196],{"class":1195},[1050,1526,1527],{"class":1521},"graph\n",[1050,1529,1531],{"class":1052,"line":1530},49,[1050,1532,1477],{"class":1191},[1050,1534,1536],{"class":1052,"line":1535},50,[1050,1537,1538],{"class":1056},"        # Get all migrations\n",[1050,1540,1542,1545,1547],{"class":1052,"line":1541},51,[1050,1543,1544],{"class":1191},"        all_migrations ",[1050,1546,1294],{"class":1195},[1050,1548,1549],{"class":1195}," []\n",[1050,1551,1553,1556,1559,1562,1565,1567,1570],{"class":1052,"line":1552},52,[1050,1554,1555],{"class":1187},"        for",[1050,1557,1558],{"class":1191}," app_label ",[1050,1560,1561],{"class":1187},"in",[1050,1563,1564],{"class":1191}," graph",[1050,1566,1196],{"class":1195},[1050,1568,1569],{"class":1521},"nodes",[1050,1571,1234],{"class":1195},[1050,1573,1575,1578,1581,1583,1585,1587,1589,1592,1594],{"class":1052,"line":1574},53,[1050,1576,1577],{"class":1187},"            for",[1050,1579,1580],{"class":1191}," migration_name ",[1050,1582,1561],{"class":1187},[1050,1584,1564],{"class":1191},[1050,1586,1196],{"class":1195},[1050,1588,1569],{"class":1521},[1050,1590,1591],{"class":1195},"[",[1050,1593,1350],{"class":1521},[1050,1595,1596],{"class":1195},"]:\n",[1050,1598,1600,1603,1605,1607,1609,1611,1613,1615,1618,1621],{"class":1052,"line":1599},54,[1050,1601,1602],{"class":1191},"                migration ",[1050,1604,1294],{"class":1195},[1050,1606,1564],{"class":1191},[1050,1608,1196],{"class":1195},[1050,1610,1569],{"class":1521},[1050,1612,1591],{"class":1195},[1050,1614,1350],{"class":1521},[1050,1616,1617],{"class":1195},"][",[1050,1619,1620],{"class":1191},"migration_name",[1050,1622,1623],{"class":1195},"]\n",[1050,1625,1627,1630,1632,1635],{"class":1052,"line":1626},55,[1050,1628,1629],{"class":1191},"                all_migrations",[1050,1631,1196],{"class":1195},[1050,1633,1634],{"class":1297},"append",[1050,1636,1637],{"class":1195},"({\n",[1050,1639,1641,1645,1649,1652,1655,1658],{"class":1052,"line":1640},56,[1050,1642,1644],{"class":1643},"sbYkP","                    '",[1050,1646,1648],{"class":1647},"sTbE_","app",[1050,1650,1651],{"class":1643},"'",[1050,1653,1654],{"class":1195},":",[1050,1656,1657],{"class":1297}," app_label",[1050,1659,1660],{"class":1195},",\n",[1050,1662,1664,1666,1669,1671,1673,1675],{"class":1052,"line":1663},57,[1050,1665,1644],{"class":1643},[1050,1667,1668],{"class":1647},"name",[1050,1670,1651],{"class":1643},[1050,1672,1654],{"class":1195},[1050,1674,1356],{"class":1297},[1050,1676,1660],{"class":1195},[1050,1678,1680,1682,1685,1687,1689,1691,1693,1695,1697,1699,1701,1703,1705,1707,1709,1711],{"class":1052,"line":1679},58,[1050,1681,1644],{"class":1643},[1050,1683,1684],{"class":1647},"applied",[1050,1686,1651],{"class":1643},[1050,1688,1654],{"class":1195},[1050,1690,1392],{"class":1195},[1050,1692,1350],{"class":1297},[1050,1694,1353],{"class":1195},[1050,1696,1356],{"class":1297},[1050,1698,1401],{"class":1195},[1050,1700,1405],{"class":1404},[1050,1702,1516],{"class":1297},[1050,1704,1196],{"class":1195},[1050,1706,1522],{"class":1521},[1050,1708,1196],{"class":1195},[1050,1710,1321],{"class":1521},[1050,1712,1660],{"class":1195},[1050,1714,1716,1718,1721,1723,1725,1728,1730,1732],{"class":1052,"line":1715},59,[1050,1717,1644],{"class":1643},[1050,1719,1720],{"class":1647},"dependencies",[1050,1722,1651],{"class":1643},[1050,1724,1654],{"class":1195},[1050,1726,1727],{"class":1297}," migration",[1050,1729,1196],{"class":1195},[1050,1731,1720],{"class":1521},[1050,1733,1660],{"class":1195},[1050,1735,1737],{"class":1052,"line":1736},60,[1050,1738,1739],{"class":1195},"                })\n",[1050,1741,1743],{"class":1052,"line":1742},61,[1050,1744,1477],{"class":1191},[1050,1746,1748,1750],{"class":1052,"line":1747},62,[1050,1749,1313],{"class":1187},[1050,1751,1752],{"class":1191}," all_migrations\n",[1050,1754,1756],{"class":1052,"line":1755},63,[1050,1757,1070],{"emptyLinePlaceholder":1069},[1050,1759,1761],{"class":1052,"line":1760},64,[1050,1762,1763],{"class":1056},"# Migration loader and graph\n",[1050,1765,1767,1769,1772],{"class":1052,"line":1766},65,[1050,1768,1227],{"class":1226},[1050,1770,1771],{"class":1230}," MigrationGraphExplorer",[1050,1773,1234],{"class":1195},[1050,1775,1777,1779,1782],{"class":1052,"line":1776},66,[1050,1778,1240],{"class":1082},[1050,1780,1781],{"class":1089},"Explore the migration dependency graph",[1050,1783,1083],{"class":1082},[1050,1785,1787],{"class":1052,"line":1786},67,[1050,1788,1251],{"class":1191},[1050,1790,1792,1794,1798,1800,1804],{"class":1052,"line":1791},68,[1050,1793,1267],{"class":1226},[1050,1795,1797],{"class":1796},"sJdAF"," __init__",[1050,1799,1301],{"class":1195},[1050,1801,1803],{"class":1802},"sRjD_","self",[1050,1805,1359],{"class":1195},[1050,1807,1809,1811,1813,1815,1817,1819,1821,1823,1826,1828],{"class":1052,"line":1808},69,[1050,1810,1451],{"class":1187},[1050,1812,1192],{"class":1191},[1050,1814,1196],{"class":1195},[1050,1816,1199],{"class":1191},[1050,1818,1196],{"class":1195},[1050,1820,1204],{"class":1191},[1050,1822,1196],{"class":1195},[1050,1824,1825],{"class":1191},"loader ",[1050,1827,1212],{"class":1187},[1050,1829,1830],{"class":1191}," MigrationLoader\n",[1050,1832,1834,1838,1840,1842,1845,1848,1850,1852],{"class":1052,"line":1833},70,[1050,1835,1837],{"class":1836},"se3Ec","        self",[1050,1839,1196],{"class":1195},[1050,1841,1522],{"class":1521},[1050,1843,1844],{"class":1195}," =",[1050,1846,1847],{"class":1297}," MigrationLoader",[1050,1849,1301],{"class":1195},[1050,1851,1304],{"class":1297},[1050,1853,1307],{"class":1195},[1050,1855,1857,1859,1861,1864,1866,1869,1871,1873,1875],{"class":1052,"line":1856},71,[1050,1858,1837],{"class":1836},[1050,1860,1196],{"class":1195},[1050,1862,1863],{"class":1521},"graph",[1050,1865,1844],{"class":1195},[1050,1867,1868],{"class":1836}," self",[1050,1870,1196],{"class":1195},[1050,1872,1522],{"class":1521},[1050,1874,1196],{"class":1195},[1050,1876,1527],{"class":1521},[1050,1878,1880],{"class":1052,"line":1879},72,[1050,1881,1251],{"class":1191},[1050,1883,1885,1887,1890,1892,1894,1896,1899],{"class":1052,"line":1884},73,[1050,1886,1267],{"class":1226},[1050,1888,1889],{"class":1270}," get_migration_plan",[1050,1891,1301],{"class":1195},[1050,1893,1803],{"class":1802},[1050,1895,1353],{"class":1195},[1050,1897,1898],{"class":1349}," targets",[1050,1900,1359],{"class":1195},[1050,1902,1904,1906,1909],{"class":1052,"line":1903},74,[1050,1905,1280],{"class":1082},[1050,1907,1908],{"class":1089},"Get the plan to reach target migrations",[1050,1910,1083],{"class":1082},[1050,1912,1914,1916,1918,1920,1922,1924,1926,1928,1930,1932],{"class":1052,"line":1913},75,[1050,1915,1451],{"class":1187},[1050,1917,1192],{"class":1191},[1050,1919,1196],{"class":1195},[1050,1921,1199],{"class":1191},[1050,1923,1196],{"class":1195},[1050,1925,1204],{"class":1191},[1050,1927,1196],{"class":1195},[1050,1929,1466],{"class":1191},[1050,1931,1212],{"class":1187},[1050,1933,1471],{"class":1191},[1050,1935,1937],{"class":1052,"line":1936},76,[1050,1938,1477],{"class":1191},[1050,1940,1942,1944,1946,1948,1950,1952],{"class":1052,"line":1941},77,[1050,1943,1483],{"class":1191},[1050,1945,1294],{"class":1195},[1050,1947,1488],{"class":1297},[1050,1949,1301],{"class":1195},[1050,1951,1304],{"class":1297},[1050,1953,1307],{"class":1195},[1050,1955,1957,1960,1962,1964,1966,1969,1971,1974],{"class":1052,"line":1956},78,[1050,1958,1959],{"class":1191},"        plan ",[1050,1961,1294],{"class":1195},[1050,1963,1516],{"class":1191},[1050,1965,1196],{"class":1195},[1050,1967,1968],{"class":1297},"migration_plan",[1050,1970,1301],{"class":1195},[1050,1972,1973],{"class":1297},"targets",[1050,1975,1307],{"class":1195},[1050,1977,1979],{"class":1052,"line":1978},79,[1050,1980,1477],{"class":1191},[1050,1982,1984,1986],{"class":1052,"line":1983},80,[1050,1985,1313],{"class":1187},[1050,1987,1988],{"class":1195}," [\n",[1050,1990,1992],{"class":1052,"line":1991},81,[1050,1993,1994],{"class":1195},"            {\n",[1050,1996,1998,2001,2004,2006,2008,2011,2014,2018,2020,2022,2024,2027,2029,2031,2033,2035,2037,2039,2041],{"class":1052,"line":1997},82,[1050,1999,2000],{"class":1643},"                '",[1050,2002,2003],{"class":1647},"migration",[1050,2005,1651],{"class":1643},[1050,2007,1654],{"class":1195},[1050,2009,2010],{"class":1226}," f",[1050,2012,2013],{"class":1647},"\"",[1050,2015,2017],{"class":2016},"s3h35","{",[1050,2019,2003],{"class":1191},[1050,2021,1196],{"class":1195},[1050,2023,1350],{"class":1521},[1050,2025,2026],{"class":2016},"}",[1050,2028,1196],{"class":1647},[1050,2030,2017],{"class":2016},[1050,2032,2003],{"class":1191},[1050,2034,1196],{"class":1195},[1050,2036,1668],{"class":1521},[1050,2038,2026],{"class":2016},[1050,2040,2013],{"class":1647},[1050,2042,1660],{"class":1195},[1050,2044,2046,2048,2051,2053,2055,2058],{"class":1052,"line":2045},83,[1050,2047,2000],{"class":1643},[1050,2049,2050],{"class":1647},"backwards",[1050,2052,1651],{"class":1643},[1050,2054,1654],{"class":1195},[1050,2056,2057],{"class":1191}," backwards",[1050,2059,1660],{"class":1195},[1050,2061,2063,2065,2067,2069,2071,2073,2075,2077],{"class":1052,"line":2062},84,[1050,2064,2000],{"class":1643},[1050,2066,1720],{"class":1647},[1050,2068,1651],{"class":1643},[1050,2070,1654],{"class":1195},[1050,2072,1727],{"class":1191},[1050,2074,1196],{"class":1195},[1050,2076,1720],{"class":1521},[1050,2078,1660],{"class":1195},[1050,2080,2082],{"class":1052,"line":2081},85,[1050,2083,2084],{"class":1195},"            }\n",[1050,2086,2088,2090,2092,2094,2097,2099],{"class":1052,"line":2087},86,[1050,2089,1577],{"class":1187},[1050,2091,1727],{"class":1191},[1050,2093,1353],{"class":1195},[1050,2095,2096],{"class":1191}," backwards ",[1050,2098,1561],{"class":1187},[1050,2100,2101],{"class":1191}," plan\n",[1050,2103,2105],{"class":1052,"line":2104},87,[1050,2106,2107],{"class":1195},"        ]\n",[1050,2109,2111],{"class":1052,"line":2110},88,[1050,2112,1251],{"class":1191},[1050,2114,2116,2118,2121,2123,2125],{"class":1052,"line":2115},89,[1050,2117,1267],{"class":1226},[1050,2119,2120],{"class":1270}," find_migration_conflicts",[1050,2122,1301],{"class":1195},[1050,2124,1803],{"class":1802},[1050,2126,1359],{"class":1195},[1050,2128,2130,2132,2135],{"class":1052,"line":2129},90,[1050,2131,1280],{"class":1082},[1050,2133,2134],{"class":1089},"Find conflicting migrations",[1050,2136,1083],{"class":1082},[1050,2138,2140,2143,2145],{"class":1052,"line":2139},91,[1050,2141,2142],{"class":1191},"        conflicts ",[1050,2144,1294],{"class":1195},[1050,2146,2147],{"class":1195}," {}\n",[1050,2149,2151],{"class":1052,"line":2150},92,[1050,2152,1477],{"class":1191},[1050,2154,2156,2158,2160,2162,2164,2166,2168,2170,2172],{"class":1052,"line":2155},93,[1050,2157,1555],{"class":1187},[1050,2159,1558],{"class":1191},[1050,2161,1561],{"class":1187},[1050,2163,1868],{"class":1836},[1050,2165,1196],{"class":1195},[1050,2167,1863],{"class":1521},[1050,2169,1196],{"class":1195},[1050,2171,1569],{"class":1521},[1050,2173,1234],{"class":1195},[1050,2175,2177,2180,2182],{"class":1052,"line":2176},94,[1050,2178,2179],{"class":1191},"            app_conflicts ",[1050,2181,1294],{"class":1195},[1050,2183,1549],{"class":1195},[1050,2185,2187],{"class":1052,"line":2186},95,[1050,2188,2189],{"class":1191},"            \n",[1050,2191,2193],{"class":1052,"line":2192},96,[1050,2194,2195],{"class":1056},"            # Check for multiple leaf nodes (potential conflicts)\n",[1050,2197,2199,2202,2204,2206,2208,2210,2212,2215,2217,2219],{"class":1052,"line":2198},97,[1050,2200,2201],{"class":1191},"            leaves ",[1050,2203,1294],{"class":1195},[1050,2205,1868],{"class":1836},[1050,2207,1196],{"class":1195},[1050,2209,1863],{"class":1521},[1050,2211,1196],{"class":1195},[1050,2213,2214],{"class":1297},"leaf_nodes",[1050,2216,1301],{"class":1195},[1050,2218,1350],{"class":1297},[1050,2220,1307],{"class":1195},[1050,2222,2224,2227,2230,2232,2235,2237,2240,2244],{"class":1052,"line":2223},98,[1050,2225,2226],{"class":1187},"            if",[1050,2228,2229],{"class":1796}," len",[1050,2231,1301],{"class":1195},[1050,2233,2234],{"class":1297},"leaves",[1050,2236,1401],{"class":1195},[1050,2238,2239],{"class":1404}," >",[1050,2241,2243],{"class":2242},"s7CZa"," 1",[1050,2245,1234],{"class":1195},[1050,2247,2249,2252,2254,2257,2259,2261],{"class":1052,"line":2248},99,[1050,2250,2251],{"class":1191},"                app_conflicts",[1050,2253,1196],{"class":1195},[1050,2255,2256],{"class":1297},"extend",[1050,2258,1301],{"class":1195},[1050,2260,2234],{"class":1297},[1050,2262,1307],{"class":1195},[1050,2264,2266],{"class":1052,"line":2265},100,[1050,2267,2189],{"class":1191},[1050,2269,2271,2273,2276],{"class":1052,"line":2270},101,[1050,2272,2226],{"class":1187},[1050,2274,2275],{"class":1191}," app_conflicts",[1050,2277,1234],{"class":1195},[1050,2279,2281,2284,2286,2288,2291,2293],{"class":1052,"line":2280},102,[1050,2282,2283],{"class":1191},"                conflicts",[1050,2285,1591],{"class":1195},[1050,2287,1350],{"class":1191},[1050,2289,2290],{"class":1195},"]",[1050,2292,1844],{"class":1195},[1050,2294,2295],{"class":1191}," app_conflicts\n",[1050,2297,2299],{"class":1052,"line":2298},103,[1050,2300,1477],{"class":1191},[1050,2302,2304,2306],{"class":1052,"line":2303},104,[1050,2305,1313],{"class":1187},[1050,2307,2308],{"class":1191}," conflicts\n",[1050,2310,2312],{"class":1052,"line":2311},105,[1050,2313,1251],{"class":1191},[1050,2315,2317,2319,2322,2324,2326],{"class":1052,"line":2316},106,[1050,2318,1267],{"class":1226},[1050,2320,2321],{"class":1270}," get_unapplied_migrations",[1050,2323,1301],{"class":1195},[1050,2325,1803],{"class":1802},[1050,2327,1359],{"class":1195},[1050,2329,2331,2333,2336],{"class":1052,"line":2330},107,[1050,2332,1280],{"class":1082},[1050,2334,2335],{"class":1089},"Get all unapplied migrations",[1050,2337,1083],{"class":1082},[1050,2339,2341,2344,2346],{"class":1052,"line":2340},108,[1050,2342,2343],{"class":1191},"        unapplied ",[1050,2345,1294],{"class":1195},[1050,2347,1549],{"class":1195},[1050,2349,2351],{"class":1052,"line":2350},109,[1050,2352,1477],{"class":1191},[1050,2354,2356,2358,2360,2362,2364,2366,2368,2370,2372],{"class":1052,"line":2355},110,[1050,2357,1555],{"class":1187},[1050,2359,1558],{"class":1191},[1050,2361,1561],{"class":1187},[1050,2363,1868],{"class":1836},[1050,2365,1196],{"class":1195},[1050,2367,1863],{"class":1521},[1050,2369,1196],{"class":1195},[1050,2371,1569],{"class":1521},[1050,2373,1234],{"class":1195},[1050,2375,2377,2379,2381,2383,2385,2387,2389,2391,2393,2395,2397],{"class":1052,"line":2376},111,[1050,2378,1577],{"class":1187},[1050,2380,1580],{"class":1191},[1050,2382,1561],{"class":1187},[1050,2384,1868],{"class":1836},[1050,2386,1196],{"class":1195},[1050,2388,1863],{"class":1521},[1050,2390,1196],{"class":1195},[1050,2392,1569],{"class":1521},[1050,2394,1591],{"class":1195},[1050,2396,1350],{"class":1521},[1050,2398,1596],{"class":1195},[1050,2400,2402,2405,2407,2409,2411,2413,2415,2418,2420,2422,2424,2426,2428,2430],{"class":1052,"line":2401},112,[1050,2403,2404],{"class":1187},"                if",[1050,2406,1392],{"class":1195},[1050,2408,1350],{"class":1191},[1050,2410,1353],{"class":1195},[1050,2412,1356],{"class":1191},[1050,2414,1401],{"class":1195},[1050,2416,2417],{"class":1404}," not",[1050,2419,1405],{"class":1404},[1050,2421,1868],{"class":1836},[1050,2423,1196],{"class":1195},[1050,2425,1522],{"class":1521},[1050,2427,1196],{"class":1195},[1050,2429,1321],{"class":1521},[1050,2431,1234],{"class":1195},[1050,2433,2435,2438,2440,2442,2445,2447,2449,2451],{"class":1052,"line":2434},113,[1050,2436,2437],{"class":1191},"                    unapplied",[1050,2439,1196],{"class":1195},[1050,2441,1634],{"class":1297},[1050,2443,2444],{"class":1195},"((",[1050,2446,1350],{"class":1297},[1050,2448,1353],{"class":1195},[1050,2450,1356],{"class":1297},[1050,2452,2453],{"class":1195},"))\n",[1050,2455,2457],{"class":1052,"line":2456},114,[1050,2458,1477],{"class":1191},[1050,2460,2462,2464],{"class":1052,"line":2461},115,[1050,2463,1313],{"class":1187},[1050,2465,2466],{"class":1191}," unapplied\n",[1035,2468,2470],{"id":2469},"migration-generation-process","Migration Generation Process",[1040,2472,2474],{"className":1042,"code":2473,"language":1044,"meta":1045,"style":1045},"# How Django generates migrations from model changes\n\nfrom django.db.migrations.autodetector import MigrationAutodetector\nfrom django.db.migrations.state import ProjectState\nfrom django.apps import apps\n\nclass MigrationGenerationProcess:\n    \"\"\"Understand how Django generates migrations\"\"\"\n    \n    @staticmethod\n    def analyze_model_changes():\n        \"\"\"Analyze what changes Django can detect\"\"\"\n        \n        # Get current project state from migrations\n        from django.db.migrations.loader import MigrationLoader\n        loader = MigrationLoader(connection)\n        \n        # Get state from last migrations\n        from_state = loader.project_state()\n        \n        # Get current state from models\n        to_state = ProjectState.from_apps(apps)\n        \n        # Create autodetector\n        autodetector = MigrationAutodetector(from_state, to_state)\n        \n        # Generate changes\n        changes = autodetector.changes(\n            graph=loader.graph,\n            trim_to_apps=None,\n            convert_apps=None,\n        )\n        \n        return changes\n    \n    @staticmethod\n    def simulate_migration_generation(app_label):\n        \"\"\"Simulate migration generation for an app\"\"\"\n        \n        changes = MigrationGenerationProcess.analyze_model_changes()\n        \n        if app_label in changes:\n            migrations = changes[app_label]\n            \n            for migration in migrations:\n                print(f\"Migration: {migration.name}\")\n                print(f\"Dependencies: {migration.dependencies}\")\n                print(\"Operations:\")\n                \n                for operation in migration.operations:\n                    print(f\"  - {operation.__class__.__name__}: {operation}\")\n        \n        return changes.get(app_label, [])\n\n# Migration operation types and their effects\nclass MigrationOperationAnalyzer:\n    \"\"\"Analyze different types of migration operations\"\"\"\n    \n    operation_types = {\n        'CreateModel': {\n            'description': 'Creates a new database table',\n            'sql_pattern': 'CREATE TABLE',\n            'reversible': True,\n            'data_safe': True,\n        },\n        'DeleteModel': {\n            'description': 'Drops a database table',\n            'sql_pattern': 'DROP TABLE',\n            'reversible': False,  # Data loss\n            'data_safe': False,\n        },\n        'AddField': {\n            'description': 'Adds a column to existing table',\n            'sql_pattern': 'ALTER TABLE ... ADD COLUMN',\n            'reversible': True,\n            'data_safe': True,\n        },\n        'RemoveField': {\n            'description': 'Removes a column from table',\n            'sql_pattern': 'ALTER TABLE ... DROP COLUMN',\n            'reversible': False,  # Data loss\n            'data_safe': False,\n        },\n        'AlterField': {\n            'description': 'Modifies existing column',\n            'sql_pattern': 'ALTER TABLE ... ALTER COLUMN',\n            'reversible': True,  # Usually\n            'data_safe': True,   # Usually\n        },\n        'RenameField': {\n            'description': 'Renames a column',\n            'sql_pattern': 'ALTER TABLE ... RENAME COLUMN',\n            'reversible': True,\n            'data_safe': True,\n        },\n        'AddIndex': {\n            'description': 'Creates database index',\n            'sql_pattern': 'CREATE INDEX',\n            'reversible': True,\n            'data_safe': True,\n        },\n        'RemoveIndex': {\n            'description': 'Drops database index',\n            'sql_pattern': 'DROP INDEX',\n            'reversible': True,\n            'data_safe': True,\n        },\n        'RunSQL': {\n            'description': 'Executes custom SQL',\n            'sql_pattern': 'Custom SQL',\n            'reversible': 'Depends on implementation',\n            'data_safe': 'Depends on SQL',\n        },\n        'RunPython': {\n            'description': 'Executes Python code',\n            'sql_pattern': 'N/A',\n            'reversible': 'Depends on implementation',\n            'data_safe': 'Depends on code',\n        },\n    }\n    \n    @staticmethod\n    def analyze_operation_safety(operation):\n        \"\"\"Analyze the safety of a migration operation\"\"\"\n        \n        operation_name = operation.__class__.__name__\n        operation_info = MigrationOperationAnalyzer.operation_types.get(\n            operation_name, \n            {'description': 'Unknown operation', 'data_safe': 'Unknown'}\n        )\n        \n        safety_analysis = {\n            'operation': operation_name,\n            'description': operation_info['description'],\n            'reversible': operation_info.get('reversible', 'Unknown'),\n            'data_safe': operation_info.get('data_safe', 'Unknown'),\n            'recommendations': []\n        }\n        \n        # Add specific recommendations\n        if operation_name == 'AddField':\n            if hasattr(operation, 'field') and not operation.field.null and not operation.field.default:\n                safety_analysis['data_safe'] = False\n                safety_analysis['recommendations'].append(\n                    'Adding NOT NULL field without default requires existing data handling'\n                )\n        \n        elif operation_name == 'AlterField':\n            safety_analysis['recommendations'].append(\n                'Review field changes for data compatibility'\n            )\n        \n        elif operation_name in ['RunSQL', 'RunPython']:\n            safety_analysis['recommendations'].append(\n                'Custom operations require manual review for safety'\n            )\n        \n        return safety_analysis\n\n# Migration execution process\nclass MigrationExecutionAnalyzer:\n    \"\"\"Analyze how migrations are executed\"\"\"\n    \n    @staticmethod\n    def trace_migration_execution(app_label, migration_name):\n        \"\"\"Trace the execution of a specific migration\"\"\"\n        \n        from django.db.migrations.executor import MigrationExecutor\n        from django.db.migrations.loader import MigrationLoader\n        \n        # Load migration\n        loader = MigrationLoader(connection)\n        migration = loader.get_migration(app_label, migration_name)\n        \n        # Analyze operations\n        execution_plan = []\n        \n        for operation in migration.operations:\n            operation_analysis = {\n                'operation': operation.__class__.__name__,\n                'description': str(operation),\n                'estimated_sql': None,\n                'dependencies': getattr(operation, 'dependencies', []),\n            }\n            \n            # Try to get SQL representation\n            try:\n                # Create a schema editor to generate SQL\n                with connection.schema_editor() as schema_editor:\n                    if hasattr(operation, 'database_forwards'):\n                        # This is a simplified approach - actual SQL generation\n                        # requires more context\n                        operation_analysis['has_sql'] = True\n                    else:\n                        operation_analysis['has_sql'] = False\n            except:\n                operation_analysis['has_sql'] = 'Unknown'\n            \n            execution_plan.append(operation_analysis)\n        \n        return {\n            'migration': f\"{app_label}.{migration_name}\",\n            'dependencies': migration.dependencies,\n            'operations': execution_plan,\n            'atomic': getattr(migration, 'atomic', True),\n        }\n    \n    @staticmethod\n    def simulate_migration_rollback(app_label, migration_name):\n        \"\"\"Simulate rolling back a migration\"\"\"\n        \n        from django.db.migrations.loader import MigrationLoader\n        \n        loader = MigrationLoader(connection)\n        migration = loader.get_migration(app_label, migration_name)\n        \n        rollback_plan = []\n        \n        # Operations are applied in reverse order for rollback\n        for operation in reversed(migration.operations):\n            rollback_info = {\n                'operation': operation.__class__.__name__,\n                'reversible': hasattr(operation, 'database_backwards'),\n                'description': str(operation),\n            }\n            \n            # Check if operation is reversible\n            if hasattr(operation, 'reversible') and not operation.reversible:\n                rollback_info['warning'] = 'This operation is not reversible'\n            \n            rollback_plan.append(rollback_info)\n        \n        return {\n            'migration': f\"{app_label}.{migration_name}\",\n            'rollback_operations': rollback_plan,\n            'safe_to_rollback': all(op['reversible'] for op in rollback_plan),\n        }\n",[1047,2475,2476,2481,2485,2509,2533,2549,2553,2562,2571,2575,2581,2590,2599,2603,2608,2630,2645,2649,2654,2671,2675,2680,2702,2706,2711,2733,2737,2742,2760,2776,2789,2800,2805,2809,2816,2820,2826,2839,2848,2852,2867,2871,2885,2900,2904,2918,2945,2970,2985,2990,3009,3052,3056,3076,3080,3085,3094,3103,3107,3117,3131,3153,3173,3189,3204,3209,3222,3241,3260,3278,3292,3296,3309,3328,3347,3361,3375,3379,3392,3411,3430,3446,3460,3464,3477,3496,3515,3532,3549,3553,3566,3585,3604,3618,3632,3636,3649,3668,3687,3701,3715,3719,3732,3751,3770,3784,3798,3802,3815,3834,3853,3872,3891,3895,3908,3927,3947,3966,3986,3991,3997,4002,4009,4023,4033,4038,4058,4079,4090,4131,4136,4141,4151,4167,4192,4228,4263,4277,4283,4288,4294,4313,4369,4390,4410,4421,4427,4432,4450,4470,4480,4486,4491,4519,4538,4548,4553,4558,4566,4571,4577,4587,4597,4602,4609,4627,4637,4642,4665,4688,4693,4699,4714,4739,4744,4750,4760,4765,4782,4792,4815,4835,4852,4883,4888,4893,4899,4907,4913,4938,4961,4967,4973,4995,5003,5022,5030,5054,5059,5076,5081,5088,5121,5140,5156,5188,5193,5198,5205,5223,5233,5238,5261,5266,5281,5304,5309,5319,5324,5330,5352,5362,5385,5413,5432,5437,5442,5448,5481,5507,5512,5529,5534,5541,5574,5591,5633],{"__ignoreMap":1045},[1050,2477,2478],{"class":1052,"line":1053},[1050,2479,2480],{"class":1056},"# How Django generates migrations from model changes\n",[1050,2482,2483],{"class":1052,"line":1060},[1050,2484,1070],{"emptyLinePlaceholder":1069},[1050,2486,2487,2489,2491,2493,2495,2497,2499,2501,2504,2506],{"class":1052,"line":1066},[1050,2488,1188],{"class":1187},[1050,2490,1192],{"class":1191},[1050,2492,1196],{"class":1195},[1050,2494,1199],{"class":1191},[1050,2496,1196],{"class":1195},[1050,2498,1204],{"class":1191},[1050,2500,1196],{"class":1195},[1050,2502,2503],{"class":1191},"autodetector ",[1050,2505,1212],{"class":1187},[1050,2507,2508],{"class":1191}," MigrationAutodetector\n",[1050,2510,2511,2513,2515,2517,2519,2521,2523,2525,2528,2530],{"class":1052,"line":1073},[1050,2512,1188],{"class":1187},[1050,2514,1192],{"class":1191},[1050,2516,1196],{"class":1195},[1050,2518,1199],{"class":1191},[1050,2520,1196],{"class":1195},[1050,2522,1204],{"class":1191},[1050,2524,1196],{"class":1195},[1050,2526,2527],{"class":1191},"state ",[1050,2529,1212],{"class":1187},[1050,2531,2532],{"class":1191}," ProjectState\n",[1050,2534,2535,2537,2539,2541,2544,2546],{"class":1052,"line":1079},[1050,2536,1188],{"class":1187},[1050,2538,1192],{"class":1191},[1050,2540,1196],{"class":1195},[1050,2542,2543],{"class":1191},"apps ",[1050,2545,1212],{"class":1187},[1050,2547,2548],{"class":1191}," apps\n",[1050,2550,2551],{"class":1052,"line":1086},[1050,2552,1070],{"emptyLinePlaceholder":1069},[1050,2554,2555,2557,2560],{"class":1052,"line":1093},[1050,2556,1227],{"class":1226},[1050,2558,2559],{"class":1230}," MigrationGenerationProcess",[1050,2561,1234],{"class":1195},[1050,2563,2564,2566,2569],{"class":1052,"line":1099},[1050,2565,1240],{"class":1082},[1050,2567,2568],{"class":1089},"Understand how Django generates migrations",[1050,2570,1083],{"class":1082},[1050,2572,2573],{"class":1052,"line":1105},[1050,2574,1251],{"class":1191},[1050,2576,2577,2579],{"class":1052,"line":1111},[1050,2578,1257],{"class":1195},[1050,2580,1261],{"class":1260},[1050,2582,2583,2585,2588],{"class":1052,"line":1117},[1050,2584,1267],{"class":1226},[1050,2586,2587],{"class":1270}," analyze_model_changes",[1050,2589,1274],{"class":1195},[1050,2591,2592,2594,2597],{"class":1052,"line":1123},[1050,2593,1280],{"class":1082},[1050,2595,2596],{"class":1089},"Analyze what changes Django can detect",[1050,2598,1083],{"class":1082},[1050,2600,2601],{"class":1052,"line":1128},[1050,2602,1477],{"class":1191},[1050,2604,2605],{"class":1052,"line":1133},[1050,2606,2607],{"class":1056},"        # Get current project state from migrations\n",[1050,2609,2610,2612,2614,2616,2618,2620,2622,2624,2626,2628],{"class":1052,"line":1139},[1050,2611,1451],{"class":1187},[1050,2613,1192],{"class":1191},[1050,2615,1196],{"class":1195},[1050,2617,1199],{"class":1191},[1050,2619,1196],{"class":1195},[1050,2621,1204],{"class":1191},[1050,2623,1196],{"class":1195},[1050,2625,1825],{"class":1191},[1050,2627,1212],{"class":1187},[1050,2629,1830],{"class":1191},[1050,2631,2632,2635,2637,2639,2641,2643],{"class":1052,"line":1144},[1050,2633,2634],{"class":1191},"        loader ",[1050,2636,1294],{"class":1195},[1050,2638,1847],{"class":1297},[1050,2640,1301],{"class":1195},[1050,2642,1304],{"class":1297},[1050,2644,1307],{"class":1195},[1050,2646,2647],{"class":1052,"line":1150},[1050,2648,1477],{"class":1191},[1050,2650,2651],{"class":1052,"line":1156},[1050,2652,2653],{"class":1056},"        # Get state from last migrations\n",[1050,2655,2656,2659,2661,2664,2666,2669],{"class":1052,"line":1162},[1050,2657,2658],{"class":1191},"        from_state ",[1050,2660,1294],{"class":1195},[1050,2662,2663],{"class":1191}," loader",[1050,2665,1196],{"class":1195},[1050,2667,2668],{"class":1297},"project_state",[1050,2670,1324],{"class":1195},[1050,2672,2673],{"class":1052,"line":1168},[1050,2674,1477],{"class":1191},[1050,2676,2677],{"class":1052,"line":1174},[1050,2678,2679],{"class":1056},"        # Get current state from models\n",[1050,2681,2682,2685,2687,2690,2692,2695,2697,2700],{"class":1052,"line":1179},[1050,2683,2684],{"class":1191},"        to_state ",[1050,2686,1294],{"class":1195},[1050,2688,2689],{"class":1191}," ProjectState",[1050,2691,1196],{"class":1195},[1050,2693,2694],{"class":1297},"from_apps",[1050,2696,1301],{"class":1195},[1050,2698,2699],{"class":1297},"apps",[1050,2701,1307],{"class":1195},[1050,2703,2704],{"class":1052,"line":1184},[1050,2705,1477],{"class":1191},[1050,2707,2708],{"class":1052,"line":1218},[1050,2709,2710],{"class":1056},"        # Create autodetector\n",[1050,2712,2713,2716,2718,2721,2723,2726,2728,2731],{"class":1052,"line":1223},[1050,2714,2715],{"class":1191},"        autodetector ",[1050,2717,1294],{"class":1195},[1050,2719,2720],{"class":1297}," MigrationAutodetector",[1050,2722,1301],{"class":1195},[1050,2724,2725],{"class":1297},"from_state",[1050,2727,1353],{"class":1195},[1050,2729,2730],{"class":1297}," to_state",[1050,2732,1307],{"class":1195},[1050,2734,2735],{"class":1052,"line":1237},[1050,2736,1477],{"class":1191},[1050,2738,2739],{"class":1052,"line":1248},[1050,2740,2741],{"class":1056},"        # Generate changes\n",[1050,2743,2744,2747,2749,2752,2754,2757],{"class":1052,"line":1254},[1050,2745,2746],{"class":1191},"        changes ",[1050,2748,1294],{"class":1195},[1050,2750,2751],{"class":1191}," autodetector",[1050,2753,1196],{"class":1195},[1050,2755,2756],{"class":1297},"changes",[1050,2758,2759],{"class":1195},"(\n",[1050,2761,2762,2766,2768,2770,2772,2774],{"class":1052,"line":1264},[1050,2763,2765],{"class":2764},"sqOPj","            graph",[1050,2767,1294],{"class":1195},[1050,2769,1522],{"class":1297},[1050,2771,1196],{"class":1195},[1050,2773,1863],{"class":1521},[1050,2775,1660],{"class":1195},[1050,2777,2778,2781,2783,2787],{"class":1052,"line":1277},[1050,2779,2780],{"class":2764},"            trim_to_apps",[1050,2782,1294],{"class":1195},[1050,2784,2786],{"class":2785},"s8XtY","None",[1050,2788,1660],{"class":1195},[1050,2790,2791,2794,2796,2798],{"class":1052,"line":1288},[1050,2792,2793],{"class":2764},"            convert_apps",[1050,2795,1294],{"class":1195},[1050,2797,2786],{"class":2785},[1050,2799,1660],{"class":1195},[1050,2801,2802],{"class":1052,"line":1310},[1050,2803,2804],{"class":1195},"        )\n",[1050,2806,2807],{"class":1052,"line":1327},[1050,2808,1477],{"class":1191},[1050,2810,2811,2813],{"class":1052,"line":1332},[1050,2812,1313],{"class":1187},[1050,2814,2815],{"class":1191}," changes\n",[1050,2817,2818],{"class":1052,"line":1339},[1050,2819,1251],{"class":1191},[1050,2821,2822,2824],{"class":1052,"line":1362},[1050,2823,1257],{"class":1195},[1050,2825,1261],{"class":1260},[1050,2827,2828,2830,2833,2835,2837],{"class":1052,"line":1372},[1050,2829,1267],{"class":1226},[1050,2831,2832],{"class":1270}," simulate_migration_generation",[1050,2834,1301],{"class":1195},[1050,2836,1350],{"class":1349},[1050,2838,1359],{"class":1195},[1050,2840,2841,2843,2846],{"class":1052,"line":1387},[1050,2842,1280],{"class":1082},[1050,2844,2845],{"class":1089},"Simulate migration generation for an app",[1050,2847,1083],{"class":1082},[1050,2849,2850],{"class":1052,"line":1416},[1050,2851,1477],{"class":1191},[1050,2853,2854,2856,2858,2860,2862,2865],{"class":1052,"line":1421},[1050,2855,2746],{"class":1191},[1050,2857,1294],{"class":1195},[1050,2859,2559],{"class":1191},[1050,2861,1196],{"class":1195},[1050,2863,2864],{"class":1297},"analyze_model_changes",[1050,2866,1324],{"class":1195},[1050,2868,2869],{"class":1052,"line":1428},[1050,2870,1477],{"class":1191},[1050,2872,2873,2876,2878,2880,2883],{"class":1052,"line":1438},[1050,2874,2875],{"class":1187},"        if",[1050,2877,1558],{"class":1191},[1050,2879,1561],{"class":1404},[1050,2881,2882],{"class":1191}," changes",[1050,2884,1234],{"class":1195},[1050,2886,2887,2890,2892,2894,2896,2898],{"class":1052,"line":1448},[1050,2888,2889],{"class":1191},"            migrations ",[1050,2891,1294],{"class":1195},[1050,2893,2882],{"class":1191},[1050,2895,1591],{"class":1195},[1050,2897,1350],{"class":1191},[1050,2899,1623],{"class":1195},[1050,2901,2902],{"class":1052,"line":1474},[1050,2903,2189],{"class":1191},[1050,2905,2906,2908,2911,2913,2916],{"class":1052,"line":1480},[1050,2907,1577],{"class":1187},[1050,2909,2910],{"class":1191}," migration ",[1050,2912,1561],{"class":1187},[1050,2914,2915],{"class":1191}," migrations",[1050,2917,1234],{"class":1195},[1050,2919,2920,2923,2925,2928,2931,2933,2935,2937,2939,2941,2943],{"class":1052,"line":1497},[1050,2921,2922],{"class":1796},"                print",[1050,2924,1301],{"class":1195},[1050,2926,2927],{"class":1226},"f",[1050,2929,2930],{"class":1647},"\"Migration: ",[1050,2932,2017],{"class":2016},[1050,2934,2003],{"class":1297},[1050,2936,1196],{"class":1195},[1050,2938,1668],{"class":1521},[1050,2940,2026],{"class":2016},[1050,2942,2013],{"class":1647},[1050,2944,1307],{"class":1195},[1050,2946,2947,2949,2951,2953,2956,2958,2960,2962,2964,2966,2968],{"class":1052,"line":1502},[1050,2948,2922],{"class":1796},[1050,2950,1301],{"class":1195},[1050,2952,2927],{"class":1226},[1050,2954,2955],{"class":1647},"\"Dependencies: ",[1050,2957,2017],{"class":2016},[1050,2959,2003],{"class":1297},[1050,2961,1196],{"class":1195},[1050,2963,1720],{"class":1521},[1050,2965,2026],{"class":2016},[1050,2967,2013],{"class":1647},[1050,2969,1307],{"class":1195},[1050,2971,2972,2974,2976,2978,2981,2983],{"class":1052,"line":1508},[1050,2973,2922],{"class":1796},[1050,2975,1301],{"class":1195},[1050,2977,2013],{"class":1643},[1050,2979,2980],{"class":1647},"Operations:",[1050,2982,2013],{"class":1643},[1050,2984,1307],{"class":1195},[1050,2986,2987],{"class":1052,"line":1530},[1050,2988,2989],{"class":1191},"                \n",[1050,2991,2992,2995,2998,3000,3002,3004,3007],{"class":1052,"line":1535},[1050,2993,2994],{"class":1187},"                for",[1050,2996,2997],{"class":1191}," operation ",[1050,2999,1561],{"class":1187},[1050,3001,1727],{"class":1191},[1050,3003,1196],{"class":1195},[1050,3005,3006],{"class":1521},"operations",[1050,3008,1234],{"class":1195},[1050,3010,3011,3014,3016,3018,3021,3023,3026,3028,3032,3034,3037,3039,3042,3044,3046,3048,3050],{"class":1052,"line":1541},[1050,3012,3013],{"class":1796},"                    print",[1050,3015,1301],{"class":1195},[1050,3017,2927],{"class":1226},[1050,3019,3020],{"class":1647},"\"  - ",[1050,3022,2017],{"class":2016},[1050,3024,3025],{"class":1297},"operation",[1050,3027,1196],{"class":1195},[1050,3029,3031],{"class":3030},"s131V","__class__",[1050,3033,1196],{"class":1195},[1050,3035,3036],{"class":3030},"__name__",[1050,3038,2026],{"class":2016},[1050,3040,3041],{"class":1647},": ",[1050,3043,2017],{"class":2016},[1050,3045,3025],{"class":1297},[1050,3047,2026],{"class":2016},[1050,3049,2013],{"class":1647},[1050,3051,1307],{"class":1195},[1050,3053,3054],{"class":1052,"line":1552},[1050,3055,1477],{"class":1191},[1050,3057,3058,3060,3062,3064,3067,3069,3071,3073],{"class":1052,"line":1574},[1050,3059,1313],{"class":1187},[1050,3061,2882],{"class":1191},[1050,3063,1196],{"class":1195},[1050,3065,3066],{"class":1297},"get",[1050,3068,1301],{"class":1195},[1050,3070,1350],{"class":1297},[1050,3072,1353],{"class":1195},[1050,3074,3075],{"class":1195}," [])\n",[1050,3077,3078],{"class":1052,"line":1599},[1050,3079,1070],{"emptyLinePlaceholder":1069},[1050,3081,3082],{"class":1052,"line":1626},[1050,3083,3084],{"class":1056},"# Migration operation types and their effects\n",[1050,3086,3087,3089,3092],{"class":1052,"line":1640},[1050,3088,1227],{"class":1226},[1050,3090,3091],{"class":1230}," MigrationOperationAnalyzer",[1050,3093,1234],{"class":1195},[1050,3095,3096,3098,3101],{"class":1052,"line":1663},[1050,3097,1240],{"class":1082},[1050,3099,3100],{"class":1089},"Analyze different types of migration operations",[1050,3102,1083],{"class":1082},[1050,3104,3105],{"class":1052,"line":1679},[1050,3106,1251],{"class":1191},[1050,3108,3109,3112,3114],{"class":1052,"line":1715},[1050,3110,3111],{"class":1191},"    operation_types ",[1050,3113,1294],{"class":1195},[1050,3115,3116],{"class":1195}," {\n",[1050,3118,3119,3122,3125,3127,3129],{"class":1052,"line":1736},[1050,3120,3121],{"class":1643},"        '",[1050,3123,3124],{"class":1647},"CreateModel",[1050,3126,1651],{"class":1643},[1050,3128,1654],{"class":1195},[1050,3130,3116],{"class":1195},[1050,3132,3133,3136,3139,3141,3143,3146,3149,3151],{"class":1052,"line":1742},[1050,3134,3135],{"class":1643},"            '",[1050,3137,3138],{"class":1647},"description",[1050,3140,1651],{"class":1643},[1050,3142,1654],{"class":1195},[1050,3144,3145],{"class":1643}," '",[1050,3147,3148],{"class":1647},"Creates a new database table",[1050,3150,1651],{"class":1643},[1050,3152,1660],{"class":1195},[1050,3154,3155,3157,3160,3162,3164,3166,3169,3171],{"class":1052,"line":1747},[1050,3156,3135],{"class":1643},[1050,3158,3159],{"class":1647},"sql_pattern",[1050,3161,1651],{"class":1643},[1050,3163,1654],{"class":1195},[1050,3165,3145],{"class":1643},[1050,3167,3168],{"class":1647},"CREATE TABLE",[1050,3170,1651],{"class":1643},[1050,3172,1660],{"class":1195},[1050,3174,3175,3177,3180,3182,3184,3187],{"class":1052,"line":1755},[1050,3176,3135],{"class":1643},[1050,3178,3179],{"class":1647},"reversible",[1050,3181,1651],{"class":1643},[1050,3183,1654],{"class":1195},[1050,3185,3186],{"class":2785}," True",[1050,3188,1660],{"class":1195},[1050,3190,3191,3193,3196,3198,3200,3202],{"class":1052,"line":1760},[1050,3192,3135],{"class":1643},[1050,3194,3195],{"class":1647},"data_safe",[1050,3197,1651],{"class":1643},[1050,3199,1654],{"class":1195},[1050,3201,3186],{"class":2785},[1050,3203,1660],{"class":1195},[1050,3205,3206],{"class":1052,"line":1766},[1050,3207,3208],{"class":1195},"        },\n",[1050,3210,3211,3213,3216,3218,3220],{"class":1052,"line":1776},[1050,3212,3121],{"class":1643},[1050,3214,3215],{"class":1647},"DeleteModel",[1050,3217,1651],{"class":1643},[1050,3219,1654],{"class":1195},[1050,3221,3116],{"class":1195},[1050,3223,3224,3226,3228,3230,3232,3234,3237,3239],{"class":1052,"line":1786},[1050,3225,3135],{"class":1643},[1050,3227,3138],{"class":1647},[1050,3229,1651],{"class":1643},[1050,3231,1654],{"class":1195},[1050,3233,3145],{"class":1643},[1050,3235,3236],{"class":1647},"Drops a database table",[1050,3238,1651],{"class":1643},[1050,3240,1660],{"class":1195},[1050,3242,3243,3245,3247,3249,3251,3253,3256,3258],{"class":1052,"line":1791},[1050,3244,3135],{"class":1643},[1050,3246,3159],{"class":1647},[1050,3248,1651],{"class":1643},[1050,3250,1654],{"class":1195},[1050,3252,3145],{"class":1643},[1050,3254,3255],{"class":1647},"DROP TABLE",[1050,3257,1651],{"class":1643},[1050,3259,1660],{"class":1195},[1050,3261,3262,3264,3266,3268,3270,3273,3275],{"class":1052,"line":1808},[1050,3263,3135],{"class":1643},[1050,3265,3179],{"class":1647},[1050,3267,1651],{"class":1643},[1050,3269,1654],{"class":1195},[1050,3271,3272],{"class":2785}," False",[1050,3274,1353],{"class":1195},[1050,3276,3277],{"class":1056},"  # Data loss\n",[1050,3279,3280,3282,3284,3286,3288,3290],{"class":1052,"line":1833},[1050,3281,3135],{"class":1643},[1050,3283,3195],{"class":1647},[1050,3285,1651],{"class":1643},[1050,3287,1654],{"class":1195},[1050,3289,3272],{"class":2785},[1050,3291,1660],{"class":1195},[1050,3293,3294],{"class":1052,"line":1856},[1050,3295,3208],{"class":1195},[1050,3297,3298,3300,3303,3305,3307],{"class":1052,"line":1879},[1050,3299,3121],{"class":1643},[1050,3301,3302],{"class":1647},"AddField",[1050,3304,1651],{"class":1643},[1050,3306,1654],{"class":1195},[1050,3308,3116],{"class":1195},[1050,3310,3311,3313,3315,3317,3319,3321,3324,3326],{"class":1052,"line":1884},[1050,3312,3135],{"class":1643},[1050,3314,3138],{"class":1647},[1050,3316,1651],{"class":1643},[1050,3318,1654],{"class":1195},[1050,3320,3145],{"class":1643},[1050,3322,3323],{"class":1647},"Adds a column to existing table",[1050,3325,1651],{"class":1643},[1050,3327,1660],{"class":1195},[1050,3329,3330,3332,3334,3336,3338,3340,3343,3345],{"class":1052,"line":1903},[1050,3331,3135],{"class":1643},[1050,3333,3159],{"class":1647},[1050,3335,1651],{"class":1643},[1050,3337,1654],{"class":1195},[1050,3339,3145],{"class":1643},[1050,3341,3342],{"class":1647},"ALTER TABLE ... ADD COLUMN",[1050,3344,1651],{"class":1643},[1050,3346,1660],{"class":1195},[1050,3348,3349,3351,3353,3355,3357,3359],{"class":1052,"line":1913},[1050,3350,3135],{"class":1643},[1050,3352,3179],{"class":1647},[1050,3354,1651],{"class":1643},[1050,3356,1654],{"class":1195},[1050,3358,3186],{"class":2785},[1050,3360,1660],{"class":1195},[1050,3362,3363,3365,3367,3369,3371,3373],{"class":1052,"line":1936},[1050,3364,3135],{"class":1643},[1050,3366,3195],{"class":1647},[1050,3368,1651],{"class":1643},[1050,3370,1654],{"class":1195},[1050,3372,3186],{"class":2785},[1050,3374,1660],{"class":1195},[1050,3376,3377],{"class":1052,"line":1941},[1050,3378,3208],{"class":1195},[1050,3380,3381,3383,3386,3388,3390],{"class":1052,"line":1956},[1050,3382,3121],{"class":1643},[1050,3384,3385],{"class":1647},"RemoveField",[1050,3387,1651],{"class":1643},[1050,3389,1654],{"class":1195},[1050,3391,3116],{"class":1195},[1050,3393,3394,3396,3398,3400,3402,3404,3407,3409],{"class":1052,"line":1978},[1050,3395,3135],{"class":1643},[1050,3397,3138],{"class":1647},[1050,3399,1651],{"class":1643},[1050,3401,1654],{"class":1195},[1050,3403,3145],{"class":1643},[1050,3405,3406],{"class":1647},"Removes a column from table",[1050,3408,1651],{"class":1643},[1050,3410,1660],{"class":1195},[1050,3412,3413,3415,3417,3419,3421,3423,3426,3428],{"class":1052,"line":1983},[1050,3414,3135],{"class":1643},[1050,3416,3159],{"class":1647},[1050,3418,1651],{"class":1643},[1050,3420,1654],{"class":1195},[1050,3422,3145],{"class":1643},[1050,3424,3425],{"class":1647},"ALTER TABLE ... DROP COLUMN",[1050,3427,1651],{"class":1643},[1050,3429,1660],{"class":1195},[1050,3431,3432,3434,3436,3438,3440,3442,3444],{"class":1052,"line":1991},[1050,3433,3135],{"class":1643},[1050,3435,3179],{"class":1647},[1050,3437,1651],{"class":1643},[1050,3439,1654],{"class":1195},[1050,3441,3272],{"class":2785},[1050,3443,1353],{"class":1195},[1050,3445,3277],{"class":1056},[1050,3447,3448,3450,3452,3454,3456,3458],{"class":1052,"line":1997},[1050,3449,3135],{"class":1643},[1050,3451,3195],{"class":1647},[1050,3453,1651],{"class":1643},[1050,3455,1654],{"class":1195},[1050,3457,3272],{"class":2785},[1050,3459,1660],{"class":1195},[1050,3461,3462],{"class":1052,"line":2045},[1050,3463,3208],{"class":1195},[1050,3465,3466,3468,3471,3473,3475],{"class":1052,"line":2062},[1050,3467,3121],{"class":1643},[1050,3469,3470],{"class":1647},"AlterField",[1050,3472,1651],{"class":1643},[1050,3474,1654],{"class":1195},[1050,3476,3116],{"class":1195},[1050,3478,3479,3481,3483,3485,3487,3489,3492,3494],{"class":1052,"line":2081},[1050,3480,3135],{"class":1643},[1050,3482,3138],{"class":1647},[1050,3484,1651],{"class":1643},[1050,3486,1654],{"class":1195},[1050,3488,3145],{"class":1643},[1050,3490,3491],{"class":1647},"Modifies existing column",[1050,3493,1651],{"class":1643},[1050,3495,1660],{"class":1195},[1050,3497,3498,3500,3502,3504,3506,3508,3511,3513],{"class":1052,"line":2087},[1050,3499,3135],{"class":1643},[1050,3501,3159],{"class":1647},[1050,3503,1651],{"class":1643},[1050,3505,1654],{"class":1195},[1050,3507,3145],{"class":1643},[1050,3509,3510],{"class":1647},"ALTER TABLE ... ALTER COLUMN",[1050,3512,1651],{"class":1643},[1050,3514,1660],{"class":1195},[1050,3516,3517,3519,3521,3523,3525,3527,3529],{"class":1052,"line":2104},[1050,3518,3135],{"class":1643},[1050,3520,3179],{"class":1647},[1050,3522,1651],{"class":1643},[1050,3524,1654],{"class":1195},[1050,3526,3186],{"class":2785},[1050,3528,1353],{"class":1195},[1050,3530,3531],{"class":1056},"  # Usually\n",[1050,3533,3534,3536,3538,3540,3542,3544,3546],{"class":1052,"line":2110},[1050,3535,3135],{"class":1643},[1050,3537,3195],{"class":1647},[1050,3539,1651],{"class":1643},[1050,3541,1654],{"class":1195},[1050,3543,3186],{"class":2785},[1050,3545,1353],{"class":1195},[1050,3547,3548],{"class":1056},"   # Usually\n",[1050,3550,3551],{"class":1052,"line":2115},[1050,3552,3208],{"class":1195},[1050,3554,3555,3557,3560,3562,3564],{"class":1052,"line":2129},[1050,3556,3121],{"class":1643},[1050,3558,3559],{"class":1647},"RenameField",[1050,3561,1651],{"class":1643},[1050,3563,1654],{"class":1195},[1050,3565,3116],{"class":1195},[1050,3567,3568,3570,3572,3574,3576,3578,3581,3583],{"class":1052,"line":2139},[1050,3569,3135],{"class":1643},[1050,3571,3138],{"class":1647},[1050,3573,1651],{"class":1643},[1050,3575,1654],{"class":1195},[1050,3577,3145],{"class":1643},[1050,3579,3580],{"class":1647},"Renames a column",[1050,3582,1651],{"class":1643},[1050,3584,1660],{"class":1195},[1050,3586,3587,3589,3591,3593,3595,3597,3600,3602],{"class":1052,"line":2150},[1050,3588,3135],{"class":1643},[1050,3590,3159],{"class":1647},[1050,3592,1651],{"class":1643},[1050,3594,1654],{"class":1195},[1050,3596,3145],{"class":1643},[1050,3598,3599],{"class":1647},"ALTER TABLE ... RENAME COLUMN",[1050,3601,1651],{"class":1643},[1050,3603,1660],{"class":1195},[1050,3605,3606,3608,3610,3612,3614,3616],{"class":1052,"line":2155},[1050,3607,3135],{"class":1643},[1050,3609,3179],{"class":1647},[1050,3611,1651],{"class":1643},[1050,3613,1654],{"class":1195},[1050,3615,3186],{"class":2785},[1050,3617,1660],{"class":1195},[1050,3619,3620,3622,3624,3626,3628,3630],{"class":1052,"line":2176},[1050,3621,3135],{"class":1643},[1050,3623,3195],{"class":1647},[1050,3625,1651],{"class":1643},[1050,3627,1654],{"class":1195},[1050,3629,3186],{"class":2785},[1050,3631,1660],{"class":1195},[1050,3633,3634],{"class":1052,"line":2186},[1050,3635,3208],{"class":1195},[1050,3637,3638,3640,3643,3645,3647],{"class":1052,"line":2192},[1050,3639,3121],{"class":1643},[1050,3641,3642],{"class":1647},"AddIndex",[1050,3644,1651],{"class":1643},[1050,3646,1654],{"class":1195},[1050,3648,3116],{"class":1195},[1050,3650,3651,3653,3655,3657,3659,3661,3664,3666],{"class":1052,"line":2198},[1050,3652,3135],{"class":1643},[1050,3654,3138],{"class":1647},[1050,3656,1651],{"class":1643},[1050,3658,1654],{"class":1195},[1050,3660,3145],{"class":1643},[1050,3662,3663],{"class":1647},"Creates database index",[1050,3665,1651],{"class":1643},[1050,3667,1660],{"class":1195},[1050,3669,3670,3672,3674,3676,3678,3680,3683,3685],{"class":1052,"line":2223},[1050,3671,3135],{"class":1643},[1050,3673,3159],{"class":1647},[1050,3675,1651],{"class":1643},[1050,3677,1654],{"class":1195},[1050,3679,3145],{"class":1643},[1050,3681,3682],{"class":1647},"CREATE INDEX",[1050,3684,1651],{"class":1643},[1050,3686,1660],{"class":1195},[1050,3688,3689,3691,3693,3695,3697,3699],{"class":1052,"line":2248},[1050,3690,3135],{"class":1643},[1050,3692,3179],{"class":1647},[1050,3694,1651],{"class":1643},[1050,3696,1654],{"class":1195},[1050,3698,3186],{"class":2785},[1050,3700,1660],{"class":1195},[1050,3702,3703,3705,3707,3709,3711,3713],{"class":1052,"line":2265},[1050,3704,3135],{"class":1643},[1050,3706,3195],{"class":1647},[1050,3708,1651],{"class":1643},[1050,3710,1654],{"class":1195},[1050,3712,3186],{"class":2785},[1050,3714,1660],{"class":1195},[1050,3716,3717],{"class":1052,"line":2270},[1050,3718,3208],{"class":1195},[1050,3720,3721,3723,3726,3728,3730],{"class":1052,"line":2280},[1050,3722,3121],{"class":1643},[1050,3724,3725],{"class":1647},"RemoveIndex",[1050,3727,1651],{"class":1643},[1050,3729,1654],{"class":1195},[1050,3731,3116],{"class":1195},[1050,3733,3734,3736,3738,3740,3742,3744,3747,3749],{"class":1052,"line":2298},[1050,3735,3135],{"class":1643},[1050,3737,3138],{"class":1647},[1050,3739,1651],{"class":1643},[1050,3741,1654],{"class":1195},[1050,3743,3145],{"class":1643},[1050,3745,3746],{"class":1647},"Drops database index",[1050,3748,1651],{"class":1643},[1050,3750,1660],{"class":1195},[1050,3752,3753,3755,3757,3759,3761,3763,3766,3768],{"class":1052,"line":2303},[1050,3754,3135],{"class":1643},[1050,3756,3159],{"class":1647},[1050,3758,1651],{"class":1643},[1050,3760,1654],{"class":1195},[1050,3762,3145],{"class":1643},[1050,3764,3765],{"class":1647},"DROP INDEX",[1050,3767,1651],{"class":1643},[1050,3769,1660],{"class":1195},[1050,3771,3772,3774,3776,3778,3780,3782],{"class":1052,"line":2311},[1050,3773,3135],{"class":1643},[1050,3775,3179],{"class":1647},[1050,3777,1651],{"class":1643},[1050,3779,1654],{"class":1195},[1050,3781,3186],{"class":2785},[1050,3783,1660],{"class":1195},[1050,3785,3786,3788,3790,3792,3794,3796],{"class":1052,"line":2316},[1050,3787,3135],{"class":1643},[1050,3789,3195],{"class":1647},[1050,3791,1651],{"class":1643},[1050,3793,1654],{"class":1195},[1050,3795,3186],{"class":2785},[1050,3797,1660],{"class":1195},[1050,3799,3800],{"class":1052,"line":2330},[1050,3801,3208],{"class":1195},[1050,3803,3804,3806,3809,3811,3813],{"class":1052,"line":2340},[1050,3805,3121],{"class":1643},[1050,3807,3808],{"class":1647},"RunSQL",[1050,3810,1651],{"class":1643},[1050,3812,1654],{"class":1195},[1050,3814,3116],{"class":1195},[1050,3816,3817,3819,3821,3823,3825,3827,3830,3832],{"class":1052,"line":2350},[1050,3818,3135],{"class":1643},[1050,3820,3138],{"class":1647},[1050,3822,1651],{"class":1643},[1050,3824,1654],{"class":1195},[1050,3826,3145],{"class":1643},[1050,3828,3829],{"class":1647},"Executes custom SQL",[1050,3831,1651],{"class":1643},[1050,3833,1660],{"class":1195},[1050,3835,3836,3838,3840,3842,3844,3846,3849,3851],{"class":1052,"line":2355},[1050,3837,3135],{"class":1643},[1050,3839,3159],{"class":1647},[1050,3841,1651],{"class":1643},[1050,3843,1654],{"class":1195},[1050,3845,3145],{"class":1643},[1050,3847,3848],{"class":1647},"Custom SQL",[1050,3850,1651],{"class":1643},[1050,3852,1660],{"class":1195},[1050,3854,3855,3857,3859,3861,3863,3865,3868,3870],{"class":1052,"line":2376},[1050,3856,3135],{"class":1643},[1050,3858,3179],{"class":1647},[1050,3860,1651],{"class":1643},[1050,3862,1654],{"class":1195},[1050,3864,3145],{"class":1643},[1050,3866,3867],{"class":1647},"Depends on implementation",[1050,3869,1651],{"class":1643},[1050,3871,1660],{"class":1195},[1050,3873,3874,3876,3878,3880,3882,3884,3887,3889],{"class":1052,"line":2401},[1050,3875,3135],{"class":1643},[1050,3877,3195],{"class":1647},[1050,3879,1651],{"class":1643},[1050,3881,1654],{"class":1195},[1050,3883,3145],{"class":1643},[1050,3885,3886],{"class":1647},"Depends on SQL",[1050,3888,1651],{"class":1643},[1050,3890,1660],{"class":1195},[1050,3892,3893],{"class":1052,"line":2434},[1050,3894,3208],{"class":1195},[1050,3896,3897,3899,3902,3904,3906],{"class":1052,"line":2456},[1050,3898,3121],{"class":1643},[1050,3900,3901],{"class":1647},"RunPython",[1050,3903,1651],{"class":1643},[1050,3905,1654],{"class":1195},[1050,3907,3116],{"class":1195},[1050,3909,3910,3912,3914,3916,3918,3920,3923,3925],{"class":1052,"line":2461},[1050,3911,3135],{"class":1643},[1050,3913,3138],{"class":1647},[1050,3915,1651],{"class":1643},[1050,3917,1654],{"class":1195},[1050,3919,3145],{"class":1643},[1050,3921,3922],{"class":1647},"Executes Python code",[1050,3924,1651],{"class":1643},[1050,3926,1660],{"class":1195},[1050,3928,3930,3932,3934,3936,3938,3940,3943,3945],{"class":1052,"line":3929},116,[1050,3931,3135],{"class":1643},[1050,3933,3159],{"class":1647},[1050,3935,1651],{"class":1643},[1050,3937,1654],{"class":1195},[1050,3939,3145],{"class":1643},[1050,3941,3942],{"class":1647},"N/A",[1050,3944,1651],{"class":1643},[1050,3946,1660],{"class":1195},[1050,3948,3950,3952,3954,3956,3958,3960,3962,3964],{"class":1052,"line":3949},117,[1050,3951,3135],{"class":1643},[1050,3953,3179],{"class":1647},[1050,3955,1651],{"class":1643},[1050,3957,1654],{"class":1195},[1050,3959,3145],{"class":1643},[1050,3961,3867],{"class":1647},[1050,3963,1651],{"class":1643},[1050,3965,1660],{"class":1195},[1050,3967,3969,3971,3973,3975,3977,3979,3982,3984],{"class":1052,"line":3968},118,[1050,3970,3135],{"class":1643},[1050,3972,3195],{"class":1647},[1050,3974,1651],{"class":1643},[1050,3976,1654],{"class":1195},[1050,3978,3145],{"class":1643},[1050,3980,3981],{"class":1647},"Depends on code",[1050,3983,1651],{"class":1643},[1050,3985,1660],{"class":1195},[1050,3987,3989],{"class":1052,"line":3988},119,[1050,3990,3208],{"class":1195},[1050,3992,3994],{"class":1052,"line":3993},120,[1050,3995,3996],{"class":1195},"    }\n",[1050,3998,4000],{"class":1052,"line":3999},121,[1050,4001,1251],{"class":1191},[1050,4003,4005,4007],{"class":1052,"line":4004},122,[1050,4006,1257],{"class":1195},[1050,4008,1261],{"class":1260},[1050,4010,4012,4014,4017,4019,4021],{"class":1052,"line":4011},123,[1050,4013,1267],{"class":1226},[1050,4015,4016],{"class":1270}," analyze_operation_safety",[1050,4018,1301],{"class":1195},[1050,4020,3025],{"class":1349},[1050,4022,1359],{"class":1195},[1050,4024,4026,4028,4031],{"class":1052,"line":4025},124,[1050,4027,1280],{"class":1082},[1050,4029,4030],{"class":1089},"Analyze the safety of a migration operation",[1050,4032,1083],{"class":1082},[1050,4034,4036],{"class":1052,"line":4035},125,[1050,4037,1477],{"class":1191},[1050,4039,4041,4044,4046,4049,4051,4053,4055],{"class":1052,"line":4040},126,[1050,4042,4043],{"class":1191},"        operation_name ",[1050,4045,1294],{"class":1195},[1050,4047,4048],{"class":1191}," operation",[1050,4050,1196],{"class":1195},[1050,4052,3031],{"class":3030},[1050,4054,1196],{"class":1195},[1050,4056,4057],{"class":3030},"__name__\n",[1050,4059,4061,4064,4066,4068,4070,4073,4075,4077],{"class":1052,"line":4060},127,[1050,4062,4063],{"class":1191},"        operation_info ",[1050,4065,1294],{"class":1195},[1050,4067,3091],{"class":1191},[1050,4069,1196],{"class":1195},[1050,4071,4072],{"class":1521},"operation_types",[1050,4074,1196],{"class":1195},[1050,4076,3066],{"class":1297},[1050,4078,2759],{"class":1195},[1050,4080,4082,4085,4087],{"class":1052,"line":4081},128,[1050,4083,4084],{"class":1297},"            operation_name",[1050,4086,1353],{"class":1195},[1050,4088,4089],{"class":1297}," \n",[1050,4091,4093,4096,4098,4100,4102,4104,4106,4109,4111,4113,4115,4117,4119,4121,4123,4126,4128],{"class":1052,"line":4092},129,[1050,4094,4095],{"class":1195},"            {",[1050,4097,1651],{"class":1643},[1050,4099,3138],{"class":1647},[1050,4101,1651],{"class":1643},[1050,4103,1654],{"class":1195},[1050,4105,3145],{"class":1643},[1050,4107,4108],{"class":1647},"Unknown operation",[1050,4110,1651],{"class":1643},[1050,4112,1353],{"class":1195},[1050,4114,3145],{"class":1643},[1050,4116,3195],{"class":1647},[1050,4118,1651],{"class":1643},[1050,4120,1654],{"class":1195},[1050,4122,3145],{"class":1643},[1050,4124,4125],{"class":1647},"Unknown",[1050,4127,1651],{"class":1643},[1050,4129,4130],{"class":1195},"}\n",[1050,4132,4134],{"class":1052,"line":4133},130,[1050,4135,2804],{"class":1195},[1050,4137,4139],{"class":1052,"line":4138},131,[1050,4140,1477],{"class":1191},[1050,4142,4144,4147,4149],{"class":1052,"line":4143},132,[1050,4145,4146],{"class":1191},"        safety_analysis ",[1050,4148,1294],{"class":1195},[1050,4150,3116],{"class":1195},[1050,4152,4154,4156,4158,4160,4162,4165],{"class":1052,"line":4153},133,[1050,4155,3135],{"class":1643},[1050,4157,3025],{"class":1647},[1050,4159,1651],{"class":1643},[1050,4161,1654],{"class":1195},[1050,4163,4164],{"class":1191}," operation_name",[1050,4166,1660],{"class":1195},[1050,4168,4170,4172,4174,4176,4178,4181,4183,4185,4187,4189],{"class":1052,"line":4169},134,[1050,4171,3135],{"class":1643},[1050,4173,3138],{"class":1647},[1050,4175,1651],{"class":1643},[1050,4177,1654],{"class":1195},[1050,4179,4180],{"class":1191}," operation_info",[1050,4182,1591],{"class":1195},[1050,4184,1651],{"class":1643},[1050,4186,3138],{"class":1647},[1050,4188,1651],{"class":1643},[1050,4190,4191],{"class":1195},"],\n",[1050,4193,4195,4197,4199,4201,4203,4205,4207,4209,4211,4213,4215,4217,4219,4221,4223,4225],{"class":1052,"line":4194},135,[1050,4196,3135],{"class":1643},[1050,4198,3179],{"class":1647},[1050,4200,1651],{"class":1643},[1050,4202,1654],{"class":1195},[1050,4204,4180],{"class":1191},[1050,4206,1196],{"class":1195},[1050,4208,3066],{"class":1297},[1050,4210,1301],{"class":1195},[1050,4212,1651],{"class":1643},[1050,4214,3179],{"class":1647},[1050,4216,1651],{"class":1643},[1050,4218,1353],{"class":1195},[1050,4220,3145],{"class":1643},[1050,4222,4125],{"class":1647},[1050,4224,1651],{"class":1643},[1050,4226,4227],{"class":1195},"),\n",[1050,4229,4231,4233,4235,4237,4239,4241,4243,4245,4247,4249,4251,4253,4255,4257,4259,4261],{"class":1052,"line":4230},136,[1050,4232,3135],{"class":1643},[1050,4234,3195],{"class":1647},[1050,4236,1651],{"class":1643},[1050,4238,1654],{"class":1195},[1050,4240,4180],{"class":1191},[1050,4242,1196],{"class":1195},[1050,4244,3066],{"class":1297},[1050,4246,1301],{"class":1195},[1050,4248,1651],{"class":1643},[1050,4250,3195],{"class":1647},[1050,4252,1651],{"class":1643},[1050,4254,1353],{"class":1195},[1050,4256,3145],{"class":1643},[1050,4258,4125],{"class":1647},[1050,4260,1651],{"class":1643},[1050,4262,4227],{"class":1195},[1050,4264,4266,4268,4271,4273,4275],{"class":1052,"line":4265},137,[1050,4267,3135],{"class":1643},[1050,4269,4270],{"class":1647},"recommendations",[1050,4272,1651],{"class":1643},[1050,4274,1654],{"class":1195},[1050,4276,1549],{"class":1195},[1050,4278,4280],{"class":1052,"line":4279},138,[1050,4281,4282],{"class":1195},"        }\n",[1050,4284,4286],{"class":1052,"line":4285},139,[1050,4287,1477],{"class":1191},[1050,4289,4291],{"class":1052,"line":4290},140,[1050,4292,4293],{"class":1056},"        # Add specific recommendations\n",[1050,4295,4297,4299,4302,4305,4307,4309,4311],{"class":1052,"line":4296},141,[1050,4298,2875],{"class":1187},[1050,4300,4301],{"class":1191}," operation_name ",[1050,4303,4304],{"class":1404},"==",[1050,4306,3145],{"class":1643},[1050,4308,3302],{"class":1647},[1050,4310,1651],{"class":1643},[1050,4312,1234],{"class":1195},[1050,4314,4316,4318,4321,4323,4325,4327,4329,4332,4334,4336,4339,4341,4343,4345,4347,4349,4352,4354,4356,4358,4360,4362,4364,4367],{"class":1052,"line":4315},142,[1050,4317,2226],{"class":1187},[1050,4319,4320],{"class":1796}," hasattr",[1050,4322,1301],{"class":1195},[1050,4324,3025],{"class":1297},[1050,4326,1353],{"class":1195},[1050,4328,3145],{"class":1643},[1050,4330,4331],{"class":1647},"field",[1050,4333,1651],{"class":1643},[1050,4335,1401],{"class":1195},[1050,4337,4338],{"class":1404}," and",[1050,4340,2417],{"class":1404},[1050,4342,4048],{"class":1191},[1050,4344,1196],{"class":1195},[1050,4346,4331],{"class":1521},[1050,4348,1196],{"class":1195},[1050,4350,4351],{"class":1521},"null",[1050,4353,4338],{"class":1404},[1050,4355,2417],{"class":1404},[1050,4357,4048],{"class":1191},[1050,4359,1196],{"class":1195},[1050,4361,4331],{"class":1521},[1050,4363,1196],{"class":1195},[1050,4365,4366],{"class":1521},"default",[1050,4368,1234],{"class":1195},[1050,4370,4372,4375,4377,4379,4381,4383,4385,4387],{"class":1052,"line":4371},143,[1050,4373,4374],{"class":1191},"                safety_analysis",[1050,4376,1591],{"class":1195},[1050,4378,1651],{"class":1643},[1050,4380,3195],{"class":1647},[1050,4382,1651],{"class":1643},[1050,4384,2290],{"class":1195},[1050,4386,1844],{"class":1195},[1050,4388,4389],{"class":2785}," False\n",[1050,4391,4393,4395,4397,4399,4401,4403,4406,4408],{"class":1052,"line":4392},144,[1050,4394,4374],{"class":1191},[1050,4396,1591],{"class":1195},[1050,4398,1651],{"class":1643},[1050,4400,4270],{"class":1647},[1050,4402,1651],{"class":1643},[1050,4404,4405],{"class":1195},"].",[1050,4407,1634],{"class":1297},[1050,4409,2759],{"class":1195},[1050,4411,4413,4415,4418],{"class":1052,"line":4412},145,[1050,4414,1644],{"class":1643},[1050,4416,4417],{"class":1647},"Adding NOT NULL field without default requires existing data handling",[1050,4419,4420],{"class":1643},"'\n",[1050,4422,4424],{"class":1052,"line":4423},146,[1050,4425,4426],{"class":1195},"                )\n",[1050,4428,4430],{"class":1052,"line":4429},147,[1050,4431,1477],{"class":1191},[1050,4433,4435,4438,4440,4442,4444,4446,4448],{"class":1052,"line":4434},148,[1050,4436,4437],{"class":1187},"        elif",[1050,4439,4301],{"class":1191},[1050,4441,4304],{"class":1404},[1050,4443,3145],{"class":1643},[1050,4445,3470],{"class":1647},[1050,4447,1651],{"class":1643},[1050,4449,1234],{"class":1195},[1050,4451,4453,4456,4458,4460,4462,4464,4466,4468],{"class":1052,"line":4452},149,[1050,4454,4455],{"class":1191},"            safety_analysis",[1050,4457,1591],{"class":1195},[1050,4459,1651],{"class":1643},[1050,4461,4270],{"class":1647},[1050,4463,1651],{"class":1643},[1050,4465,4405],{"class":1195},[1050,4467,1634],{"class":1297},[1050,4469,2759],{"class":1195},[1050,4471,4473,4475,4478],{"class":1052,"line":4472},150,[1050,4474,2000],{"class":1643},[1050,4476,4477],{"class":1647},"Review field changes for data compatibility",[1050,4479,4420],{"class":1643},[1050,4481,4483],{"class":1052,"line":4482},151,[1050,4484,4485],{"class":1195},"            )\n",[1050,4487,4489],{"class":1052,"line":4488},152,[1050,4490,1477],{"class":1191},[1050,4492,4494,4496,4498,4500,4503,4505,4507,4509,4511,4513,4515,4517],{"class":1052,"line":4493},153,[1050,4495,4437],{"class":1187},[1050,4497,4301],{"class":1191},[1050,4499,1561],{"class":1404},[1050,4501,4502],{"class":1195}," [",[1050,4504,1651],{"class":1643},[1050,4506,3808],{"class":1647},[1050,4508,1651],{"class":1643},[1050,4510,1353],{"class":1195},[1050,4512,3145],{"class":1643},[1050,4514,3901],{"class":1647},[1050,4516,1651],{"class":1643},[1050,4518,1596],{"class":1195},[1050,4520,4522,4524,4526,4528,4530,4532,4534,4536],{"class":1052,"line":4521},154,[1050,4523,4455],{"class":1191},[1050,4525,1591],{"class":1195},[1050,4527,1651],{"class":1643},[1050,4529,4270],{"class":1647},[1050,4531,1651],{"class":1643},[1050,4533,4405],{"class":1195},[1050,4535,1634],{"class":1297},[1050,4537,2759],{"class":1195},[1050,4539,4541,4543,4546],{"class":1052,"line":4540},155,[1050,4542,2000],{"class":1643},[1050,4544,4545],{"class":1647},"Custom operations require manual review for safety",[1050,4547,4420],{"class":1643},[1050,4549,4551],{"class":1052,"line":4550},156,[1050,4552,4485],{"class":1195},[1050,4554,4556],{"class":1052,"line":4555},157,[1050,4557,1477],{"class":1191},[1050,4559,4561,4563],{"class":1052,"line":4560},158,[1050,4562,1313],{"class":1187},[1050,4564,4565],{"class":1191}," safety_analysis\n",[1050,4567,4569],{"class":1052,"line":4568},159,[1050,4570,1070],{"emptyLinePlaceholder":1069},[1050,4572,4574],{"class":1052,"line":4573},160,[1050,4575,4576],{"class":1056},"# Migration execution process\n",[1050,4578,4580,4582,4585],{"class":1052,"line":4579},161,[1050,4581,1227],{"class":1226},[1050,4583,4584],{"class":1230}," MigrationExecutionAnalyzer",[1050,4586,1234],{"class":1195},[1050,4588,4590,4592,4595],{"class":1052,"line":4589},162,[1050,4591,1240],{"class":1082},[1050,4593,4594],{"class":1089},"Analyze how migrations are executed",[1050,4596,1083],{"class":1082},[1050,4598,4600],{"class":1052,"line":4599},163,[1050,4601,1251],{"class":1191},[1050,4603,4605,4607],{"class":1052,"line":4604},164,[1050,4606,1257],{"class":1195},[1050,4608,1261],{"class":1260},[1050,4610,4612,4614,4617,4619,4621,4623,4625],{"class":1052,"line":4611},165,[1050,4613,1267],{"class":1226},[1050,4615,4616],{"class":1270}," trace_migration_execution",[1050,4618,1301],{"class":1195},[1050,4620,1350],{"class":1349},[1050,4622,1353],{"class":1195},[1050,4624,1356],{"class":1349},[1050,4626,1359],{"class":1195},[1050,4628,4630,4632,4635],{"class":1052,"line":4629},166,[1050,4631,1280],{"class":1082},[1050,4633,4634],{"class":1089},"Trace the execution of a specific migration",[1050,4636,1083],{"class":1082},[1050,4638,4640],{"class":1052,"line":4639},167,[1050,4641,1477],{"class":1191},[1050,4643,4645,4647,4649,4651,4653,4655,4657,4659,4661,4663],{"class":1052,"line":4644},168,[1050,4646,1451],{"class":1187},[1050,4648,1192],{"class":1191},[1050,4650,1196],{"class":1195},[1050,4652,1199],{"class":1191},[1050,4654,1196],{"class":1195},[1050,4656,1204],{"class":1191},[1050,4658,1196],{"class":1195},[1050,4660,1466],{"class":1191},[1050,4662,1212],{"class":1187},[1050,4664,1471],{"class":1191},[1050,4666,4668,4670,4672,4674,4676,4678,4680,4682,4684,4686],{"class":1052,"line":4667},169,[1050,4669,1451],{"class":1187},[1050,4671,1192],{"class":1191},[1050,4673,1196],{"class":1195},[1050,4675,1199],{"class":1191},[1050,4677,1196],{"class":1195},[1050,4679,1204],{"class":1191},[1050,4681,1196],{"class":1195},[1050,4683,1825],{"class":1191},[1050,4685,1212],{"class":1187},[1050,4687,1830],{"class":1191},[1050,4689,4691],{"class":1052,"line":4690},170,[1050,4692,1477],{"class":1191},[1050,4694,4696],{"class":1052,"line":4695},171,[1050,4697,4698],{"class":1056},"        # Load migration\n",[1050,4700,4702,4704,4706,4708,4710,4712],{"class":1052,"line":4701},172,[1050,4703,2634],{"class":1191},[1050,4705,1294],{"class":1195},[1050,4707,1847],{"class":1297},[1050,4709,1301],{"class":1195},[1050,4711,1304],{"class":1297},[1050,4713,1307],{"class":1195},[1050,4715,4717,4720,4722,4724,4726,4729,4731,4733,4735,4737],{"class":1052,"line":4716},173,[1050,4718,4719],{"class":1191},"        migration ",[1050,4721,1294],{"class":1195},[1050,4723,2663],{"class":1191},[1050,4725,1196],{"class":1195},[1050,4727,4728],{"class":1297},"get_migration",[1050,4730,1301],{"class":1195},[1050,4732,1350],{"class":1297},[1050,4734,1353],{"class":1195},[1050,4736,1356],{"class":1297},[1050,4738,1307],{"class":1195},[1050,4740,4742],{"class":1052,"line":4741},174,[1050,4743,1477],{"class":1191},[1050,4745,4747],{"class":1052,"line":4746},175,[1050,4748,4749],{"class":1056},"        # Analyze operations\n",[1050,4751,4753,4756,4758],{"class":1052,"line":4752},176,[1050,4754,4755],{"class":1191},"        execution_plan ",[1050,4757,1294],{"class":1195},[1050,4759,1549],{"class":1195},[1050,4761,4763],{"class":1052,"line":4762},177,[1050,4764,1477],{"class":1191},[1050,4766,4768,4770,4772,4774,4776,4778,4780],{"class":1052,"line":4767},178,[1050,4769,1555],{"class":1187},[1050,4771,2997],{"class":1191},[1050,4773,1561],{"class":1187},[1050,4775,1727],{"class":1191},[1050,4777,1196],{"class":1195},[1050,4779,3006],{"class":1521},[1050,4781,1234],{"class":1195},[1050,4783,4785,4788,4790],{"class":1052,"line":4784},179,[1050,4786,4787],{"class":1191},"            operation_analysis ",[1050,4789,1294],{"class":1195},[1050,4791,3116],{"class":1195},[1050,4793,4795,4797,4799,4801,4803,4805,4807,4809,4811,4813],{"class":1052,"line":4794},180,[1050,4796,2000],{"class":1643},[1050,4798,3025],{"class":1647},[1050,4800,1651],{"class":1643},[1050,4802,1654],{"class":1195},[1050,4804,4048],{"class":1191},[1050,4806,1196],{"class":1195},[1050,4808,3031],{"class":3030},[1050,4810,1196],{"class":1195},[1050,4812,3036],{"class":3030},[1050,4814,1660],{"class":1195},[1050,4816,4818,4820,4822,4824,4826,4829,4831,4833],{"class":1052,"line":4817},181,[1050,4819,2000],{"class":1643},[1050,4821,3138],{"class":1647},[1050,4823,1651],{"class":1643},[1050,4825,1654],{"class":1195},[1050,4827,4828],{"class":1260}," str",[1050,4830,1301],{"class":1195},[1050,4832,3025],{"class":1297},[1050,4834,4227],{"class":1195},[1050,4836,4838,4840,4843,4845,4847,4850],{"class":1052,"line":4837},182,[1050,4839,2000],{"class":1643},[1050,4841,4842],{"class":1647},"estimated_sql",[1050,4844,1651],{"class":1643},[1050,4846,1654],{"class":1195},[1050,4848,4849],{"class":2785}," None",[1050,4851,1660],{"class":1195},[1050,4853,4855,4857,4859,4861,4863,4866,4868,4870,4872,4874,4876,4878,4880],{"class":1052,"line":4854},183,[1050,4856,2000],{"class":1643},[1050,4858,1720],{"class":1647},[1050,4860,1651],{"class":1643},[1050,4862,1654],{"class":1195},[1050,4864,4865],{"class":1796}," getattr",[1050,4867,1301],{"class":1195},[1050,4869,3025],{"class":1297},[1050,4871,1353],{"class":1195},[1050,4873,3145],{"class":1643},[1050,4875,1720],{"class":1647},[1050,4877,1651],{"class":1643},[1050,4879,1353],{"class":1195},[1050,4881,4882],{"class":1195}," []),\n",[1050,4884,4886],{"class":1052,"line":4885},184,[1050,4887,2084],{"class":1195},[1050,4889,4891],{"class":1052,"line":4890},185,[1050,4892,2189],{"class":1191},[1050,4894,4896],{"class":1052,"line":4895},186,[1050,4897,4898],{"class":1056},"            # Try to get SQL representation\n",[1050,4900,4902,4905],{"class":1052,"line":4901},187,[1050,4903,4904],{"class":1187},"            try",[1050,4906,1234],{"class":1195},[1050,4908,4910],{"class":1052,"line":4909},188,[1050,4911,4912],{"class":1056},"                # Create a schema editor to generate SQL\n",[1050,4914,4916,4919,4922,4924,4927,4930,4933,4936],{"class":1052,"line":4915},189,[1050,4917,4918],{"class":1187},"                with",[1050,4920,4921],{"class":1191}," connection",[1050,4923,1196],{"class":1195},[1050,4925,4926],{"class":1297},"schema_editor",[1050,4928,4929],{"class":1195},"()",[1050,4931,4932],{"class":1187}," as",[1050,4934,4935],{"class":1191}," schema_editor",[1050,4937,1234],{"class":1195},[1050,4939,4941,4944,4946,4948,4950,4952,4954,4957,4959],{"class":1052,"line":4940},190,[1050,4942,4943],{"class":1187},"                    if",[1050,4945,4320],{"class":1796},[1050,4947,1301],{"class":1195},[1050,4949,3025],{"class":1297},[1050,4951,1353],{"class":1195},[1050,4953,3145],{"class":1643},[1050,4955,4956],{"class":1647},"database_forwards",[1050,4958,1651],{"class":1643},[1050,4960,1359],{"class":1195},[1050,4962,4964],{"class":1052,"line":4963},191,[1050,4965,4966],{"class":1056},"                        # This is a simplified approach - actual SQL generation\n",[1050,4968,4970],{"class":1052,"line":4969},192,[1050,4971,4972],{"class":1056},"                        # requires more context\n",[1050,4974,4976,4979,4981,4983,4986,4988,4990,4992],{"class":1052,"line":4975},193,[1050,4977,4978],{"class":1191},"                        operation_analysis",[1050,4980,1591],{"class":1195},[1050,4982,1651],{"class":1643},[1050,4984,4985],{"class":1647},"has_sql",[1050,4987,1651],{"class":1643},[1050,4989,2290],{"class":1195},[1050,4991,1844],{"class":1195},[1050,4993,4994],{"class":2785}," True\n",[1050,4996,4998,5001],{"class":1052,"line":4997},194,[1050,4999,5000],{"class":1187},"                    else",[1050,5002,1234],{"class":1195},[1050,5004,5006,5008,5010,5012,5014,5016,5018,5020],{"class":1052,"line":5005},195,[1050,5007,4978],{"class":1191},[1050,5009,1591],{"class":1195},[1050,5011,1651],{"class":1643},[1050,5013,4985],{"class":1647},[1050,5015,1651],{"class":1643},[1050,5017,2290],{"class":1195},[1050,5019,1844],{"class":1195},[1050,5021,4389],{"class":2785},[1050,5023,5025,5028],{"class":1052,"line":5024},196,[1050,5026,5027],{"class":1187},"            except",[1050,5029,1234],{"class":1195},[1050,5031,5033,5036,5038,5040,5042,5044,5046,5048,5050,5052],{"class":1052,"line":5032},197,[1050,5034,5035],{"class":1191},"                operation_analysis",[1050,5037,1591],{"class":1195},[1050,5039,1651],{"class":1643},[1050,5041,4985],{"class":1647},[1050,5043,1651],{"class":1643},[1050,5045,2290],{"class":1195},[1050,5047,1844],{"class":1195},[1050,5049,3145],{"class":1643},[1050,5051,4125],{"class":1647},[1050,5053,4420],{"class":1643},[1050,5055,5057],{"class":1052,"line":5056},198,[1050,5058,2189],{"class":1191},[1050,5060,5062,5065,5067,5069,5071,5074],{"class":1052,"line":5061},199,[1050,5063,5064],{"class":1191},"            execution_plan",[1050,5066,1196],{"class":1195},[1050,5068,1634],{"class":1297},[1050,5070,1301],{"class":1195},[1050,5072,5073],{"class":1297},"operation_analysis",[1050,5075,1307],{"class":1195},[1050,5077,5079],{"class":1052,"line":5078},200,[1050,5080,1477],{"class":1191},[1050,5082,5084,5086],{"class":1052,"line":5083},201,[1050,5085,1313],{"class":1187},[1050,5087,3116],{"class":1195},[1050,5089,5091,5093,5095,5097,5099,5101,5103,5105,5107,5109,5111,5113,5115,5117,5119],{"class":1052,"line":5090},202,[1050,5092,3135],{"class":1643},[1050,5094,2003],{"class":1647},[1050,5096,1651],{"class":1643},[1050,5098,1654],{"class":1195},[1050,5100,2010],{"class":1226},[1050,5102,2013],{"class":1647},[1050,5104,2017],{"class":2016},[1050,5106,1350],{"class":1191},[1050,5108,2026],{"class":2016},[1050,5110,1196],{"class":1647},[1050,5112,2017],{"class":2016},[1050,5114,1620],{"class":1191},[1050,5116,2026],{"class":2016},[1050,5118,2013],{"class":1647},[1050,5120,1660],{"class":1195},[1050,5122,5124,5126,5128,5130,5132,5134,5136,5138],{"class":1052,"line":5123},203,[1050,5125,3135],{"class":1643},[1050,5127,1720],{"class":1647},[1050,5129,1651],{"class":1643},[1050,5131,1654],{"class":1195},[1050,5133,1727],{"class":1191},[1050,5135,1196],{"class":1195},[1050,5137,1720],{"class":1521},[1050,5139,1660],{"class":1195},[1050,5141,5143,5145,5147,5149,5151,5154],{"class":1052,"line":5142},204,[1050,5144,3135],{"class":1643},[1050,5146,3006],{"class":1647},[1050,5148,1651],{"class":1643},[1050,5150,1654],{"class":1195},[1050,5152,5153],{"class":1191}," execution_plan",[1050,5155,1660],{"class":1195},[1050,5157,5159,5161,5164,5166,5168,5170,5172,5174,5176,5178,5180,5182,5184,5186],{"class":1052,"line":5158},205,[1050,5160,3135],{"class":1643},[1050,5162,5163],{"class":1647},"atomic",[1050,5165,1651],{"class":1643},[1050,5167,1654],{"class":1195},[1050,5169,4865],{"class":1796},[1050,5171,1301],{"class":1195},[1050,5173,2003],{"class":1297},[1050,5175,1353],{"class":1195},[1050,5177,3145],{"class":1643},[1050,5179,5163],{"class":1647},[1050,5181,1651],{"class":1643},[1050,5183,1353],{"class":1195},[1050,5185,3186],{"class":2785},[1050,5187,4227],{"class":1195},[1050,5189,5191],{"class":1052,"line":5190},206,[1050,5192,4282],{"class":1195},[1050,5194,5196],{"class":1052,"line":5195},207,[1050,5197,1251],{"class":1191},[1050,5199,5201,5203],{"class":1052,"line":5200},208,[1050,5202,1257],{"class":1195},[1050,5204,1261],{"class":1260},[1050,5206,5208,5210,5213,5215,5217,5219,5221],{"class":1052,"line":5207},209,[1050,5209,1267],{"class":1226},[1050,5211,5212],{"class":1270}," simulate_migration_rollback",[1050,5214,1301],{"class":1195},[1050,5216,1350],{"class":1349},[1050,5218,1353],{"class":1195},[1050,5220,1356],{"class":1349},[1050,5222,1359],{"class":1195},[1050,5224,5226,5228,5231],{"class":1052,"line":5225},210,[1050,5227,1280],{"class":1082},[1050,5229,5230],{"class":1089},"Simulate rolling back a migration",[1050,5232,1083],{"class":1082},[1050,5234,5236],{"class":1052,"line":5235},211,[1050,5237,1477],{"class":1191},[1050,5239,5241,5243,5245,5247,5249,5251,5253,5255,5257,5259],{"class":1052,"line":5240},212,[1050,5242,1451],{"class":1187},[1050,5244,1192],{"class":1191},[1050,5246,1196],{"class":1195},[1050,5248,1199],{"class":1191},[1050,5250,1196],{"class":1195},[1050,5252,1204],{"class":1191},[1050,5254,1196],{"class":1195},[1050,5256,1825],{"class":1191},[1050,5258,1212],{"class":1187},[1050,5260,1830],{"class":1191},[1050,5262,5264],{"class":1052,"line":5263},213,[1050,5265,1477],{"class":1191},[1050,5267,5269,5271,5273,5275,5277,5279],{"class":1052,"line":5268},214,[1050,5270,2634],{"class":1191},[1050,5272,1294],{"class":1195},[1050,5274,1847],{"class":1297},[1050,5276,1301],{"class":1195},[1050,5278,1304],{"class":1297},[1050,5280,1307],{"class":1195},[1050,5282,5284,5286,5288,5290,5292,5294,5296,5298,5300,5302],{"class":1052,"line":5283},215,[1050,5285,4719],{"class":1191},[1050,5287,1294],{"class":1195},[1050,5289,2663],{"class":1191},[1050,5291,1196],{"class":1195},[1050,5293,4728],{"class":1297},[1050,5295,1301],{"class":1195},[1050,5297,1350],{"class":1297},[1050,5299,1353],{"class":1195},[1050,5301,1356],{"class":1297},[1050,5303,1307],{"class":1195},[1050,5305,5307],{"class":1052,"line":5306},216,[1050,5308,1477],{"class":1191},[1050,5310,5312,5315,5317],{"class":1052,"line":5311},217,[1050,5313,5314],{"class":1191},"        rollback_plan ",[1050,5316,1294],{"class":1195},[1050,5318,1549],{"class":1195},[1050,5320,5322],{"class":1052,"line":5321},218,[1050,5323,1477],{"class":1191},[1050,5325,5327],{"class":1052,"line":5326},219,[1050,5328,5329],{"class":1056},"        # Operations are applied in reverse order for rollback\n",[1050,5331,5333,5335,5337,5339,5342,5344,5346,5348,5350],{"class":1052,"line":5332},220,[1050,5334,1555],{"class":1187},[1050,5336,2997],{"class":1191},[1050,5338,1561],{"class":1187},[1050,5340,5341],{"class":1796}," reversed",[1050,5343,1301],{"class":1195},[1050,5345,2003],{"class":1297},[1050,5347,1196],{"class":1195},[1050,5349,3006],{"class":1521},[1050,5351,1359],{"class":1195},[1050,5353,5355,5358,5360],{"class":1052,"line":5354},221,[1050,5356,5357],{"class":1191},"            rollback_info ",[1050,5359,1294],{"class":1195},[1050,5361,3116],{"class":1195},[1050,5363,5365,5367,5369,5371,5373,5375,5377,5379,5381,5383],{"class":1052,"line":5364},222,[1050,5366,2000],{"class":1643},[1050,5368,3025],{"class":1647},[1050,5370,1651],{"class":1643},[1050,5372,1654],{"class":1195},[1050,5374,4048],{"class":1191},[1050,5376,1196],{"class":1195},[1050,5378,3031],{"class":3030},[1050,5380,1196],{"class":1195},[1050,5382,3036],{"class":3030},[1050,5384,1660],{"class":1195},[1050,5386,5388,5390,5392,5394,5396,5398,5400,5402,5404,5406,5409,5411],{"class":1052,"line":5387},223,[1050,5389,2000],{"class":1643},[1050,5391,3179],{"class":1647},[1050,5393,1651],{"class":1643},[1050,5395,1654],{"class":1195},[1050,5397,4320],{"class":1796},[1050,5399,1301],{"class":1195},[1050,5401,3025],{"class":1297},[1050,5403,1353],{"class":1195},[1050,5405,3145],{"class":1643},[1050,5407,5408],{"class":1647},"database_backwards",[1050,5410,1651],{"class":1643},[1050,5412,4227],{"class":1195},[1050,5414,5416,5418,5420,5422,5424,5426,5428,5430],{"class":1052,"line":5415},224,[1050,5417,2000],{"class":1643},[1050,5419,3138],{"class":1647},[1050,5421,1651],{"class":1643},[1050,5423,1654],{"class":1195},[1050,5425,4828],{"class":1260},[1050,5427,1301],{"class":1195},[1050,5429,3025],{"class":1297},[1050,5431,4227],{"class":1195},[1050,5433,5435],{"class":1052,"line":5434},225,[1050,5436,2084],{"class":1195},[1050,5438,5440],{"class":1052,"line":5439},226,[1050,5441,2189],{"class":1191},[1050,5443,5445],{"class":1052,"line":5444},227,[1050,5446,5447],{"class":1056},"            # Check if operation is reversible\n",[1050,5449,5451,5453,5455,5457,5459,5461,5463,5465,5467,5469,5471,5473,5475,5477,5479],{"class":1052,"line":5450},228,[1050,5452,2226],{"class":1187},[1050,5454,4320],{"class":1796},[1050,5456,1301],{"class":1195},[1050,5458,3025],{"class":1297},[1050,5460,1353],{"class":1195},[1050,5462,3145],{"class":1643},[1050,5464,3179],{"class":1647},[1050,5466,1651],{"class":1643},[1050,5468,1401],{"class":1195},[1050,5470,4338],{"class":1404},[1050,5472,2417],{"class":1404},[1050,5474,4048],{"class":1191},[1050,5476,1196],{"class":1195},[1050,5478,3179],{"class":1521},[1050,5480,1234],{"class":1195},[1050,5482,5484,5487,5489,5491,5494,5496,5498,5500,5502,5505],{"class":1052,"line":5483},229,[1050,5485,5486],{"class":1191},"                rollback_info",[1050,5488,1591],{"class":1195},[1050,5490,1651],{"class":1643},[1050,5492,5493],{"class":1647},"warning",[1050,5495,1651],{"class":1643},[1050,5497,2290],{"class":1195},[1050,5499,1844],{"class":1195},[1050,5501,3145],{"class":1643},[1050,5503,5504],{"class":1647},"This operation is not reversible",[1050,5506,4420],{"class":1643},[1050,5508,5510],{"class":1052,"line":5509},230,[1050,5511,2189],{"class":1191},[1050,5513,5515,5518,5520,5522,5524,5527],{"class":1052,"line":5514},231,[1050,5516,5517],{"class":1191},"            rollback_plan",[1050,5519,1196],{"class":1195},[1050,5521,1634],{"class":1297},[1050,5523,1301],{"class":1195},[1050,5525,5526],{"class":1297},"rollback_info",[1050,5528,1307],{"class":1195},[1050,5530,5532],{"class":1052,"line":5531},232,[1050,5533,1477],{"class":1191},[1050,5535,5537,5539],{"class":1052,"line":5536},233,[1050,5538,1313],{"class":1187},[1050,5540,3116],{"class":1195},[1050,5542,5544,5546,5548,5550,5552,5554,5556,5558,5560,5562,5564,5566,5568,5570,5572],{"class":1052,"line":5543},234,[1050,5545,3135],{"class":1643},[1050,5547,2003],{"class":1647},[1050,5549,1651],{"class":1643},[1050,5551,1654],{"class":1195},[1050,5553,2010],{"class":1226},[1050,5555,2013],{"class":1647},[1050,5557,2017],{"class":2016},[1050,5559,1350],{"class":1191},[1050,5561,2026],{"class":2016},[1050,5563,1196],{"class":1647},[1050,5565,2017],{"class":2016},[1050,5567,1620],{"class":1191},[1050,5569,2026],{"class":2016},[1050,5571,2013],{"class":1647},[1050,5573,1660],{"class":1195},[1050,5575,5577,5579,5582,5584,5586,5589],{"class":1052,"line":5576},235,[1050,5578,3135],{"class":1643},[1050,5580,5581],{"class":1647},"rollback_operations",[1050,5583,1651],{"class":1643},[1050,5585,1654],{"class":1195},[1050,5587,5588],{"class":1191}," rollback_plan",[1050,5590,1660],{"class":1195},[1050,5592,5594,5596,5599,5601,5603,5606,5608,5611,5613,5615,5617,5619,5621,5624,5627,5629,5631],{"class":1052,"line":5593},236,[1050,5595,3135],{"class":1643},[1050,5597,5598],{"class":1647},"safe_to_rollback",[1050,5600,1651],{"class":1643},[1050,5602,1654],{"class":1195},[1050,5604,5605],{"class":1796}," all",[1050,5607,1301],{"class":1195},[1050,5609,5610],{"class":1297},"op",[1050,5612,1591],{"class":1195},[1050,5614,1651],{"class":1643},[1050,5616,3179],{"class":1647},[1050,5618,1651],{"class":1643},[1050,5620,2290],{"class":1195},[1050,5622,5623],{"class":1187}," for",[1050,5625,5626],{"class":1297}," op ",[1050,5628,1561],{"class":1187},[1050,5630,5588],{"class":1297},[1050,5632,4227],{"class":1195},[1050,5634,5636],{"class":1052,"line":5635},237,[1050,5637,4282],{"class":1195},[1030,5639,5641],{"id":5640},"migration-state-management","Migration State Management",[1035,5643,5645],{"id":5644},"project-state-and-schema-evolution","Project State and Schema Evolution",[1040,5647,5649],{"className":1042,"code":5648,"language":1044,"meta":1045,"style":1045},"from django.db.migrations.state import ProjectState, ModelState\n\nclass ProjectStateManager:\n    \"\"\"Manage and analyze project state evolution\"\"\"\n    \n    def __init__(self):\n        from django.db.migrations.loader import MigrationLoader\n        self.loader = MigrationLoader(connection)\n    \n    def get_state_at_migration(self, app_label, migration_name):\n        \"\"\"Get project state at a specific migration\"\"\"\n        \n        # Build state up to the specified migration\n        target = (app_label, migration_name)\n        state = self.loader.project_state(target)\n        \n        return state\n    \n    def compare_states(self, state1, state2):\n        \"\"\"Compare two project states\"\"\"\n        \n        differences = {\n            'added_models': [],\n            'removed_models': [],\n            'modified_models': [],\n        }\n        \n        # Get model keys from both states\n        models1 = set(state1.models.keys())\n        models2 = set(state2.models.keys())\n        \n        # Find added and removed models\n        differences['added_models'] = list(models2 - models1)\n        differences['removed_models'] = list(models1 - models2)\n        \n        # Find modified models\n        common_models = models1 & models2\n        for model_key in common_models:\n            model1 = state1.models[model_key]\n            model2 = state2.models[model_key]\n            \n            if self._models_differ(model1, model2):\n                differences['modified_models'].append({\n                    'model': model_key,\n                    'changes': self._get_model_changes(model1, model2)\n                })\n        \n        return differences\n    \n    def _models_differ(self, model1, model2):\n        \"\"\"Check if two model states differ\"\"\"\n        \n        # Compare fields\n        if set(model1.fields.keys()) != set(model2.fields.keys()):\n            return True\n        \n        # Compare field definitions\n        for field_name in model1.fields:\n            if field_name in model2.fields:\n                field1 = model1.fields[field_name]\n                field2 = model2.fields[field_name]\n                \n                # Compare field types and attributes\n                if (field1.__class__ != field2.__class__ or\n                    field1.max_length != field2.max_length or\n                    field1.null != field2.null or\n                    field1.blank != field2.blank):\n                    return True\n        \n        # Compare options\n        if model1.options != model2.options:\n            return True\n        \n        return False\n    \n    def _get_model_changes(self, model1, model2):\n        \"\"\"Get detailed changes between two model states\"\"\"\n        \n        changes = {\n            'added_fields': [],\n            'removed_fields': [],\n            'modified_fields': [],\n            'option_changes': {},\n        }\n        \n        # Field changes\n        fields1 = set(model1.fields.keys())\n        fields2 = set(model2.fields.keys())\n        \n        changes['added_fields'] = list(fields2 - fields1)\n        changes['removed_fields'] = list(fields1 - fields2)\n        \n        # Modified fields\n        common_fields = fields1 & fields2\n        for field_name in common_fields:\n            field1 = model1.fields[field_name]\n            field2 = model2.fields[field_name]\n            \n            field_changes = []\n            \n            if field1.__class__ != field2.__class__:\n                field_changes.append(f'Type: {field1.__class__.__name__} -> {field2.__class__.__name__}')\n            \n            if getattr(field1, 'max_length', None) != getattr(field2, 'max_length', None):\n                field_changes.append(f'Max length: {field1.max_length} -> {field2.max_length}')\n            \n            if field1.null != field2.null:\n                field_changes.append(f'Null: {field1.null} -> {field2.null}')\n            \n            if field_changes:\n                changes['modified_fields'].append({\n                    'field': field_name,\n                    'changes': field_changes\n                })\n        \n        # Option changes\n        for option, value1 in model1.options.items():\n            value2 = model2.options.get(option)\n            if value1 != value2:\n                changes['option_changes'][option] = {\n                    'from': value1,\n                    'to': value2\n                }\n        \n        return changes\n    \n    def get_migration_timeline(self, app_label):\n        \"\"\"Get timeline of migrations for an app\"\"\"\n        \n        timeline = []\n        \n        # Get all migrations for the app\n        app_migrations = []\n        for migration_key in self.loader.graph.nodes:\n            if migration_key[0] == app_label:\n                app_migrations.append(migration_key)\n        \n        # Sort by migration order\n        app_migrations.sort(key=lambda x: x[1])\n        \n        # Build timeline with state at each migration\n        previous_state = None\n        \n        for migration_key in app_migrations:\n            current_state = self.get_state_at_migration(*migration_key)\n            \n            timeline_entry = {\n                'migration': f\"{migration_key[0]}.{migration_key[1]}\",\n                'timestamp': None,  # Would need to get from migration recorder\n            }\n            \n            if previous_state:\n                timeline_entry['changes'] = self.compare_states(previous_state, current_state)\n            else:\n                timeline_entry['changes'] = {'initial': True}\n            \n            timeline.append(timeline_entry)\n            previous_state = current_state\n        \n        return timeline\n\n# Schema editor integration\nclass SchemaEditorAnalyzer:\n    \"\"\"Analyze how schema editor generates SQL\"\"\"\n    \n    @staticmethod\n    def analyze_sql_generation(operation, model_state=None):\n        \"\"\"Analyze SQL generation for an operation\"\"\"\n        \n        sql_info = {\n            'operation': operation.__class__.__name__,\n            'sql_statements': [],\n            'database_vendor': connection.vendor,\n        }\n        \n        try:\n            with connection.schema_editor() as schema_editor:\n                # Capture SQL statements\n                original_execute = schema_editor.execute\n                captured_sql = []\n                \n                def capture_sql(sql, params=()):\n                    captured_sql.append({\n                        'sql': sql,\n                        'params': params\n                    })\n                    return original_execute(sql, params)\n                \n                schema_editor.execute = capture_sql\n                \n                # Execute operation (in dry-run mode)\n                try:\n                    if hasattr(operation, 'database_forwards'):\n                        # This would need proper state setup for real execution\n                        pass\n                except Exception as e:\n                    sql_info['error'] = str(e)\n                \n                sql_info['sql_statements'] = captured_sql\n        \n        except Exception as e:\n            sql_info['error'] = f\"Could not analyze SQL generation: {e}\"\n        \n        return sql_info\n    \n    @staticmethod\n    def get_database_specific_features():\n        \"\"\"Get database-specific migration features\"\"\"\n        \n        features = {\n            'vendor': connection.vendor,\n            'supports_transactions': connection.features.supports_transactions,\n            'supports_atomic_references_rename': connection.features.supports_atomic_references_rename,\n            'supports_foreign_keys': connection.features.supports_foreign_keys,\n            'supports_check_constraints': connection.features.supports_check_constraints,\n            'supports_partial_indexes': connection.features.supports_partial_indexes,\n            'supports_functions_in_partial_indexes': connection.features.supports_functions_in_partial_indexes,\n            'supports_expression_indexes': connection.features.supports_expression_indexes,\n            'supports_timezones': connection.features.supports_timezones,\n        }\n        \n        # Add vendor-specific features\n        if connection.vendor == 'postgresql':\n            features.update({\n                'supports_concurrent_index_creation': True,\n                'supports_gin_indexes': True,\n                'supports_jsonb': True,\n                'supports_arrays': True,\n            })\n        elif connection.vendor == 'mysql':\n            features.update({\n                'supports_fulltext_indexes': True,\n                'supports_spatial_indexes': True,\n            })\n        elif connection.vendor == 'sqlite':\n            features.update({\n                'supports_fts': True,\n                'limited_alter_table': True,\n            })\n        \n        return features\n\n# Migration optimization analyzer\nclass MigrationOptimizationAnalyzer:\n    \"\"\"Analyze migrations for optimization opportunities\"\"\"\n    \n    @staticmethod\n    def analyze_migration_performance(migration):\n        \"\"\"Analyze migration for performance issues\"\"\"\n        \n        analysis = {\n            'migration': f\"{migration.app_label}.{migration.name}\",\n            'performance_concerns': [],\n            'optimization_suggestions': [],\n            'estimated_impact': 'low',\n        }\n        \n        for operation in migration.operations:\n            operation_name = operation.__class__.__name__\n            \n            # Analyze specific operations\n            if operation_name == 'AddField':\n                if hasattr(operation, 'field'):\n                    field = operation.field\n                    \n                    # Check for potentially slow operations\n                    if hasattr(field, 'db_index') and field.db_index:\n                        analysis['performance_concerns'].append(\n                            f\"Adding indexed field '{operation.name}' may be slow on large tables\"\n                        )\n                        analysis['optimization_suggestions'].append(\n                            \"Consider creating index separately with CREATE INDEX CONCURRENTLY\"\n                        )\n                    \n                    if not field.null and not hasattr(field, 'default'):\n                        analysis['performance_concerns'].append(\n                            f\"Adding NOT NULL field '{operation.name}' without default may lock table\"\n                        )\n                        analysis['optimization_suggestions'].append(\n                            \"Add field as nullable first, populate data, then make NOT NULL\"\n                        )\n            \n            elif operation_name == 'AlterField':\n                analysis['performance_concerns'].append(\n                    f\"Altering field '{operation.name}' may require table rewrite\"\n                )\n                analysis['optimization_suggestions'].append(\n                    \"Test on production-sized dataset to estimate impact\"\n                )\n            \n            elif operation_name == 'RunPython':\n                analysis['performance_concerns'].append(\n                    \"Custom Python code may be slow on large datasets\"\n                )\n                analysis['optimization_suggestions'].append(\n                    \"Consider using bulk operations or raw SQL for better performance\"\n                )\n        \n        # Estimate overall impact\n        if len(analysis['performance_concerns']) > 2:\n            analysis['estimated_impact'] = 'high'\n        elif len(analysis['performance_concerns']) > 0:\n            analysis['estimated_impact'] = 'medium'\n        \n        return analysis\n    \n    @staticmethod\n    def suggest_migration_splitting(migration):\n        \"\"\"Suggest how to split a large migration\"\"\"\n        \n        suggestions = {\n            'migration': f\"{migration.app_label}.{migration.name}\",\n            'should_split': False,\n            'split_suggestions': [],\n        }\n        \n        if len(migration.operations) > 5:\n            suggestions['should_split'] = True\n            \n            # Group operations by type\n            operation_groups = {}\n            for i, operation in enumerate(migration.operations):\n                op_type = operation.__class__.__name__\n                if op_type not in operation_groups:\n                    operation_groups[op_type] = []\n                operation_groups[op_type].append((i, operation))\n            \n            # Suggest splits\n            for op_type, operations in operation_groups.items():\n                if len(operations) > 1:\n                    suggestions['split_suggestions'].append(\n                        f\"Group {len(operations)} {op_type} operations into separate migration\"\n                    )\n        \n        return suggestions\n",[1047,5650,5651,5678,5682,5691,5700,5704,5716,5738,5756,5760,5781,5790,5794,5799,5816,5840,5844,5851,5855,5878,5887,5891,5900,5914,5927,5940,5944,5948,5953,5981,6005,6009,6014,6047,6077,6081,6086,6102,6116,6136,6155,6159,6182,6201,6217,6244,6248,6252,6259,6263,6285,6294,6298,6303,6346,6353,6357,6362,6379,6395,6415,6434,6438,6443,6468,6488,6506,6525,6532,6536,6541,6562,6568,6572,6578,6582,6603,6612,6616,6624,6637,6650,6663,6677,6681,6685,6690,6713,6736,6740,6771,6801,6805,6810,6825,6838,6857,6876,6880,6889,6893,6914,6966,6970,7016,7057,7061,7081,7122,7126,7135,7154,7169,7182,7186,7190,7195,7222,7246,7260,7282,7297,7311,7316,7320,7326,7330,7347,7356,7360,7369,7373,7378,7387,7412,7433,7449,7453,7458,7493,7497,7502,7512,7516,7529,7552,7556,7565,7609,7627,7631,7635,7644,7680,7687,7719,7723,7739,7749,7753,7760,7764,7769,7778,7787,7791,7797,7819,7828,7832,7841,7863,7876,7896,7900,7904,7911,7930,7935,7949,7958,7962,7984,7995,8011,8025,8030,8047,8051,8066,8070,8075,8082,8102,8107,8112,8127,8154,8158,8178,8182,8195,8226,8230,8237,8241,8247,8256,8265,8269,8278,8296,8320,8343,8366,8389,8412,8435,8458,8481,8485,8489,8494,8515,8527,8542,8557,8572,8587,8592,8613,8623,8638,8653,8657,8678,8688,8703,8719,8724,8729,8737,8742,8748,8758,8768,8773,8780,8794,8804,8809,8819,8860,8874,8888,8909,8914,8919,8936,8954,8959,8965,8982,9003,9018,9024,9030,9063,9083,9105,9111,9130,9141,9146,9151,9184,9203,9224,9229,9248,9258,9263,9268,9286,9306,9328,9333,9352,9363,9368,9373,9390,9409,9419,9424,9443,9453,9458,9463,9469,9499,9524,9552,9576,9581,9589,9594,9601,9615,9625,9630,9640,9681,9697,9711,9716,9721,9745,9765,9770,9776,9786,9813,9831,9849,9866,9891,9896,9902,9925,9944,9964,9995,10001,10006],{"__ignoreMap":1045},[1050,5652,5653,5655,5657,5659,5661,5663,5665,5667,5669,5671,5673,5675],{"class":1052,"line":1053},[1050,5654,1188],{"class":1187},[1050,5656,1192],{"class":1191},[1050,5658,1196],{"class":1195},[1050,5660,1199],{"class":1191},[1050,5662,1196],{"class":1195},[1050,5664,1204],{"class":1191},[1050,5666,1196],{"class":1195},[1050,5668,2527],{"class":1191},[1050,5670,1212],{"class":1187},[1050,5672,2689],{"class":1191},[1050,5674,1353],{"class":1195},[1050,5676,5677],{"class":1191}," ModelState\n",[1050,5679,5680],{"class":1052,"line":1060},[1050,5681,1070],{"emptyLinePlaceholder":1069},[1050,5683,5684,5686,5689],{"class":1052,"line":1066},[1050,5685,1227],{"class":1226},[1050,5687,5688],{"class":1230}," ProjectStateManager",[1050,5690,1234],{"class":1195},[1050,5692,5693,5695,5698],{"class":1052,"line":1073},[1050,5694,1240],{"class":1082},[1050,5696,5697],{"class":1089},"Manage and analyze project state evolution",[1050,5699,1083],{"class":1082},[1050,5701,5702],{"class":1052,"line":1079},[1050,5703,1251],{"class":1191},[1050,5705,5706,5708,5710,5712,5714],{"class":1052,"line":1086},[1050,5707,1267],{"class":1226},[1050,5709,1797],{"class":1796},[1050,5711,1301],{"class":1195},[1050,5713,1803],{"class":1802},[1050,5715,1359],{"class":1195},[1050,5717,5718,5720,5722,5724,5726,5728,5730,5732,5734,5736],{"class":1052,"line":1093},[1050,5719,1451],{"class":1187},[1050,5721,1192],{"class":1191},[1050,5723,1196],{"class":1195},[1050,5725,1199],{"class":1191},[1050,5727,1196],{"class":1195},[1050,5729,1204],{"class":1191},[1050,5731,1196],{"class":1195},[1050,5733,1825],{"class":1191},[1050,5735,1212],{"class":1187},[1050,5737,1830],{"class":1191},[1050,5739,5740,5742,5744,5746,5748,5750,5752,5754],{"class":1052,"line":1099},[1050,5741,1837],{"class":1836},[1050,5743,1196],{"class":1195},[1050,5745,1522],{"class":1521},[1050,5747,1844],{"class":1195},[1050,5749,1847],{"class":1297},[1050,5751,1301],{"class":1195},[1050,5753,1304],{"class":1297},[1050,5755,1307],{"class":1195},[1050,5757,5758],{"class":1052,"line":1105},[1050,5759,1251],{"class":1191},[1050,5761,5762,5764,5767,5769,5771,5773,5775,5777,5779],{"class":1052,"line":1111},[1050,5763,1267],{"class":1226},[1050,5765,5766],{"class":1270}," get_state_at_migration",[1050,5768,1301],{"class":1195},[1050,5770,1803],{"class":1802},[1050,5772,1353],{"class":1195},[1050,5774,1657],{"class":1349},[1050,5776,1353],{"class":1195},[1050,5778,1356],{"class":1349},[1050,5780,1359],{"class":1195},[1050,5782,5783,5785,5788],{"class":1052,"line":1117},[1050,5784,1280],{"class":1082},[1050,5786,5787],{"class":1089},"Get project state at a specific migration",[1050,5789,1083],{"class":1082},[1050,5791,5792],{"class":1052,"line":1123},[1050,5793,1477],{"class":1191},[1050,5795,5796],{"class":1052,"line":1128},[1050,5797,5798],{"class":1056},"        # Build state up to the specified migration\n",[1050,5800,5801,5804,5806,5808,5810,5812,5814],{"class":1052,"line":1133},[1050,5802,5803],{"class":1191},"        target ",[1050,5805,1294],{"class":1195},[1050,5807,1392],{"class":1195},[1050,5809,1350],{"class":1191},[1050,5811,1353],{"class":1195},[1050,5813,1356],{"class":1191},[1050,5815,1307],{"class":1195},[1050,5817,5818,5821,5823,5825,5827,5829,5831,5833,5835,5838],{"class":1052,"line":1139},[1050,5819,5820],{"class":1191},"        state ",[1050,5822,1294],{"class":1195},[1050,5824,1868],{"class":1836},[1050,5826,1196],{"class":1195},[1050,5828,1522],{"class":1521},[1050,5830,1196],{"class":1195},[1050,5832,2668],{"class":1297},[1050,5834,1301],{"class":1195},[1050,5836,5837],{"class":1297},"target",[1050,5839,1307],{"class":1195},[1050,5841,5842],{"class":1052,"line":1144},[1050,5843,1477],{"class":1191},[1050,5845,5846,5848],{"class":1052,"line":1150},[1050,5847,1313],{"class":1187},[1050,5849,5850],{"class":1191}," state\n",[1050,5852,5853],{"class":1052,"line":1156},[1050,5854,1251],{"class":1191},[1050,5856,5857,5859,5862,5864,5866,5868,5871,5873,5876],{"class":1052,"line":1162},[1050,5858,1267],{"class":1226},[1050,5860,5861],{"class":1270}," compare_states",[1050,5863,1301],{"class":1195},[1050,5865,1803],{"class":1802},[1050,5867,1353],{"class":1195},[1050,5869,5870],{"class":1349}," state1",[1050,5872,1353],{"class":1195},[1050,5874,5875],{"class":1349}," state2",[1050,5877,1359],{"class":1195},[1050,5879,5880,5882,5885],{"class":1052,"line":1168},[1050,5881,1280],{"class":1082},[1050,5883,5884],{"class":1089},"Compare two project states",[1050,5886,1083],{"class":1082},[1050,5888,5889],{"class":1052,"line":1174},[1050,5890,1477],{"class":1191},[1050,5892,5893,5896,5898],{"class":1052,"line":1179},[1050,5894,5895],{"class":1191},"        differences ",[1050,5897,1294],{"class":1195},[1050,5899,3116],{"class":1195},[1050,5901,5902,5904,5907,5909,5911],{"class":1052,"line":1184},[1050,5903,3135],{"class":1643},[1050,5905,5906],{"class":1647},"added_models",[1050,5908,1651],{"class":1643},[1050,5910,1654],{"class":1195},[1050,5912,5913],{"class":1195}," [],\n",[1050,5915,5916,5918,5921,5923,5925],{"class":1052,"line":1218},[1050,5917,3135],{"class":1643},[1050,5919,5920],{"class":1647},"removed_models",[1050,5922,1651],{"class":1643},[1050,5924,1654],{"class":1195},[1050,5926,5913],{"class":1195},[1050,5928,5929,5931,5934,5936,5938],{"class":1052,"line":1223},[1050,5930,3135],{"class":1643},[1050,5932,5933],{"class":1647},"modified_models",[1050,5935,1651],{"class":1643},[1050,5937,1654],{"class":1195},[1050,5939,5913],{"class":1195},[1050,5941,5942],{"class":1052,"line":1237},[1050,5943,4282],{"class":1195},[1050,5945,5946],{"class":1052,"line":1248},[1050,5947,1477],{"class":1191},[1050,5949,5950],{"class":1052,"line":1254},[1050,5951,5952],{"class":1056},"        # Get model keys from both states\n",[1050,5954,5955,5958,5960,5963,5965,5968,5970,5973,5975,5978],{"class":1052,"line":1264},[1050,5956,5957],{"class":1191},"        models1 ",[1050,5959,1294],{"class":1195},[1050,5961,5962],{"class":1260}," set",[1050,5964,1301],{"class":1195},[1050,5966,5967],{"class":1297},"state1",[1050,5969,1196],{"class":1195},[1050,5971,5972],{"class":1521},"models",[1050,5974,1196],{"class":1195},[1050,5976,5977],{"class":1297},"keys",[1050,5979,5980],{"class":1195},"())\n",[1050,5982,5983,5986,5988,5990,5992,5995,5997,5999,6001,6003],{"class":1052,"line":1277},[1050,5984,5985],{"class":1191},"        models2 ",[1050,5987,1294],{"class":1195},[1050,5989,5962],{"class":1260},[1050,5991,1301],{"class":1195},[1050,5993,5994],{"class":1297},"state2",[1050,5996,1196],{"class":1195},[1050,5998,5972],{"class":1521},[1050,6000,1196],{"class":1195},[1050,6002,5977],{"class":1297},[1050,6004,5980],{"class":1195},[1050,6006,6007],{"class":1052,"line":1288},[1050,6008,1477],{"class":1191},[1050,6010,6011],{"class":1052,"line":1310},[1050,6012,6013],{"class":1056},"        # Find added and removed models\n",[1050,6015,6016,6019,6021,6023,6025,6027,6029,6031,6034,6036,6039,6042,6045],{"class":1052,"line":1327},[1050,6017,6018],{"class":1191},"        differences",[1050,6020,1591],{"class":1195},[1050,6022,1651],{"class":1643},[1050,6024,5906],{"class":1647},[1050,6026,1651],{"class":1643},[1050,6028,2290],{"class":1195},[1050,6030,1844],{"class":1195},[1050,6032,6033],{"class":1260}," list",[1050,6035,1301],{"class":1195},[1050,6037,6038],{"class":1297},"models2 ",[1050,6040,6041],{"class":1404},"-",[1050,6043,6044],{"class":1297}," models1",[1050,6046,1307],{"class":1195},[1050,6048,6049,6051,6053,6055,6057,6059,6061,6063,6065,6067,6070,6072,6075],{"class":1052,"line":1332},[1050,6050,6018],{"class":1191},[1050,6052,1591],{"class":1195},[1050,6054,1651],{"class":1643},[1050,6056,5920],{"class":1647},[1050,6058,1651],{"class":1643},[1050,6060,2290],{"class":1195},[1050,6062,1844],{"class":1195},[1050,6064,6033],{"class":1260},[1050,6066,1301],{"class":1195},[1050,6068,6069],{"class":1297},"models1 ",[1050,6071,6041],{"class":1404},[1050,6073,6074],{"class":1297}," models2",[1050,6076,1307],{"class":1195},[1050,6078,6079],{"class":1052,"line":1339},[1050,6080,1477],{"class":1191},[1050,6082,6083],{"class":1052,"line":1362},[1050,6084,6085],{"class":1056},"        # Find modified models\n",[1050,6087,6088,6091,6093,6096,6099],{"class":1052,"line":1372},[1050,6089,6090],{"class":1191},"        common_models ",[1050,6092,1294],{"class":1195},[1050,6094,6095],{"class":1191}," models1 ",[1050,6097,6098],{"class":1404},"&",[1050,6100,6101],{"class":1191}," models2\n",[1050,6103,6104,6106,6109,6111,6114],{"class":1052,"line":1387},[1050,6105,1555],{"class":1187},[1050,6107,6108],{"class":1191}," model_key ",[1050,6110,1561],{"class":1187},[1050,6112,6113],{"class":1191}," common_models",[1050,6115,1234],{"class":1195},[1050,6117,6118,6121,6123,6125,6127,6129,6131,6134],{"class":1052,"line":1416},[1050,6119,6120],{"class":1191},"            model1 ",[1050,6122,1294],{"class":1195},[1050,6124,5870],{"class":1191},[1050,6126,1196],{"class":1195},[1050,6128,5972],{"class":1521},[1050,6130,1591],{"class":1195},[1050,6132,6133],{"class":1521},"model_key",[1050,6135,1623],{"class":1195},[1050,6137,6138,6141,6143,6145,6147,6149,6151,6153],{"class":1052,"line":1421},[1050,6139,6140],{"class":1191},"            model2 ",[1050,6142,1294],{"class":1195},[1050,6144,5875],{"class":1191},[1050,6146,1196],{"class":1195},[1050,6148,5972],{"class":1521},[1050,6150,1591],{"class":1195},[1050,6152,6133],{"class":1521},[1050,6154,1623],{"class":1195},[1050,6156,6157],{"class":1052,"line":1428},[1050,6158,2189],{"class":1191},[1050,6160,6161,6163,6165,6167,6170,6172,6175,6177,6180],{"class":1052,"line":1438},[1050,6162,2226],{"class":1187},[1050,6164,1868],{"class":1836},[1050,6166,1196],{"class":1195},[1050,6168,6169],{"class":1297},"_models_differ",[1050,6171,1301],{"class":1195},[1050,6173,6174],{"class":1297},"model1",[1050,6176,1353],{"class":1195},[1050,6178,6179],{"class":1297}," model2",[1050,6181,1359],{"class":1195},[1050,6183,6184,6187,6189,6191,6193,6195,6197,6199],{"class":1052,"line":1448},[1050,6185,6186],{"class":1191},"                differences",[1050,6188,1591],{"class":1195},[1050,6190,1651],{"class":1643},[1050,6192,5933],{"class":1647},[1050,6194,1651],{"class":1643},[1050,6196,4405],{"class":1195},[1050,6198,1634],{"class":1297},[1050,6200,1637],{"class":1195},[1050,6202,6203,6205,6208,6210,6212,6215],{"class":1052,"line":1474},[1050,6204,1644],{"class":1643},[1050,6206,6207],{"class":1647},"model",[1050,6209,1651],{"class":1643},[1050,6211,1654],{"class":1195},[1050,6213,6214],{"class":1297}," model_key",[1050,6216,1660],{"class":1195},[1050,6218,6219,6221,6223,6225,6227,6229,6231,6234,6236,6238,6240,6242],{"class":1052,"line":1480},[1050,6220,1644],{"class":1643},[1050,6222,2756],{"class":1647},[1050,6224,1651],{"class":1643},[1050,6226,1654],{"class":1195},[1050,6228,1868],{"class":1836},[1050,6230,1196],{"class":1195},[1050,6232,6233],{"class":1297},"_get_model_changes",[1050,6235,1301],{"class":1195},[1050,6237,6174],{"class":1297},[1050,6239,1353],{"class":1195},[1050,6241,6179],{"class":1297},[1050,6243,1307],{"class":1195},[1050,6245,6246],{"class":1052,"line":1497},[1050,6247,1739],{"class":1195},[1050,6249,6250],{"class":1052,"line":1502},[1050,6251,1477],{"class":1191},[1050,6253,6254,6256],{"class":1052,"line":1508},[1050,6255,1313],{"class":1187},[1050,6257,6258],{"class":1191}," differences\n",[1050,6260,6261],{"class":1052,"line":1530},[1050,6262,1251],{"class":1191},[1050,6264,6265,6267,6270,6272,6274,6276,6279,6281,6283],{"class":1052,"line":1535},[1050,6266,1267],{"class":1226},[1050,6268,6269],{"class":1270}," _models_differ",[1050,6271,1301],{"class":1195},[1050,6273,1803],{"class":1802},[1050,6275,1353],{"class":1195},[1050,6277,6278],{"class":1349}," model1",[1050,6280,1353],{"class":1195},[1050,6282,6179],{"class":1349},[1050,6284,1359],{"class":1195},[1050,6286,6287,6289,6292],{"class":1052,"line":1541},[1050,6288,1280],{"class":1082},[1050,6290,6291],{"class":1089},"Check if two model states differ",[1050,6293,1083],{"class":1082},[1050,6295,6296],{"class":1052,"line":1552},[1050,6297,1477],{"class":1191},[1050,6299,6300],{"class":1052,"line":1574},[1050,6301,6302],{"class":1056},"        # Compare fields\n",[1050,6304,6305,6307,6309,6311,6313,6315,6318,6320,6322,6325,6328,6330,6332,6335,6337,6339,6341,6343],{"class":1052,"line":1599},[1050,6306,2875],{"class":1187},[1050,6308,5962],{"class":1260},[1050,6310,1301],{"class":1195},[1050,6312,6174],{"class":1297},[1050,6314,1196],{"class":1195},[1050,6316,6317],{"class":1521},"fields",[1050,6319,1196],{"class":1195},[1050,6321,5977],{"class":1297},[1050,6323,6324],{"class":1195},"())",[1050,6326,6327],{"class":1404}," !=",[1050,6329,5962],{"class":1260},[1050,6331,1301],{"class":1195},[1050,6333,6334],{"class":1297},"model2",[1050,6336,1196],{"class":1195},[1050,6338,6317],{"class":1521},[1050,6340,1196],{"class":1195},[1050,6342,5977],{"class":1297},[1050,6344,6345],{"class":1195},"()):\n",[1050,6347,6348,6351],{"class":1052,"line":1626},[1050,6349,6350],{"class":1187},"            return",[1050,6352,4994],{"class":2785},[1050,6354,6355],{"class":1052,"line":1640},[1050,6356,1477],{"class":1191},[1050,6358,6359],{"class":1052,"line":1663},[1050,6360,6361],{"class":1056},"        # Compare field definitions\n",[1050,6363,6364,6366,6369,6371,6373,6375,6377],{"class":1052,"line":1679},[1050,6365,1555],{"class":1187},[1050,6367,6368],{"class":1191}," field_name ",[1050,6370,1561],{"class":1187},[1050,6372,6278],{"class":1191},[1050,6374,1196],{"class":1195},[1050,6376,6317],{"class":1521},[1050,6378,1234],{"class":1195},[1050,6380,6381,6383,6385,6387,6389,6391,6393],{"class":1052,"line":1715},[1050,6382,2226],{"class":1187},[1050,6384,6368],{"class":1191},[1050,6386,1561],{"class":1404},[1050,6388,6179],{"class":1191},[1050,6390,1196],{"class":1195},[1050,6392,6317],{"class":1521},[1050,6394,1234],{"class":1195},[1050,6396,6397,6400,6402,6404,6406,6408,6410,6413],{"class":1052,"line":1736},[1050,6398,6399],{"class":1191},"                field1 ",[1050,6401,1294],{"class":1195},[1050,6403,6278],{"class":1191},[1050,6405,1196],{"class":1195},[1050,6407,6317],{"class":1521},[1050,6409,1591],{"class":1195},[1050,6411,6412],{"class":1521},"field_name",[1050,6414,1623],{"class":1195},[1050,6416,6417,6420,6422,6424,6426,6428,6430,6432],{"class":1052,"line":1742},[1050,6418,6419],{"class":1191},"                field2 ",[1050,6421,1294],{"class":1195},[1050,6423,6179],{"class":1191},[1050,6425,1196],{"class":1195},[1050,6427,6317],{"class":1521},[1050,6429,1591],{"class":1195},[1050,6431,6412],{"class":1521},[1050,6433,1623],{"class":1195},[1050,6435,6436],{"class":1052,"line":1747},[1050,6437,2989],{"class":1191},[1050,6439,6440],{"class":1052,"line":1755},[1050,6441,6442],{"class":1056},"                # Compare field types and attributes\n",[1050,6444,6445,6447,6449,6452,6454,6456,6458,6461,6463,6465],{"class":1052,"line":1760},[1050,6446,2404],{"class":1187},[1050,6448,1392],{"class":1195},[1050,6450,6451],{"class":1191},"field1",[1050,6453,1196],{"class":1195},[1050,6455,3031],{"class":3030},[1050,6457,6327],{"class":1404},[1050,6459,6460],{"class":1191}," field2",[1050,6462,1196],{"class":1195},[1050,6464,3031],{"class":3030},[1050,6466,6467],{"class":1404}," or\n",[1050,6469,6470,6473,6475,6478,6480,6482,6484,6486],{"class":1052,"line":1766},[1050,6471,6472],{"class":1191},"                    field1",[1050,6474,1196],{"class":1195},[1050,6476,6477],{"class":1521},"max_length",[1050,6479,6327],{"class":1404},[1050,6481,6460],{"class":1191},[1050,6483,1196],{"class":1195},[1050,6485,6477],{"class":1521},[1050,6487,6467],{"class":1404},[1050,6489,6490,6492,6494,6496,6498,6500,6502,6504],{"class":1052,"line":1776},[1050,6491,6472],{"class":1191},[1050,6493,1196],{"class":1195},[1050,6495,4351],{"class":1521},[1050,6497,6327],{"class":1404},[1050,6499,6460],{"class":1191},[1050,6501,1196],{"class":1195},[1050,6503,4351],{"class":1521},[1050,6505,6467],{"class":1404},[1050,6507,6508,6510,6512,6515,6517,6519,6521,6523],{"class":1052,"line":1786},[1050,6509,6472],{"class":1191},[1050,6511,1196],{"class":1195},[1050,6513,6514],{"class":1521},"blank",[1050,6516,6327],{"class":1404},[1050,6518,6460],{"class":1191},[1050,6520,1196],{"class":1195},[1050,6522,6514],{"class":1521},[1050,6524,1359],{"class":1195},[1050,6526,6527,6530],{"class":1052,"line":1791},[1050,6528,6529],{"class":1187},"                    return",[1050,6531,4994],{"class":2785},[1050,6533,6534],{"class":1052,"line":1808},[1050,6535,1477],{"class":1191},[1050,6537,6538],{"class":1052,"line":1833},[1050,6539,6540],{"class":1056},"        # Compare options\n",[1050,6542,6543,6545,6547,6549,6552,6554,6556,6558,6560],{"class":1052,"line":1856},[1050,6544,2875],{"class":1187},[1050,6546,6278],{"class":1191},[1050,6548,1196],{"class":1195},[1050,6550,6551],{"class":1521},"options",[1050,6553,6327],{"class":1404},[1050,6555,6179],{"class":1191},[1050,6557,1196],{"class":1195},[1050,6559,6551],{"class":1521},[1050,6561,1234],{"class":1195},[1050,6563,6564,6566],{"class":1052,"line":1879},[1050,6565,6350],{"class":1187},[1050,6567,4994],{"class":2785},[1050,6569,6570],{"class":1052,"line":1884},[1050,6571,1477],{"class":1191},[1050,6573,6574,6576],{"class":1052,"line":1903},[1050,6575,1313],{"class":1187},[1050,6577,4389],{"class":2785},[1050,6579,6580],{"class":1052,"line":1913},[1050,6581,1251],{"class":1191},[1050,6583,6584,6586,6589,6591,6593,6595,6597,6599,6601],{"class":1052,"line":1936},[1050,6585,1267],{"class":1226},[1050,6587,6588],{"class":1270}," _get_model_changes",[1050,6590,1301],{"class":1195},[1050,6592,1803],{"class":1802},[1050,6594,1353],{"class":1195},[1050,6596,6278],{"class":1349},[1050,6598,1353],{"class":1195},[1050,6600,6179],{"class":1349},[1050,6602,1359],{"class":1195},[1050,6604,6605,6607,6610],{"class":1052,"line":1941},[1050,6606,1280],{"class":1082},[1050,6608,6609],{"class":1089},"Get detailed changes between two model states",[1050,6611,1083],{"class":1082},[1050,6613,6614],{"class":1052,"line":1956},[1050,6615,1477],{"class":1191},[1050,6617,6618,6620,6622],{"class":1052,"line":1978},[1050,6619,2746],{"class":1191},[1050,6621,1294],{"class":1195},[1050,6623,3116],{"class":1195},[1050,6625,6626,6628,6631,6633,6635],{"class":1052,"line":1983},[1050,6627,3135],{"class":1643},[1050,6629,6630],{"class":1647},"added_fields",[1050,6632,1651],{"class":1643},[1050,6634,1654],{"class":1195},[1050,6636,5913],{"class":1195},[1050,6638,6639,6641,6644,6646,6648],{"class":1052,"line":1991},[1050,6640,3135],{"class":1643},[1050,6642,6643],{"class":1647},"removed_fields",[1050,6645,1651],{"class":1643},[1050,6647,1654],{"class":1195},[1050,6649,5913],{"class":1195},[1050,6651,6652,6654,6657,6659,6661],{"class":1052,"line":1997},[1050,6653,3135],{"class":1643},[1050,6655,6656],{"class":1647},"modified_fields",[1050,6658,1651],{"class":1643},[1050,6660,1654],{"class":1195},[1050,6662,5913],{"class":1195},[1050,6664,6665,6667,6670,6672,6674],{"class":1052,"line":2045},[1050,6666,3135],{"class":1643},[1050,6668,6669],{"class":1647},"option_changes",[1050,6671,1651],{"class":1643},[1050,6673,1654],{"class":1195},[1050,6675,6676],{"class":1195}," {},\n",[1050,6678,6679],{"class":1052,"line":2062},[1050,6680,4282],{"class":1195},[1050,6682,6683],{"class":1052,"line":2081},[1050,6684,1477],{"class":1191},[1050,6686,6687],{"class":1052,"line":2087},[1050,6688,6689],{"class":1056},"        # Field changes\n",[1050,6691,6692,6695,6697,6699,6701,6703,6705,6707,6709,6711],{"class":1052,"line":2104},[1050,6693,6694],{"class":1191},"        fields1 ",[1050,6696,1294],{"class":1195},[1050,6698,5962],{"class":1260},[1050,6700,1301],{"class":1195},[1050,6702,6174],{"class":1297},[1050,6704,1196],{"class":1195},[1050,6706,6317],{"class":1521},[1050,6708,1196],{"class":1195},[1050,6710,5977],{"class":1297},[1050,6712,5980],{"class":1195},[1050,6714,6715,6718,6720,6722,6724,6726,6728,6730,6732,6734],{"class":1052,"line":2110},[1050,6716,6717],{"class":1191},"        fields2 ",[1050,6719,1294],{"class":1195},[1050,6721,5962],{"class":1260},[1050,6723,1301],{"class":1195},[1050,6725,6334],{"class":1297},[1050,6727,1196],{"class":1195},[1050,6729,6317],{"class":1521},[1050,6731,1196],{"class":1195},[1050,6733,5977],{"class":1297},[1050,6735,5980],{"class":1195},[1050,6737,6738],{"class":1052,"line":2115},[1050,6739,1477],{"class":1191},[1050,6741,6742,6745,6747,6749,6751,6753,6755,6757,6759,6761,6764,6766,6769],{"class":1052,"line":2129},[1050,6743,6744],{"class":1191},"        changes",[1050,6746,1591],{"class":1195},[1050,6748,1651],{"class":1643},[1050,6750,6630],{"class":1647},[1050,6752,1651],{"class":1643},[1050,6754,2290],{"class":1195},[1050,6756,1844],{"class":1195},[1050,6758,6033],{"class":1260},[1050,6760,1301],{"class":1195},[1050,6762,6763],{"class":1297},"fields2 ",[1050,6765,6041],{"class":1404},[1050,6767,6768],{"class":1297}," fields1",[1050,6770,1307],{"class":1195},[1050,6772,6773,6775,6777,6779,6781,6783,6785,6787,6789,6791,6794,6796,6799],{"class":1052,"line":2139},[1050,6774,6744],{"class":1191},[1050,6776,1591],{"class":1195},[1050,6778,1651],{"class":1643},[1050,6780,6643],{"class":1647},[1050,6782,1651],{"class":1643},[1050,6784,2290],{"class":1195},[1050,6786,1844],{"class":1195},[1050,6788,6033],{"class":1260},[1050,6790,1301],{"class":1195},[1050,6792,6793],{"class":1297},"fields1 ",[1050,6795,6041],{"class":1404},[1050,6797,6798],{"class":1297}," fields2",[1050,6800,1307],{"class":1195},[1050,6802,6803],{"class":1052,"line":2150},[1050,6804,1477],{"class":1191},[1050,6806,6807],{"class":1052,"line":2155},[1050,6808,6809],{"class":1056},"        # Modified fields\n",[1050,6811,6812,6815,6817,6820,6822],{"class":1052,"line":2176},[1050,6813,6814],{"class":1191},"        common_fields ",[1050,6816,1294],{"class":1195},[1050,6818,6819],{"class":1191}," fields1 ",[1050,6821,6098],{"class":1404},[1050,6823,6824],{"class":1191}," fields2\n",[1050,6826,6827,6829,6831,6833,6836],{"class":1052,"line":2186},[1050,6828,1555],{"class":1187},[1050,6830,6368],{"class":1191},[1050,6832,1561],{"class":1187},[1050,6834,6835],{"class":1191}," common_fields",[1050,6837,1234],{"class":1195},[1050,6839,6840,6843,6845,6847,6849,6851,6853,6855],{"class":1052,"line":2192},[1050,6841,6842],{"class":1191},"            field1 ",[1050,6844,1294],{"class":1195},[1050,6846,6278],{"class":1191},[1050,6848,1196],{"class":1195},[1050,6850,6317],{"class":1521},[1050,6852,1591],{"class":1195},[1050,6854,6412],{"class":1521},[1050,6856,1623],{"class":1195},[1050,6858,6859,6862,6864,6866,6868,6870,6872,6874],{"class":1052,"line":2198},[1050,6860,6861],{"class":1191},"            field2 ",[1050,6863,1294],{"class":1195},[1050,6865,6179],{"class":1191},[1050,6867,1196],{"class":1195},[1050,6869,6317],{"class":1521},[1050,6871,1591],{"class":1195},[1050,6873,6412],{"class":1521},[1050,6875,1623],{"class":1195},[1050,6877,6878],{"class":1052,"line":2223},[1050,6879,2189],{"class":1191},[1050,6881,6882,6885,6887],{"class":1052,"line":2248},[1050,6883,6884],{"class":1191},"            field_changes ",[1050,6886,1294],{"class":1195},[1050,6888,1549],{"class":1195},[1050,6890,6891],{"class":1052,"line":2265},[1050,6892,2189],{"class":1191},[1050,6894,6895,6897,6900,6902,6904,6906,6908,6910,6912],{"class":1052,"line":2270},[1050,6896,2226],{"class":1187},[1050,6898,6899],{"class":1191}," field1",[1050,6901,1196],{"class":1195},[1050,6903,3031],{"class":3030},[1050,6905,6327],{"class":1404},[1050,6907,6460],{"class":1191},[1050,6909,1196],{"class":1195},[1050,6911,3031],{"class":3030},[1050,6913,1234],{"class":1195},[1050,6915,6916,6919,6921,6923,6925,6927,6930,6932,6934,6936,6938,6940,6942,6944,6947,6949,6952,6954,6956,6958,6960,6962,6964],{"class":1052,"line":2280},[1050,6917,6918],{"class":1191},"                field_changes",[1050,6920,1196],{"class":1195},[1050,6922,1634],{"class":1297},[1050,6924,1301],{"class":1195},[1050,6926,2927],{"class":1226},[1050,6928,6929],{"class":1647},"'Type: ",[1050,6931,2017],{"class":2016},[1050,6933,6451],{"class":1297},[1050,6935,1196],{"class":1195},[1050,6937,3031],{"class":3030},[1050,6939,1196],{"class":1195},[1050,6941,3036],{"class":3030},[1050,6943,2026],{"class":2016},[1050,6945,6946],{"class":1647}," -> ",[1050,6948,2017],{"class":2016},[1050,6950,6951],{"class":1297},"field2",[1050,6953,1196],{"class":1195},[1050,6955,3031],{"class":3030},[1050,6957,1196],{"class":1195},[1050,6959,3036],{"class":3030},[1050,6961,2026],{"class":2016},[1050,6963,1651],{"class":1647},[1050,6965,1307],{"class":1195},[1050,6967,6968],{"class":1052,"line":2298},[1050,6969,2189],{"class":1191},[1050,6971,6972,6974,6976,6978,6980,6982,6984,6986,6988,6990,6992,6994,6996,6998,7000,7002,7004,7006,7008,7010,7012,7014],{"class":1052,"line":2303},[1050,6973,2226],{"class":1187},[1050,6975,4865],{"class":1796},[1050,6977,1301],{"class":1195},[1050,6979,6451],{"class":1297},[1050,6981,1353],{"class":1195},[1050,6983,3145],{"class":1643},[1050,6985,6477],{"class":1647},[1050,6987,1651],{"class":1643},[1050,6989,1353],{"class":1195},[1050,6991,4849],{"class":2785},[1050,6993,1401],{"class":1195},[1050,6995,6327],{"class":1404},[1050,6997,4865],{"class":1796},[1050,6999,1301],{"class":1195},[1050,7001,6951],{"class":1297},[1050,7003,1353],{"class":1195},[1050,7005,3145],{"class":1643},[1050,7007,6477],{"class":1647},[1050,7009,1651],{"class":1643},[1050,7011,1353],{"class":1195},[1050,7013,4849],{"class":2785},[1050,7015,1359],{"class":1195},[1050,7017,7018,7020,7022,7024,7026,7028,7031,7033,7035,7037,7039,7041,7043,7045,7047,7049,7051,7053,7055],{"class":1052,"line":2311},[1050,7019,6918],{"class":1191},[1050,7021,1196],{"class":1195},[1050,7023,1634],{"class":1297},[1050,7025,1301],{"class":1195},[1050,7027,2927],{"class":1226},[1050,7029,7030],{"class":1647},"'Max length: ",[1050,7032,2017],{"class":2016},[1050,7034,6451],{"class":1297},[1050,7036,1196],{"class":1195},[1050,7038,6477],{"class":1521},[1050,7040,2026],{"class":2016},[1050,7042,6946],{"class":1647},[1050,7044,2017],{"class":2016},[1050,7046,6951],{"class":1297},[1050,7048,1196],{"class":1195},[1050,7050,6477],{"class":1521},[1050,7052,2026],{"class":2016},[1050,7054,1651],{"class":1647},[1050,7056,1307],{"class":1195},[1050,7058,7059],{"class":1052,"line":2316},[1050,7060,2189],{"class":1191},[1050,7062,7063,7065,7067,7069,7071,7073,7075,7077,7079],{"class":1052,"line":2330},[1050,7064,2226],{"class":1187},[1050,7066,6899],{"class":1191},[1050,7068,1196],{"class":1195},[1050,7070,4351],{"class":1521},[1050,7072,6327],{"class":1404},[1050,7074,6460],{"class":1191},[1050,7076,1196],{"class":1195},[1050,7078,4351],{"class":1521},[1050,7080,1234],{"class":1195},[1050,7082,7083,7085,7087,7089,7091,7093,7096,7098,7100,7102,7104,7106,7108,7110,7112,7114,7116,7118,7120],{"class":1052,"line":2340},[1050,7084,6918],{"class":1191},[1050,7086,1196],{"class":1195},[1050,7088,1634],{"class":1297},[1050,7090,1301],{"class":1195},[1050,7092,2927],{"class":1226},[1050,7094,7095],{"class":1647},"'Null: ",[1050,7097,2017],{"class":2016},[1050,7099,6451],{"class":1297},[1050,7101,1196],{"class":1195},[1050,7103,4351],{"class":1521},[1050,7105,2026],{"class":2016},[1050,7107,6946],{"class":1647},[1050,7109,2017],{"class":2016},[1050,7111,6951],{"class":1297},[1050,7113,1196],{"class":1195},[1050,7115,4351],{"class":1521},[1050,7117,2026],{"class":2016},[1050,7119,1651],{"class":1647},[1050,7121,1307],{"class":1195},[1050,7123,7124],{"class":1052,"line":2350},[1050,7125,2189],{"class":1191},[1050,7127,7128,7130,7133],{"class":1052,"line":2355},[1050,7129,2226],{"class":1187},[1050,7131,7132],{"class":1191}," field_changes",[1050,7134,1234],{"class":1195},[1050,7136,7137,7140,7142,7144,7146,7148,7150,7152],{"class":1052,"line":2376},[1050,7138,7139],{"class":1191},"                changes",[1050,7141,1591],{"class":1195},[1050,7143,1651],{"class":1643},[1050,7145,6656],{"class":1647},[1050,7147,1651],{"class":1643},[1050,7149,4405],{"class":1195},[1050,7151,1634],{"class":1297},[1050,7153,1637],{"class":1195},[1050,7155,7156,7158,7160,7162,7164,7167],{"class":1052,"line":2401},[1050,7157,1644],{"class":1643},[1050,7159,4331],{"class":1647},[1050,7161,1651],{"class":1643},[1050,7163,1654],{"class":1195},[1050,7165,7166],{"class":1297}," field_name",[1050,7168,1660],{"class":1195},[1050,7170,7171,7173,7175,7177,7179],{"class":1052,"line":2434},[1050,7172,1644],{"class":1643},[1050,7174,2756],{"class":1647},[1050,7176,1651],{"class":1643},[1050,7178,1654],{"class":1195},[1050,7180,7181],{"class":1297}," field_changes\n",[1050,7183,7184],{"class":1052,"line":2456},[1050,7185,1739],{"class":1195},[1050,7187,7188],{"class":1052,"line":2461},[1050,7189,1477],{"class":1191},[1050,7191,7192],{"class":1052,"line":3929},[1050,7193,7194],{"class":1056},"        # Option changes\n",[1050,7196,7197,7199,7202,7204,7207,7209,7211,7213,7215,7217,7220],{"class":1052,"line":3949},[1050,7198,1555],{"class":1187},[1050,7200,7201],{"class":1191}," option",[1050,7203,1353],{"class":1195},[1050,7205,7206],{"class":1191}," value1 ",[1050,7208,1561],{"class":1187},[1050,7210,6278],{"class":1191},[1050,7212,1196],{"class":1195},[1050,7214,6551],{"class":1521},[1050,7216,1196],{"class":1195},[1050,7218,7219],{"class":1297},"items",[1050,7221,1274],{"class":1195},[1050,7223,7224,7227,7229,7231,7233,7235,7237,7239,7241,7244],{"class":1052,"line":3968},[1050,7225,7226],{"class":1191},"            value2 ",[1050,7228,1294],{"class":1195},[1050,7230,6179],{"class":1191},[1050,7232,1196],{"class":1195},[1050,7234,6551],{"class":1521},[1050,7236,1196],{"class":1195},[1050,7238,3066],{"class":1297},[1050,7240,1301],{"class":1195},[1050,7242,7243],{"class":1297},"option",[1050,7245,1307],{"class":1195},[1050,7247,7248,7250,7252,7255,7258],{"class":1052,"line":3988},[1050,7249,2226],{"class":1187},[1050,7251,7206],{"class":1191},[1050,7253,7254],{"class":1404},"!=",[1050,7256,7257],{"class":1191}," value2",[1050,7259,1234],{"class":1195},[1050,7261,7262,7264,7266,7268,7270,7272,7274,7276,7278,7280],{"class":1052,"line":3993},[1050,7263,7139],{"class":1191},[1050,7265,1591],{"class":1195},[1050,7267,1651],{"class":1643},[1050,7269,6669],{"class":1647},[1050,7271,1651],{"class":1643},[1050,7273,1617],{"class":1195},[1050,7275,7243],{"class":1191},[1050,7277,2290],{"class":1195},[1050,7279,1844],{"class":1195},[1050,7281,3116],{"class":1195},[1050,7283,7284,7286,7288,7290,7292,7295],{"class":1052,"line":3999},[1050,7285,1644],{"class":1643},[1050,7287,1188],{"class":1647},[1050,7289,1651],{"class":1643},[1050,7291,1654],{"class":1195},[1050,7293,7294],{"class":1191}," value1",[1050,7296,1660],{"class":1195},[1050,7298,7299,7301,7304,7306,7308],{"class":1052,"line":4004},[1050,7300,1644],{"class":1643},[1050,7302,7303],{"class":1647},"to",[1050,7305,1651],{"class":1643},[1050,7307,1654],{"class":1195},[1050,7309,7310],{"class":1191}," value2\n",[1050,7312,7313],{"class":1052,"line":4011},[1050,7314,7315],{"class":1195},"                }\n",[1050,7317,7318],{"class":1052,"line":4025},[1050,7319,1477],{"class":1191},[1050,7321,7322,7324],{"class":1052,"line":4035},[1050,7323,1313],{"class":1187},[1050,7325,2815],{"class":1191},[1050,7327,7328],{"class":1052,"line":4040},[1050,7329,1251],{"class":1191},[1050,7331,7332,7334,7337,7339,7341,7343,7345],{"class":1052,"line":4060},[1050,7333,1267],{"class":1226},[1050,7335,7336],{"class":1270}," get_migration_timeline",[1050,7338,1301],{"class":1195},[1050,7340,1803],{"class":1802},[1050,7342,1353],{"class":1195},[1050,7344,1657],{"class":1349},[1050,7346,1359],{"class":1195},[1050,7348,7349,7351,7354],{"class":1052,"line":4081},[1050,7350,1280],{"class":1082},[1050,7352,7353],{"class":1089},"Get timeline of migrations for an app",[1050,7355,1083],{"class":1082},[1050,7357,7358],{"class":1052,"line":4092},[1050,7359,1477],{"class":1191},[1050,7361,7362,7365,7367],{"class":1052,"line":4133},[1050,7363,7364],{"class":1191},"        timeline ",[1050,7366,1294],{"class":1195},[1050,7368,1549],{"class":1195},[1050,7370,7371],{"class":1052,"line":4138},[1050,7372,1477],{"class":1191},[1050,7374,7375],{"class":1052,"line":4143},[1050,7376,7377],{"class":1056},"        # Get all migrations for the app\n",[1050,7379,7380,7383,7385],{"class":1052,"line":4153},[1050,7381,7382],{"class":1191},"        app_migrations ",[1050,7384,1294],{"class":1195},[1050,7386,1549],{"class":1195},[1050,7388,7389,7391,7394,7396,7398,7400,7402,7404,7406,7408,7410],{"class":1052,"line":4169},[1050,7390,1555],{"class":1187},[1050,7392,7393],{"class":1191}," migration_key ",[1050,7395,1561],{"class":1187},[1050,7397,1868],{"class":1836},[1050,7399,1196],{"class":1195},[1050,7401,1522],{"class":1521},[1050,7403,1196],{"class":1195},[1050,7405,1863],{"class":1521},[1050,7407,1196],{"class":1195},[1050,7409,1569],{"class":1521},[1050,7411,1234],{"class":1195},[1050,7413,7414,7416,7419,7421,7424,7426,7429,7431],{"class":1052,"line":4194},[1050,7415,2226],{"class":1187},[1050,7417,7418],{"class":1191}," migration_key",[1050,7420,1591],{"class":1195},[1050,7422,7423],{"class":2242},"0",[1050,7425,2290],{"class":1195},[1050,7427,7428],{"class":1404}," ==",[1050,7430,1657],{"class":1191},[1050,7432,1234],{"class":1195},[1050,7434,7435,7438,7440,7442,7444,7447],{"class":1052,"line":4230},[1050,7436,7437],{"class":1191},"                app_migrations",[1050,7439,1196],{"class":1195},[1050,7441,1634],{"class":1297},[1050,7443,1301],{"class":1195},[1050,7445,7446],{"class":1297},"migration_key",[1050,7448,1307],{"class":1195},[1050,7450,7451],{"class":1052,"line":4265},[1050,7452,1477],{"class":1191},[1050,7454,7455],{"class":1052,"line":4279},[1050,7456,7457],{"class":1056},"        # Sort by migration order\n",[1050,7459,7460,7463,7465,7468,7470,7473,7475,7478,7481,7483,7485,7487,7490],{"class":1052,"line":4285},[1050,7461,7462],{"class":1191},"        app_migrations",[1050,7464,1196],{"class":1195},[1050,7466,7467],{"class":1297},"sort",[1050,7469,1301],{"class":1195},[1050,7471,7472],{"class":2764},"key",[1050,7474,1294],{"class":1195},[1050,7476,7477],{"class":1226},"lambda",[1050,7479,7480],{"class":1349}," x",[1050,7482,1654],{"class":1195},[1050,7484,7480],{"class":1297},[1050,7486,1591],{"class":1195},[1050,7488,7489],{"class":2242},"1",[1050,7491,7492],{"class":1195},"])\n",[1050,7494,7495],{"class":1052,"line":4290},[1050,7496,1477],{"class":1191},[1050,7498,7499],{"class":1052,"line":4296},[1050,7500,7501],{"class":1056},"        # Build timeline with state at each migration\n",[1050,7503,7504,7507,7509],{"class":1052,"line":4315},[1050,7505,7506],{"class":1191},"        previous_state ",[1050,7508,1294],{"class":1195},[1050,7510,7511],{"class":2785}," None\n",[1050,7513,7514],{"class":1052,"line":4371},[1050,7515,1477],{"class":1191},[1050,7517,7518,7520,7522,7524,7527],{"class":1052,"line":4392},[1050,7519,1555],{"class":1187},[1050,7521,7393],{"class":1191},[1050,7523,1561],{"class":1187},[1050,7525,7526],{"class":1191}," app_migrations",[1050,7528,1234],{"class":1195},[1050,7530,7531,7534,7536,7538,7540,7543,7545,7548,7550],{"class":1052,"line":4412},[1050,7532,7533],{"class":1191},"            current_state ",[1050,7535,1294],{"class":1195},[1050,7537,1868],{"class":1836},[1050,7539,1196],{"class":1195},[1050,7541,7542],{"class":1297},"get_state_at_migration",[1050,7544,1301],{"class":1195},[1050,7546,7547],{"class":1404},"*",[1050,7549,7446],{"class":1297},[1050,7551,1307],{"class":1195},[1050,7553,7554],{"class":1052,"line":4423},[1050,7555,2189],{"class":1191},[1050,7557,7558,7561,7563],{"class":1052,"line":4429},[1050,7559,7560],{"class":1191},"            timeline_entry ",[1050,7562,1294],{"class":1195},[1050,7564,3116],{"class":1195},[1050,7566,7567,7569,7571,7573,7575,7577,7579,7581,7583,7585,7587,7589,7591,7593,7595,7597,7599,7601,7603,7605,7607],{"class":1052,"line":4434},[1050,7568,2000],{"class":1643},[1050,7570,2003],{"class":1647},[1050,7572,1651],{"class":1643},[1050,7574,1654],{"class":1195},[1050,7576,2010],{"class":1226},[1050,7578,2013],{"class":1647},[1050,7580,2017],{"class":2016},[1050,7582,7446],{"class":1191},[1050,7584,1591],{"class":1195},[1050,7586,7423],{"class":2242},[1050,7588,2290],{"class":1195},[1050,7590,2026],{"class":2016},[1050,7592,1196],{"class":1647},[1050,7594,2017],{"class":2016},[1050,7596,7446],{"class":1191},[1050,7598,1591],{"class":1195},[1050,7600,7489],{"class":2242},[1050,7602,2290],{"class":1195},[1050,7604,2026],{"class":2016},[1050,7606,2013],{"class":1647},[1050,7608,1660],{"class":1195},[1050,7610,7611,7613,7616,7618,7620,7622,7624],{"class":1052,"line":4452},[1050,7612,2000],{"class":1643},[1050,7614,7615],{"class":1647},"timestamp",[1050,7617,1651],{"class":1643},[1050,7619,1654],{"class":1195},[1050,7621,4849],{"class":2785},[1050,7623,1353],{"class":1195},[1050,7625,7626],{"class":1056},"  # Would need to get from migration recorder\n",[1050,7628,7629],{"class":1052,"line":4472},[1050,7630,2084],{"class":1195},[1050,7632,7633],{"class":1052,"line":4482},[1050,7634,2189],{"class":1191},[1050,7636,7637,7639,7642],{"class":1052,"line":4488},[1050,7638,2226],{"class":1187},[1050,7640,7641],{"class":1191}," previous_state",[1050,7643,1234],{"class":1195},[1050,7645,7646,7649,7651,7653,7655,7657,7659,7661,7663,7665,7668,7670,7673,7675,7678],{"class":1052,"line":4493},[1050,7647,7648],{"class":1191},"                timeline_entry",[1050,7650,1591],{"class":1195},[1050,7652,1651],{"class":1643},[1050,7654,2756],{"class":1647},[1050,7656,1651],{"class":1643},[1050,7658,2290],{"class":1195},[1050,7660,1844],{"class":1195},[1050,7662,1868],{"class":1836},[1050,7664,1196],{"class":1195},[1050,7666,7667],{"class":1297},"compare_states",[1050,7669,1301],{"class":1195},[1050,7671,7672],{"class":1297},"previous_state",[1050,7674,1353],{"class":1195},[1050,7676,7677],{"class":1297}," current_state",[1050,7679,1307],{"class":1195},[1050,7681,7682,7685],{"class":1052,"line":4521},[1050,7683,7684],{"class":1187},"            else",[1050,7686,1234],{"class":1195},[1050,7688,7689,7691,7693,7695,7697,7699,7701,7703,7706,7708,7711,7713,7715,7717],{"class":1052,"line":4540},[1050,7690,7648],{"class":1191},[1050,7692,1591],{"class":1195},[1050,7694,1651],{"class":1643},[1050,7696,2756],{"class":1647},[1050,7698,1651],{"class":1643},[1050,7700,2290],{"class":1195},[1050,7702,1844],{"class":1195},[1050,7704,7705],{"class":1195}," {",[1050,7707,1651],{"class":1643},[1050,7709,7710],{"class":1647},"initial",[1050,7712,1651],{"class":1643},[1050,7714,1654],{"class":1195},[1050,7716,3186],{"class":2785},[1050,7718,4130],{"class":1195},[1050,7720,7721],{"class":1052,"line":4550},[1050,7722,2189],{"class":1191},[1050,7724,7725,7728,7730,7732,7734,7737],{"class":1052,"line":4555},[1050,7726,7727],{"class":1191},"            timeline",[1050,7729,1196],{"class":1195},[1050,7731,1634],{"class":1297},[1050,7733,1301],{"class":1195},[1050,7735,7736],{"class":1297},"timeline_entry",[1050,7738,1307],{"class":1195},[1050,7740,7741,7744,7746],{"class":1052,"line":4560},[1050,7742,7743],{"class":1191},"            previous_state ",[1050,7745,1294],{"class":1195},[1050,7747,7748],{"class":1191}," current_state\n",[1050,7750,7751],{"class":1052,"line":4568},[1050,7752,1477],{"class":1191},[1050,7754,7755,7757],{"class":1052,"line":4573},[1050,7756,1313],{"class":1187},[1050,7758,7759],{"class":1191}," timeline\n",[1050,7761,7762],{"class":1052,"line":4579},[1050,7763,1070],{"emptyLinePlaceholder":1069},[1050,7765,7766],{"class":1052,"line":4589},[1050,7767,7768],{"class":1056},"# Schema editor integration\n",[1050,7770,7771,7773,7776],{"class":1052,"line":4599},[1050,7772,1227],{"class":1226},[1050,7774,7775],{"class":1230}," SchemaEditorAnalyzer",[1050,7777,1234],{"class":1195},[1050,7779,7780,7782,7785],{"class":1052,"line":4604},[1050,7781,1240],{"class":1082},[1050,7783,7784],{"class":1089},"Analyze how schema editor generates SQL",[1050,7786,1083],{"class":1082},[1050,7788,7789],{"class":1052,"line":4611},[1050,7790,1251],{"class":1191},[1050,7792,7793,7795],{"class":1052,"line":4629},[1050,7794,1257],{"class":1195},[1050,7796,1261],{"class":1260},[1050,7798,7799,7801,7804,7806,7808,7810,7813,7815,7817],{"class":1052,"line":4639},[1050,7800,1267],{"class":1226},[1050,7802,7803],{"class":1270}," analyze_sql_generation",[1050,7805,1301],{"class":1195},[1050,7807,3025],{"class":1349},[1050,7809,1353],{"class":1195},[1050,7811,7812],{"class":1349}," model_state",[1050,7814,1294],{"class":1404},[1050,7816,2786],{"class":2785},[1050,7818,1359],{"class":1195},[1050,7820,7821,7823,7826],{"class":1052,"line":4644},[1050,7822,1280],{"class":1082},[1050,7824,7825],{"class":1089},"Analyze SQL generation for an operation",[1050,7827,1083],{"class":1082},[1050,7829,7830],{"class":1052,"line":4667},[1050,7831,1477],{"class":1191},[1050,7833,7834,7837,7839],{"class":1052,"line":4690},[1050,7835,7836],{"class":1191},"        sql_info ",[1050,7838,1294],{"class":1195},[1050,7840,3116],{"class":1195},[1050,7842,7843,7845,7847,7849,7851,7853,7855,7857,7859,7861],{"class":1052,"line":4695},[1050,7844,3135],{"class":1643},[1050,7846,3025],{"class":1647},[1050,7848,1651],{"class":1643},[1050,7850,1654],{"class":1195},[1050,7852,4048],{"class":1191},[1050,7854,1196],{"class":1195},[1050,7856,3031],{"class":3030},[1050,7858,1196],{"class":1195},[1050,7860,3036],{"class":3030},[1050,7862,1660],{"class":1195},[1050,7864,7865,7867,7870,7872,7874],{"class":1052,"line":4701},[1050,7866,3135],{"class":1643},[1050,7868,7869],{"class":1647},"sql_statements",[1050,7871,1651],{"class":1643},[1050,7873,1654],{"class":1195},[1050,7875,5913],{"class":1195},[1050,7877,7878,7880,7883,7885,7887,7889,7891,7894],{"class":1052,"line":4716},[1050,7879,3135],{"class":1643},[1050,7881,7882],{"class":1647},"database_vendor",[1050,7884,1651],{"class":1643},[1050,7886,1654],{"class":1195},[1050,7888,4921],{"class":1191},[1050,7890,1196],{"class":1195},[1050,7892,7893],{"class":1521},"vendor",[1050,7895,1660],{"class":1195},[1050,7897,7898],{"class":1052,"line":4741},[1050,7899,4282],{"class":1195},[1050,7901,7902],{"class":1052,"line":4746},[1050,7903,1477],{"class":1191},[1050,7905,7906,7909],{"class":1052,"line":4752},[1050,7907,7908],{"class":1187},"        try",[1050,7910,1234],{"class":1195},[1050,7912,7913,7916,7918,7920,7922,7924,7926,7928],{"class":1052,"line":4762},[1050,7914,7915],{"class":1187},"            with",[1050,7917,4921],{"class":1191},[1050,7919,1196],{"class":1195},[1050,7921,4926],{"class":1297},[1050,7923,4929],{"class":1195},[1050,7925,4932],{"class":1187},[1050,7927,4935],{"class":1191},[1050,7929,1234],{"class":1195},[1050,7931,7932],{"class":1052,"line":4767},[1050,7933,7934],{"class":1056},"                # Capture SQL statements\n",[1050,7936,7937,7940,7942,7944,7946],{"class":1052,"line":4784},[1050,7938,7939],{"class":1191},"                original_execute ",[1050,7941,1294],{"class":1195},[1050,7943,4935],{"class":1191},[1050,7945,1196],{"class":1195},[1050,7947,7948],{"class":1521},"execute\n",[1050,7950,7951,7954,7956],{"class":1052,"line":4794},[1050,7952,7953],{"class":1191},"                captured_sql ",[1050,7955,1294],{"class":1195},[1050,7957,1549],{"class":1195},[1050,7959,7960],{"class":1052,"line":4817},[1050,7961,2989],{"class":1191},[1050,7963,7964,7967,7970,7972,7975,7977,7980,7982],{"class":1052,"line":4837},[1050,7965,7966],{"class":1226},"                def",[1050,7968,7969],{"class":1270}," capture_sql",[1050,7971,1301],{"class":1195},[1050,7973,7974],{"class":1349},"sql",[1050,7976,1353],{"class":1195},[1050,7978,7979],{"class":1349}," params",[1050,7981,1294],{"class":1404},[1050,7983,6345],{"class":1195},[1050,7985,7986,7989,7991,7993],{"class":1052,"line":4854},[1050,7987,7988],{"class":1191},"                    captured_sql",[1050,7990,1196],{"class":1195},[1050,7992,1634],{"class":1297},[1050,7994,1637],{"class":1195},[1050,7996,7997,8000,8002,8004,8006,8009],{"class":1052,"line":4885},[1050,7998,7999],{"class":1643},"                        '",[1050,8001,7974],{"class":1647},[1050,8003,1651],{"class":1643},[1050,8005,1654],{"class":1195},[1050,8007,8008],{"class":1297}," sql",[1050,8010,1660],{"class":1195},[1050,8012,8013,8015,8018,8020,8022],{"class":1052,"line":4890},[1050,8014,7999],{"class":1643},[1050,8016,8017],{"class":1647},"params",[1050,8019,1651],{"class":1643},[1050,8021,1654],{"class":1195},[1050,8023,8024],{"class":1297}," params\n",[1050,8026,8027],{"class":1052,"line":4895},[1050,8028,8029],{"class":1195},"                    })\n",[1050,8031,8032,8034,8037,8039,8041,8043,8045],{"class":1052,"line":4901},[1050,8033,6529],{"class":1187},[1050,8035,8036],{"class":1297}," original_execute",[1050,8038,1301],{"class":1195},[1050,8040,7974],{"class":1297},[1050,8042,1353],{"class":1195},[1050,8044,7979],{"class":1297},[1050,8046,1307],{"class":1195},[1050,8048,8049],{"class":1052,"line":4909},[1050,8050,2989],{"class":1191},[1050,8052,8053,8056,8058,8061,8063],{"class":1052,"line":4915},[1050,8054,8055],{"class":1191},"                schema_editor",[1050,8057,1196],{"class":1195},[1050,8059,8060],{"class":1521},"execute",[1050,8062,1844],{"class":1195},[1050,8064,8065],{"class":1191}," capture_sql\n",[1050,8067,8068],{"class":1052,"line":4940},[1050,8069,2989],{"class":1191},[1050,8071,8072],{"class":1052,"line":4963},[1050,8073,8074],{"class":1056},"                # Execute operation (in dry-run mode)\n",[1050,8076,8077,8080],{"class":1052,"line":4969},[1050,8078,8079],{"class":1187},"                try",[1050,8081,1234],{"class":1195},[1050,8083,8084,8086,8088,8090,8092,8094,8096,8098,8100],{"class":1052,"line":4975},[1050,8085,4943],{"class":1187},[1050,8087,4320],{"class":1796},[1050,8089,1301],{"class":1195},[1050,8091,3025],{"class":1297},[1050,8093,1353],{"class":1195},[1050,8095,3145],{"class":1643},[1050,8097,4956],{"class":1647},[1050,8099,1651],{"class":1643},[1050,8101,1359],{"class":1195},[1050,8103,8104],{"class":1052,"line":4997},[1050,8105,8106],{"class":1056},"                        # This would need proper state setup for real execution\n",[1050,8108,8109],{"class":1052,"line":5005},[1050,8110,8111],{"class":1187},"                        pass\n",[1050,8113,8114,8117,8120,8122,8125],{"class":1052,"line":5024},[1050,8115,8116],{"class":1187},"                except",[1050,8118,8119],{"class":1260}," Exception",[1050,8121,4932],{"class":1187},[1050,8123,8124],{"class":1191}," e",[1050,8126,1234],{"class":1195},[1050,8128,8129,8132,8134,8136,8139,8141,8143,8145,8147,8149,8152],{"class":1052,"line":5032},[1050,8130,8131],{"class":1191},"                    sql_info",[1050,8133,1591],{"class":1195},[1050,8135,1651],{"class":1643},[1050,8137,8138],{"class":1647},"error",[1050,8140,1651],{"class":1643},[1050,8142,2290],{"class":1195},[1050,8144,1844],{"class":1195},[1050,8146,4828],{"class":1260},[1050,8148,1301],{"class":1195},[1050,8150,8151],{"class":1297},"e",[1050,8153,1307],{"class":1195},[1050,8155,8156],{"class":1052,"line":5056},[1050,8157,2989],{"class":1191},[1050,8159,8160,8163,8165,8167,8169,8171,8173,8175],{"class":1052,"line":5061},[1050,8161,8162],{"class":1191},"                sql_info",[1050,8164,1591],{"class":1195},[1050,8166,1651],{"class":1643},[1050,8168,7869],{"class":1647},[1050,8170,1651],{"class":1643},[1050,8172,2290],{"class":1195},[1050,8174,1844],{"class":1195},[1050,8176,8177],{"class":1191}," captured_sql\n",[1050,8179,8180],{"class":1052,"line":5078},[1050,8181,1477],{"class":1191},[1050,8183,8184,8187,8189,8191,8193],{"class":1052,"line":5083},[1050,8185,8186],{"class":1187},"        except",[1050,8188,8119],{"class":1260},[1050,8190,4932],{"class":1187},[1050,8192,8124],{"class":1191},[1050,8194,1234],{"class":1195},[1050,8196,8197,8200,8202,8204,8206,8208,8210,8212,8214,8217,8219,8221,8223],{"class":1052,"line":5090},[1050,8198,8199],{"class":1191},"            sql_info",[1050,8201,1591],{"class":1195},[1050,8203,1651],{"class":1643},[1050,8205,8138],{"class":1647},[1050,8207,1651],{"class":1643},[1050,8209,2290],{"class":1195},[1050,8211,1844],{"class":1195},[1050,8213,2010],{"class":1226},[1050,8215,8216],{"class":1647},"\"Could not analyze SQL generation: ",[1050,8218,2017],{"class":2016},[1050,8220,8151],{"class":1191},[1050,8222,2026],{"class":2016},[1050,8224,8225],{"class":1647},"\"\n",[1050,8227,8228],{"class":1052,"line":5123},[1050,8229,1477],{"class":1191},[1050,8231,8232,8234],{"class":1052,"line":5142},[1050,8233,1313],{"class":1187},[1050,8235,8236],{"class":1191}," sql_info\n",[1050,8238,8239],{"class":1052,"line":5158},[1050,8240,1251],{"class":1191},[1050,8242,8243,8245],{"class":1052,"line":5190},[1050,8244,1257],{"class":1195},[1050,8246,1261],{"class":1260},[1050,8248,8249,8251,8254],{"class":1052,"line":5195},[1050,8250,1267],{"class":1226},[1050,8252,8253],{"class":1270}," get_database_specific_features",[1050,8255,1274],{"class":1195},[1050,8257,8258,8260,8263],{"class":1052,"line":5200},[1050,8259,1280],{"class":1082},[1050,8261,8262],{"class":1089},"Get database-specific migration features",[1050,8264,1083],{"class":1082},[1050,8266,8267],{"class":1052,"line":5207},[1050,8268,1477],{"class":1191},[1050,8270,8271,8274,8276],{"class":1052,"line":5225},[1050,8272,8273],{"class":1191},"        features ",[1050,8275,1294],{"class":1195},[1050,8277,3116],{"class":1195},[1050,8279,8280,8282,8284,8286,8288,8290,8292,8294],{"class":1052,"line":5235},[1050,8281,3135],{"class":1643},[1050,8283,7893],{"class":1647},[1050,8285,1651],{"class":1643},[1050,8287,1654],{"class":1195},[1050,8289,4921],{"class":1191},[1050,8291,1196],{"class":1195},[1050,8293,7893],{"class":1521},[1050,8295,1660],{"class":1195},[1050,8297,8298,8300,8303,8305,8307,8309,8311,8314,8316,8318],{"class":1052,"line":5240},[1050,8299,3135],{"class":1643},[1050,8301,8302],{"class":1647},"supports_transactions",[1050,8304,1651],{"class":1643},[1050,8306,1654],{"class":1195},[1050,8308,4921],{"class":1191},[1050,8310,1196],{"class":1195},[1050,8312,8313],{"class":1521},"features",[1050,8315,1196],{"class":1195},[1050,8317,8302],{"class":1521},[1050,8319,1660],{"class":1195},[1050,8321,8322,8324,8327,8329,8331,8333,8335,8337,8339,8341],{"class":1052,"line":5263},[1050,8323,3135],{"class":1643},[1050,8325,8326],{"class":1647},"supports_atomic_references_rename",[1050,8328,1651],{"class":1643},[1050,8330,1654],{"class":1195},[1050,8332,4921],{"class":1191},[1050,8334,1196],{"class":1195},[1050,8336,8313],{"class":1521},[1050,8338,1196],{"class":1195},[1050,8340,8326],{"class":1521},[1050,8342,1660],{"class":1195},[1050,8344,8345,8347,8350,8352,8354,8356,8358,8360,8362,8364],{"class":1052,"line":5268},[1050,8346,3135],{"class":1643},[1050,8348,8349],{"class":1647},"supports_foreign_keys",[1050,8351,1651],{"class":1643},[1050,8353,1654],{"class":1195},[1050,8355,4921],{"class":1191},[1050,8357,1196],{"class":1195},[1050,8359,8313],{"class":1521},[1050,8361,1196],{"class":1195},[1050,8363,8349],{"class":1521},[1050,8365,1660],{"class":1195},[1050,8367,8368,8370,8373,8375,8377,8379,8381,8383,8385,8387],{"class":1052,"line":5283},[1050,8369,3135],{"class":1643},[1050,8371,8372],{"class":1647},"supports_check_constraints",[1050,8374,1651],{"class":1643},[1050,8376,1654],{"class":1195},[1050,8378,4921],{"class":1191},[1050,8380,1196],{"class":1195},[1050,8382,8313],{"class":1521},[1050,8384,1196],{"class":1195},[1050,8386,8372],{"class":1521},[1050,8388,1660],{"class":1195},[1050,8390,8391,8393,8396,8398,8400,8402,8404,8406,8408,8410],{"class":1052,"line":5306},[1050,8392,3135],{"class":1643},[1050,8394,8395],{"class":1647},"supports_partial_indexes",[1050,8397,1651],{"class":1643},[1050,8399,1654],{"class":1195},[1050,8401,4921],{"class":1191},[1050,8403,1196],{"class":1195},[1050,8405,8313],{"class":1521},[1050,8407,1196],{"class":1195},[1050,8409,8395],{"class":1521},[1050,8411,1660],{"class":1195},[1050,8413,8414,8416,8419,8421,8423,8425,8427,8429,8431,8433],{"class":1052,"line":5311},[1050,8415,3135],{"class":1643},[1050,8417,8418],{"class":1647},"supports_functions_in_partial_indexes",[1050,8420,1651],{"class":1643},[1050,8422,1654],{"class":1195},[1050,8424,4921],{"class":1191},[1050,8426,1196],{"class":1195},[1050,8428,8313],{"class":1521},[1050,8430,1196],{"class":1195},[1050,8432,8418],{"class":1521},[1050,8434,1660],{"class":1195},[1050,8436,8437,8439,8442,8444,8446,8448,8450,8452,8454,8456],{"class":1052,"line":5321},[1050,8438,3135],{"class":1643},[1050,8440,8441],{"class":1647},"supports_expression_indexes",[1050,8443,1651],{"class":1643},[1050,8445,1654],{"class":1195},[1050,8447,4921],{"class":1191},[1050,8449,1196],{"class":1195},[1050,8451,8313],{"class":1521},[1050,8453,1196],{"class":1195},[1050,8455,8441],{"class":1521},[1050,8457,1660],{"class":1195},[1050,8459,8460,8462,8465,8467,8469,8471,8473,8475,8477,8479],{"class":1052,"line":5326},[1050,8461,3135],{"class":1643},[1050,8463,8464],{"class":1647},"supports_timezones",[1050,8466,1651],{"class":1643},[1050,8468,1654],{"class":1195},[1050,8470,4921],{"class":1191},[1050,8472,1196],{"class":1195},[1050,8474,8313],{"class":1521},[1050,8476,1196],{"class":1195},[1050,8478,8464],{"class":1521},[1050,8480,1660],{"class":1195},[1050,8482,8483],{"class":1052,"line":5332},[1050,8484,4282],{"class":1195},[1050,8486,8487],{"class":1052,"line":5354},[1050,8488,1477],{"class":1191},[1050,8490,8491],{"class":1052,"line":5364},[1050,8492,8493],{"class":1056},"        # Add vendor-specific features\n",[1050,8495,8496,8498,8500,8502,8504,8506,8508,8511,8513],{"class":1052,"line":5387},[1050,8497,2875],{"class":1187},[1050,8499,4921],{"class":1191},[1050,8501,1196],{"class":1195},[1050,8503,7893],{"class":1521},[1050,8505,7428],{"class":1404},[1050,8507,3145],{"class":1643},[1050,8509,8510],{"class":1647},"postgresql",[1050,8512,1651],{"class":1643},[1050,8514,1234],{"class":1195},[1050,8516,8517,8520,8522,8525],{"class":1052,"line":5415},[1050,8518,8519],{"class":1191},"            features",[1050,8521,1196],{"class":1195},[1050,8523,8524],{"class":1297},"update",[1050,8526,1637],{"class":1195},[1050,8528,8529,8531,8534,8536,8538,8540],{"class":1052,"line":5434},[1050,8530,2000],{"class":1643},[1050,8532,8533],{"class":1647},"supports_concurrent_index_creation",[1050,8535,1651],{"class":1643},[1050,8537,1654],{"class":1195},[1050,8539,3186],{"class":2785},[1050,8541,1660],{"class":1195},[1050,8543,8544,8546,8549,8551,8553,8555],{"class":1052,"line":5439},[1050,8545,2000],{"class":1643},[1050,8547,8548],{"class":1647},"supports_gin_indexes",[1050,8550,1651],{"class":1643},[1050,8552,1654],{"class":1195},[1050,8554,3186],{"class":2785},[1050,8556,1660],{"class":1195},[1050,8558,8559,8561,8564,8566,8568,8570],{"class":1052,"line":5444},[1050,8560,2000],{"class":1643},[1050,8562,8563],{"class":1647},"supports_jsonb",[1050,8565,1651],{"class":1643},[1050,8567,1654],{"class":1195},[1050,8569,3186],{"class":2785},[1050,8571,1660],{"class":1195},[1050,8573,8574,8576,8579,8581,8583,8585],{"class":1052,"line":5450},[1050,8575,2000],{"class":1643},[1050,8577,8578],{"class":1647},"supports_arrays",[1050,8580,1651],{"class":1643},[1050,8582,1654],{"class":1195},[1050,8584,3186],{"class":2785},[1050,8586,1660],{"class":1195},[1050,8588,8589],{"class":1052,"line":5483},[1050,8590,8591],{"class":1195},"            })\n",[1050,8593,8594,8596,8598,8600,8602,8604,8606,8609,8611],{"class":1052,"line":5509},[1050,8595,4437],{"class":1187},[1050,8597,4921],{"class":1191},[1050,8599,1196],{"class":1195},[1050,8601,7893],{"class":1521},[1050,8603,7428],{"class":1404},[1050,8605,3145],{"class":1643},[1050,8607,8608],{"class":1647},"mysql",[1050,8610,1651],{"class":1643},[1050,8612,1234],{"class":1195},[1050,8614,8615,8617,8619,8621],{"class":1052,"line":5514},[1050,8616,8519],{"class":1191},[1050,8618,1196],{"class":1195},[1050,8620,8524],{"class":1297},[1050,8622,1637],{"class":1195},[1050,8624,8625,8627,8630,8632,8634,8636],{"class":1052,"line":5531},[1050,8626,2000],{"class":1643},[1050,8628,8629],{"class":1647},"supports_fulltext_indexes",[1050,8631,1651],{"class":1643},[1050,8633,1654],{"class":1195},[1050,8635,3186],{"class":2785},[1050,8637,1660],{"class":1195},[1050,8639,8640,8642,8645,8647,8649,8651],{"class":1052,"line":5536},[1050,8641,2000],{"class":1643},[1050,8643,8644],{"class":1647},"supports_spatial_indexes",[1050,8646,1651],{"class":1643},[1050,8648,1654],{"class":1195},[1050,8650,3186],{"class":2785},[1050,8652,1660],{"class":1195},[1050,8654,8655],{"class":1052,"line":5543},[1050,8656,8591],{"class":1195},[1050,8658,8659,8661,8663,8665,8667,8669,8671,8674,8676],{"class":1052,"line":5576},[1050,8660,4437],{"class":1187},[1050,8662,4921],{"class":1191},[1050,8664,1196],{"class":1195},[1050,8666,7893],{"class":1521},[1050,8668,7428],{"class":1404},[1050,8670,3145],{"class":1643},[1050,8672,8673],{"class":1647},"sqlite",[1050,8675,1651],{"class":1643},[1050,8677,1234],{"class":1195},[1050,8679,8680,8682,8684,8686],{"class":1052,"line":5593},[1050,8681,8519],{"class":1191},[1050,8683,1196],{"class":1195},[1050,8685,8524],{"class":1297},[1050,8687,1637],{"class":1195},[1050,8689,8690,8692,8695,8697,8699,8701],{"class":1052,"line":5635},[1050,8691,2000],{"class":1643},[1050,8693,8694],{"class":1647},"supports_fts",[1050,8696,1651],{"class":1643},[1050,8698,1654],{"class":1195},[1050,8700,3186],{"class":2785},[1050,8702,1660],{"class":1195},[1050,8704,8706,8708,8711,8713,8715,8717],{"class":1052,"line":8705},238,[1050,8707,2000],{"class":1643},[1050,8709,8710],{"class":1647},"limited_alter_table",[1050,8712,1651],{"class":1643},[1050,8714,1654],{"class":1195},[1050,8716,3186],{"class":2785},[1050,8718,1660],{"class":1195},[1050,8720,8722],{"class":1052,"line":8721},239,[1050,8723,8591],{"class":1195},[1050,8725,8727],{"class":1052,"line":8726},240,[1050,8728,1477],{"class":1191},[1050,8730,8732,8734],{"class":1052,"line":8731},241,[1050,8733,1313],{"class":1187},[1050,8735,8736],{"class":1191}," features\n",[1050,8738,8740],{"class":1052,"line":8739},242,[1050,8741,1070],{"emptyLinePlaceholder":1069},[1050,8743,8745],{"class":1052,"line":8744},243,[1050,8746,8747],{"class":1056},"# Migration optimization analyzer\n",[1050,8749,8751,8753,8756],{"class":1052,"line":8750},244,[1050,8752,1227],{"class":1226},[1050,8754,8755],{"class":1230}," MigrationOptimizationAnalyzer",[1050,8757,1234],{"class":1195},[1050,8759,8761,8763,8766],{"class":1052,"line":8760},245,[1050,8762,1240],{"class":1082},[1050,8764,8765],{"class":1089},"Analyze migrations for optimization opportunities",[1050,8767,1083],{"class":1082},[1050,8769,8771],{"class":1052,"line":8770},246,[1050,8772,1251],{"class":1191},[1050,8774,8776,8778],{"class":1052,"line":8775},247,[1050,8777,1257],{"class":1195},[1050,8779,1261],{"class":1260},[1050,8781,8783,8785,8788,8790,8792],{"class":1052,"line":8782},248,[1050,8784,1267],{"class":1226},[1050,8786,8787],{"class":1270}," analyze_migration_performance",[1050,8789,1301],{"class":1195},[1050,8791,2003],{"class":1349},[1050,8793,1359],{"class":1195},[1050,8795,8797,8799,8802],{"class":1052,"line":8796},249,[1050,8798,1280],{"class":1082},[1050,8800,8801],{"class":1089},"Analyze migration for performance issues",[1050,8803,1083],{"class":1082},[1050,8805,8807],{"class":1052,"line":8806},250,[1050,8808,1477],{"class":1191},[1050,8810,8812,8815,8817],{"class":1052,"line":8811},251,[1050,8813,8814],{"class":1191},"        analysis ",[1050,8816,1294],{"class":1195},[1050,8818,3116],{"class":1195},[1050,8820,8822,8824,8826,8828,8830,8832,8834,8836,8838,8840,8842,8844,8846,8848,8850,8852,8854,8856,8858],{"class":1052,"line":8821},252,[1050,8823,3135],{"class":1643},[1050,8825,2003],{"class":1647},[1050,8827,1651],{"class":1643},[1050,8829,1654],{"class":1195},[1050,8831,2010],{"class":1226},[1050,8833,2013],{"class":1647},[1050,8835,2017],{"class":2016},[1050,8837,2003],{"class":1191},[1050,8839,1196],{"class":1195},[1050,8841,1350],{"class":1521},[1050,8843,2026],{"class":2016},[1050,8845,1196],{"class":1647},[1050,8847,2017],{"class":2016},[1050,8849,2003],{"class":1191},[1050,8851,1196],{"class":1195},[1050,8853,1668],{"class":1521},[1050,8855,2026],{"class":2016},[1050,8857,2013],{"class":1647},[1050,8859,1660],{"class":1195},[1050,8861,8863,8865,8868,8870,8872],{"class":1052,"line":8862},253,[1050,8864,3135],{"class":1643},[1050,8866,8867],{"class":1647},"performance_concerns",[1050,8869,1651],{"class":1643},[1050,8871,1654],{"class":1195},[1050,8873,5913],{"class":1195},[1050,8875,8877,8879,8882,8884,8886],{"class":1052,"line":8876},254,[1050,8878,3135],{"class":1643},[1050,8880,8881],{"class":1647},"optimization_suggestions",[1050,8883,1651],{"class":1643},[1050,8885,1654],{"class":1195},[1050,8887,5913],{"class":1195},[1050,8889,8891,8893,8896,8898,8900,8902,8905,8907],{"class":1052,"line":8890},255,[1050,8892,3135],{"class":1643},[1050,8894,8895],{"class":1647},"estimated_impact",[1050,8897,1651],{"class":1643},[1050,8899,1654],{"class":1195},[1050,8901,3145],{"class":1643},[1050,8903,8904],{"class":1647},"low",[1050,8906,1651],{"class":1643},[1050,8908,1660],{"class":1195},[1050,8910,8912],{"class":1052,"line":8911},256,[1050,8913,4282],{"class":1195},[1050,8915,8917],{"class":1052,"line":8916},257,[1050,8918,1477],{"class":1191},[1050,8920,8922,8924,8926,8928,8930,8932,8934],{"class":1052,"line":8921},258,[1050,8923,1555],{"class":1187},[1050,8925,2997],{"class":1191},[1050,8927,1561],{"class":1187},[1050,8929,1727],{"class":1191},[1050,8931,1196],{"class":1195},[1050,8933,3006],{"class":1521},[1050,8935,1234],{"class":1195},[1050,8937,8939,8942,8944,8946,8948,8950,8952],{"class":1052,"line":8938},259,[1050,8940,8941],{"class":1191},"            operation_name ",[1050,8943,1294],{"class":1195},[1050,8945,4048],{"class":1191},[1050,8947,1196],{"class":1195},[1050,8949,3031],{"class":3030},[1050,8951,1196],{"class":1195},[1050,8953,4057],{"class":3030},[1050,8955,8957],{"class":1052,"line":8956},260,[1050,8958,2189],{"class":1191},[1050,8960,8962],{"class":1052,"line":8961},261,[1050,8963,8964],{"class":1056},"            # Analyze specific operations\n",[1050,8966,8968,8970,8972,8974,8976,8978,8980],{"class":1052,"line":8967},262,[1050,8969,2226],{"class":1187},[1050,8971,4301],{"class":1191},[1050,8973,4304],{"class":1404},[1050,8975,3145],{"class":1643},[1050,8977,3302],{"class":1647},[1050,8979,1651],{"class":1643},[1050,8981,1234],{"class":1195},[1050,8983,8985,8987,8989,8991,8993,8995,8997,8999,9001],{"class":1052,"line":8984},263,[1050,8986,2404],{"class":1187},[1050,8988,4320],{"class":1796},[1050,8990,1301],{"class":1195},[1050,8992,3025],{"class":1297},[1050,8994,1353],{"class":1195},[1050,8996,3145],{"class":1643},[1050,8998,4331],{"class":1647},[1050,9000,1651],{"class":1643},[1050,9002,1359],{"class":1195},[1050,9004,9006,9009,9011,9013,9015],{"class":1052,"line":9005},264,[1050,9007,9008],{"class":1191},"                    field ",[1050,9010,1294],{"class":1195},[1050,9012,4048],{"class":1191},[1050,9014,1196],{"class":1195},[1050,9016,9017],{"class":1521},"field\n",[1050,9019,9021],{"class":1052,"line":9020},265,[1050,9022,9023],{"class":1191},"                    \n",[1050,9025,9027],{"class":1052,"line":9026},266,[1050,9028,9029],{"class":1056},"                    # Check for potentially slow operations\n",[1050,9031,9033,9035,9037,9039,9041,9043,9045,9048,9050,9052,9054,9057,9059,9061],{"class":1052,"line":9032},267,[1050,9034,4943],{"class":1187},[1050,9036,4320],{"class":1796},[1050,9038,1301],{"class":1195},[1050,9040,4331],{"class":1297},[1050,9042,1353],{"class":1195},[1050,9044,3145],{"class":1643},[1050,9046,9047],{"class":1647},"db_index",[1050,9049,1651],{"class":1643},[1050,9051,1401],{"class":1195},[1050,9053,4338],{"class":1404},[1050,9055,9056],{"class":1191}," field",[1050,9058,1196],{"class":1195},[1050,9060,9047],{"class":1521},[1050,9062,1234],{"class":1195},[1050,9064,9066,9069,9071,9073,9075,9077,9079,9081],{"class":1052,"line":9065},268,[1050,9067,9068],{"class":1191},"                        analysis",[1050,9070,1591],{"class":1195},[1050,9072,1651],{"class":1643},[1050,9074,8867],{"class":1647},[1050,9076,1651],{"class":1643},[1050,9078,4405],{"class":1195},[1050,9080,1634],{"class":1297},[1050,9082,2759],{"class":1195},[1050,9084,9086,9089,9092,9094,9096,9098,9100,9102],{"class":1052,"line":9085},269,[1050,9087,9088],{"class":1226},"                            f",[1050,9090,9091],{"class":1647},"\"Adding indexed field '",[1050,9093,2017],{"class":2016},[1050,9095,3025],{"class":1297},[1050,9097,1196],{"class":1195},[1050,9099,1668],{"class":1521},[1050,9101,2026],{"class":2016},[1050,9103,9104],{"class":1647},"' may be slow on large tables\"\n",[1050,9106,9108],{"class":1052,"line":9107},270,[1050,9109,9110],{"class":1195},"                        )\n",[1050,9112,9114,9116,9118,9120,9122,9124,9126,9128],{"class":1052,"line":9113},271,[1050,9115,9068],{"class":1191},[1050,9117,1591],{"class":1195},[1050,9119,1651],{"class":1643},[1050,9121,8881],{"class":1647},[1050,9123,1651],{"class":1643},[1050,9125,4405],{"class":1195},[1050,9127,1634],{"class":1297},[1050,9129,2759],{"class":1195},[1050,9131,9133,9136,9139],{"class":1052,"line":9132},272,[1050,9134,9135],{"class":1643},"                            \"",[1050,9137,9138],{"class":1647},"Consider creating index separately with CREATE INDEX CONCURRENTLY",[1050,9140,8225],{"class":1643},[1050,9142,9144],{"class":1052,"line":9143},273,[1050,9145,9110],{"class":1195},[1050,9147,9149],{"class":1052,"line":9148},274,[1050,9150,9023],{"class":1191},[1050,9152,9154,9156,9158,9160,9162,9164,9166,9168,9170,9172,9174,9176,9178,9180,9182],{"class":1052,"line":9153},275,[1050,9155,4943],{"class":1187},[1050,9157,2417],{"class":1404},[1050,9159,9056],{"class":1191},[1050,9161,1196],{"class":1195},[1050,9163,4351],{"class":1521},[1050,9165,4338],{"class":1404},[1050,9167,2417],{"class":1404},[1050,9169,4320],{"class":1796},[1050,9171,1301],{"class":1195},[1050,9173,4331],{"class":1297},[1050,9175,1353],{"class":1195},[1050,9177,3145],{"class":1643},[1050,9179,4366],{"class":1647},[1050,9181,1651],{"class":1643},[1050,9183,1359],{"class":1195},[1050,9185,9187,9189,9191,9193,9195,9197,9199,9201],{"class":1052,"line":9186},276,[1050,9188,9068],{"class":1191},[1050,9190,1591],{"class":1195},[1050,9192,1651],{"class":1643},[1050,9194,8867],{"class":1647},[1050,9196,1651],{"class":1643},[1050,9198,4405],{"class":1195},[1050,9200,1634],{"class":1297},[1050,9202,2759],{"class":1195},[1050,9204,9206,9208,9211,9213,9215,9217,9219,9221],{"class":1052,"line":9205},277,[1050,9207,9088],{"class":1226},[1050,9209,9210],{"class":1647},"\"Adding NOT NULL field '",[1050,9212,2017],{"class":2016},[1050,9214,3025],{"class":1297},[1050,9216,1196],{"class":1195},[1050,9218,1668],{"class":1521},[1050,9220,2026],{"class":2016},[1050,9222,9223],{"class":1647},"' without default may lock table\"\n",[1050,9225,9227],{"class":1052,"line":9226},278,[1050,9228,9110],{"class":1195},[1050,9230,9232,9234,9236,9238,9240,9242,9244,9246],{"class":1052,"line":9231},279,[1050,9233,9068],{"class":1191},[1050,9235,1591],{"class":1195},[1050,9237,1651],{"class":1643},[1050,9239,8881],{"class":1647},[1050,9241,1651],{"class":1643},[1050,9243,4405],{"class":1195},[1050,9245,1634],{"class":1297},[1050,9247,2759],{"class":1195},[1050,9249,9251,9253,9256],{"class":1052,"line":9250},280,[1050,9252,9135],{"class":1643},[1050,9254,9255],{"class":1647},"Add field as nullable first, populate data, then make NOT NULL",[1050,9257,8225],{"class":1643},[1050,9259,9261],{"class":1052,"line":9260},281,[1050,9262,9110],{"class":1195},[1050,9264,9266],{"class":1052,"line":9265},282,[1050,9267,2189],{"class":1191},[1050,9269,9271,9274,9276,9278,9280,9282,9284],{"class":1052,"line":9270},283,[1050,9272,9273],{"class":1187},"            elif",[1050,9275,4301],{"class":1191},[1050,9277,4304],{"class":1404},[1050,9279,3145],{"class":1643},[1050,9281,3470],{"class":1647},[1050,9283,1651],{"class":1643},[1050,9285,1234],{"class":1195},[1050,9287,9289,9292,9294,9296,9298,9300,9302,9304],{"class":1052,"line":9288},284,[1050,9290,9291],{"class":1191},"                analysis",[1050,9293,1591],{"class":1195},[1050,9295,1651],{"class":1643},[1050,9297,8867],{"class":1647},[1050,9299,1651],{"class":1643},[1050,9301,4405],{"class":1195},[1050,9303,1634],{"class":1297},[1050,9305,2759],{"class":1195},[1050,9307,9309,9312,9315,9317,9319,9321,9323,9325],{"class":1052,"line":9308},285,[1050,9310,9311],{"class":1226},"                    f",[1050,9313,9314],{"class":1647},"\"Altering field '",[1050,9316,2017],{"class":2016},[1050,9318,3025],{"class":1297},[1050,9320,1196],{"class":1195},[1050,9322,1668],{"class":1521},[1050,9324,2026],{"class":2016},[1050,9326,9327],{"class":1647},"' may require table rewrite\"\n",[1050,9329,9331],{"class":1052,"line":9330},286,[1050,9332,4426],{"class":1195},[1050,9334,9336,9338,9340,9342,9344,9346,9348,9350],{"class":1052,"line":9335},287,[1050,9337,9291],{"class":1191},[1050,9339,1591],{"class":1195},[1050,9341,1651],{"class":1643},[1050,9343,8881],{"class":1647},[1050,9345,1651],{"class":1643},[1050,9347,4405],{"class":1195},[1050,9349,1634],{"class":1297},[1050,9351,2759],{"class":1195},[1050,9353,9355,9358,9361],{"class":1052,"line":9354},288,[1050,9356,9357],{"class":1643},"                    \"",[1050,9359,9360],{"class":1647},"Test on production-sized dataset to estimate impact",[1050,9362,8225],{"class":1643},[1050,9364,9366],{"class":1052,"line":9365},289,[1050,9367,4426],{"class":1195},[1050,9369,9371],{"class":1052,"line":9370},290,[1050,9372,2189],{"class":1191},[1050,9374,9376,9378,9380,9382,9384,9386,9388],{"class":1052,"line":9375},291,[1050,9377,9273],{"class":1187},[1050,9379,4301],{"class":1191},[1050,9381,4304],{"class":1404},[1050,9383,3145],{"class":1643},[1050,9385,3901],{"class":1647},[1050,9387,1651],{"class":1643},[1050,9389,1234],{"class":1195},[1050,9391,9393,9395,9397,9399,9401,9403,9405,9407],{"class":1052,"line":9392},292,[1050,9394,9291],{"class":1191},[1050,9396,1591],{"class":1195},[1050,9398,1651],{"class":1643},[1050,9400,8867],{"class":1647},[1050,9402,1651],{"class":1643},[1050,9404,4405],{"class":1195},[1050,9406,1634],{"class":1297},[1050,9408,2759],{"class":1195},[1050,9410,9412,9414,9417],{"class":1052,"line":9411},293,[1050,9413,9357],{"class":1643},[1050,9415,9416],{"class":1647},"Custom Python code may be slow on large datasets",[1050,9418,8225],{"class":1643},[1050,9420,9422],{"class":1052,"line":9421},294,[1050,9423,4426],{"class":1195},[1050,9425,9427,9429,9431,9433,9435,9437,9439,9441],{"class":1052,"line":9426},295,[1050,9428,9291],{"class":1191},[1050,9430,1591],{"class":1195},[1050,9432,1651],{"class":1643},[1050,9434,8881],{"class":1647},[1050,9436,1651],{"class":1643},[1050,9438,4405],{"class":1195},[1050,9440,1634],{"class":1297},[1050,9442,2759],{"class":1195},[1050,9444,9446,9448,9451],{"class":1052,"line":9445},296,[1050,9447,9357],{"class":1643},[1050,9449,9450],{"class":1647},"Consider using bulk operations or raw SQL for better performance",[1050,9452,8225],{"class":1643},[1050,9454,9456],{"class":1052,"line":9455},297,[1050,9457,4426],{"class":1195},[1050,9459,9461],{"class":1052,"line":9460},298,[1050,9462,1477],{"class":1191},[1050,9464,9466],{"class":1052,"line":9465},299,[1050,9467,9468],{"class":1056},"        # Estimate overall impact\n",[1050,9470,9472,9474,9476,9478,9481,9483,9485,9487,9489,9492,9494,9497],{"class":1052,"line":9471},300,[1050,9473,2875],{"class":1187},[1050,9475,2229],{"class":1796},[1050,9477,1301],{"class":1195},[1050,9479,9480],{"class":1297},"analysis",[1050,9482,1591],{"class":1195},[1050,9484,1651],{"class":1643},[1050,9486,8867],{"class":1647},[1050,9488,1651],{"class":1643},[1050,9490,9491],{"class":1195},"])",[1050,9493,2239],{"class":1404},[1050,9495,9496],{"class":2242}," 2",[1050,9498,1234],{"class":1195},[1050,9500,9502,9505,9507,9509,9511,9513,9515,9517,9519,9522],{"class":1052,"line":9501},301,[1050,9503,9504],{"class":1191},"            analysis",[1050,9506,1591],{"class":1195},[1050,9508,1651],{"class":1643},[1050,9510,8895],{"class":1647},[1050,9512,1651],{"class":1643},[1050,9514,2290],{"class":1195},[1050,9516,1844],{"class":1195},[1050,9518,3145],{"class":1643},[1050,9520,9521],{"class":1647},"high",[1050,9523,4420],{"class":1643},[1050,9525,9527,9529,9531,9533,9535,9537,9539,9541,9543,9545,9547,9550],{"class":1052,"line":9526},302,[1050,9528,4437],{"class":1187},[1050,9530,2229],{"class":1796},[1050,9532,1301],{"class":1195},[1050,9534,9480],{"class":1297},[1050,9536,1591],{"class":1195},[1050,9538,1651],{"class":1643},[1050,9540,8867],{"class":1647},[1050,9542,1651],{"class":1643},[1050,9544,9491],{"class":1195},[1050,9546,2239],{"class":1404},[1050,9548,9549],{"class":2242}," 0",[1050,9551,1234],{"class":1195},[1050,9553,9555,9557,9559,9561,9563,9565,9567,9569,9571,9574],{"class":1052,"line":9554},303,[1050,9556,9504],{"class":1191},[1050,9558,1591],{"class":1195},[1050,9560,1651],{"class":1643},[1050,9562,8895],{"class":1647},[1050,9564,1651],{"class":1643},[1050,9566,2290],{"class":1195},[1050,9568,1844],{"class":1195},[1050,9570,3145],{"class":1643},[1050,9572,9573],{"class":1647},"medium",[1050,9575,4420],{"class":1643},[1050,9577,9579],{"class":1052,"line":9578},304,[1050,9580,1477],{"class":1191},[1050,9582,9584,9586],{"class":1052,"line":9583},305,[1050,9585,1313],{"class":1187},[1050,9587,9588],{"class":1191}," analysis\n",[1050,9590,9592],{"class":1052,"line":9591},306,[1050,9593,1251],{"class":1191},[1050,9595,9597,9599],{"class":1052,"line":9596},307,[1050,9598,1257],{"class":1195},[1050,9600,1261],{"class":1260},[1050,9602,9604,9606,9609,9611,9613],{"class":1052,"line":9603},308,[1050,9605,1267],{"class":1226},[1050,9607,9608],{"class":1270}," suggest_migration_splitting",[1050,9610,1301],{"class":1195},[1050,9612,2003],{"class":1349},[1050,9614,1359],{"class":1195},[1050,9616,9618,9620,9623],{"class":1052,"line":9617},309,[1050,9619,1280],{"class":1082},[1050,9621,9622],{"class":1089},"Suggest how to split a large migration",[1050,9624,1083],{"class":1082},[1050,9626,9628],{"class":1052,"line":9627},310,[1050,9629,1477],{"class":1191},[1050,9631,9633,9636,9638],{"class":1052,"line":9632},311,[1050,9634,9635],{"class":1191},"        suggestions ",[1050,9637,1294],{"class":1195},[1050,9639,3116],{"class":1195},[1050,9641,9643,9645,9647,9649,9651,9653,9655,9657,9659,9661,9663,9665,9667,9669,9671,9673,9675,9677,9679],{"class":1052,"line":9642},312,[1050,9644,3135],{"class":1643},[1050,9646,2003],{"class":1647},[1050,9648,1651],{"class":1643},[1050,9650,1654],{"class":1195},[1050,9652,2010],{"class":1226},[1050,9654,2013],{"class":1647},[1050,9656,2017],{"class":2016},[1050,9658,2003],{"class":1191},[1050,9660,1196],{"class":1195},[1050,9662,1350],{"class":1521},[1050,9664,2026],{"class":2016},[1050,9666,1196],{"class":1647},[1050,9668,2017],{"class":2016},[1050,9670,2003],{"class":1191},[1050,9672,1196],{"class":1195},[1050,9674,1668],{"class":1521},[1050,9676,2026],{"class":2016},[1050,9678,2013],{"class":1647},[1050,9680,1660],{"class":1195},[1050,9682,9684,9686,9689,9691,9693,9695],{"class":1052,"line":9683},313,[1050,9685,3135],{"class":1643},[1050,9687,9688],{"class":1647},"should_split",[1050,9690,1651],{"class":1643},[1050,9692,1654],{"class":1195},[1050,9694,3272],{"class":2785},[1050,9696,1660],{"class":1195},[1050,9698,9700,9702,9705,9707,9709],{"class":1052,"line":9699},314,[1050,9701,3135],{"class":1643},[1050,9703,9704],{"class":1647},"split_suggestions",[1050,9706,1651],{"class":1643},[1050,9708,1654],{"class":1195},[1050,9710,5913],{"class":1195},[1050,9712,9714],{"class":1052,"line":9713},315,[1050,9715,4282],{"class":1195},[1050,9717,9719],{"class":1052,"line":9718},316,[1050,9720,1477],{"class":1191},[1050,9722,9724,9726,9728,9730,9732,9734,9736,9738,9740,9743],{"class":1052,"line":9723},317,[1050,9725,2875],{"class":1187},[1050,9727,2229],{"class":1796},[1050,9729,1301],{"class":1195},[1050,9731,2003],{"class":1297},[1050,9733,1196],{"class":1195},[1050,9735,3006],{"class":1521},[1050,9737,1401],{"class":1195},[1050,9739,2239],{"class":1404},[1050,9741,9742],{"class":2242}," 5",[1050,9744,1234],{"class":1195},[1050,9746,9748,9751,9753,9755,9757,9759,9761,9763],{"class":1052,"line":9747},318,[1050,9749,9750],{"class":1191},"            suggestions",[1050,9752,1591],{"class":1195},[1050,9754,1651],{"class":1643},[1050,9756,9688],{"class":1647},[1050,9758,1651],{"class":1643},[1050,9760,2290],{"class":1195},[1050,9762,1844],{"class":1195},[1050,9764,4994],{"class":2785},[1050,9766,9768],{"class":1052,"line":9767},319,[1050,9769,2189],{"class":1191},[1050,9771,9773],{"class":1052,"line":9772},320,[1050,9774,9775],{"class":1056},"            # Group operations by type\n",[1050,9777,9779,9782,9784],{"class":1052,"line":9778},321,[1050,9780,9781],{"class":1191},"            operation_groups ",[1050,9783,1294],{"class":1195},[1050,9785,2147],{"class":1195},[1050,9787,9789,9791,9794,9796,9798,9800,9803,9805,9807,9809,9811],{"class":1052,"line":9788},322,[1050,9790,1577],{"class":1187},[1050,9792,9793],{"class":1191}," i",[1050,9795,1353],{"class":1195},[1050,9797,2997],{"class":1191},[1050,9799,1561],{"class":1187},[1050,9801,9802],{"class":1796}," enumerate",[1050,9804,1301],{"class":1195},[1050,9806,2003],{"class":1297},[1050,9808,1196],{"class":1195},[1050,9810,3006],{"class":1521},[1050,9812,1359],{"class":1195},[1050,9814,9816,9819,9821,9823,9825,9827,9829],{"class":1052,"line":9815},323,[1050,9817,9818],{"class":1191},"                op_type ",[1050,9820,1294],{"class":1195},[1050,9822,4048],{"class":1191},[1050,9824,1196],{"class":1195},[1050,9826,3031],{"class":3030},[1050,9828,1196],{"class":1195},[1050,9830,4057],{"class":3030},[1050,9832,9834,9836,9839,9842,9844,9847],{"class":1052,"line":9833},324,[1050,9835,2404],{"class":1187},[1050,9837,9838],{"class":1191}," op_type ",[1050,9840,9841],{"class":1404},"not",[1050,9843,1405],{"class":1404},[1050,9845,9846],{"class":1191}," operation_groups",[1050,9848,1234],{"class":1195},[1050,9850,9852,9855,9857,9860,9862,9864],{"class":1052,"line":9851},325,[1050,9853,9854],{"class":1191},"                    operation_groups",[1050,9856,1591],{"class":1195},[1050,9858,9859],{"class":1191},"op_type",[1050,9861,2290],{"class":1195},[1050,9863,1844],{"class":1195},[1050,9865,1549],{"class":1195},[1050,9867,9869,9872,9874,9876,9878,9880,9882,9885,9887,9889],{"class":1052,"line":9868},326,[1050,9870,9871],{"class":1191},"                operation_groups",[1050,9873,1591],{"class":1195},[1050,9875,9859],{"class":1191},[1050,9877,4405],{"class":1195},[1050,9879,1634],{"class":1297},[1050,9881,2444],{"class":1195},[1050,9883,9884],{"class":1297},"i",[1050,9886,1353],{"class":1195},[1050,9888,4048],{"class":1297},[1050,9890,2453],{"class":1195},[1050,9892,9894],{"class":1052,"line":9893},327,[1050,9895,2189],{"class":1191},[1050,9897,9899],{"class":1052,"line":9898},328,[1050,9900,9901],{"class":1056},"            # Suggest splits\n",[1050,9903,9905,9907,9910,9912,9915,9917,9919,9921,9923],{"class":1052,"line":9904},329,[1050,9906,1577],{"class":1187},[1050,9908,9909],{"class":1191}," op_type",[1050,9911,1353],{"class":1195},[1050,9913,9914],{"class":1191}," operations ",[1050,9916,1561],{"class":1187},[1050,9918,9846],{"class":1191},[1050,9920,1196],{"class":1195},[1050,9922,7219],{"class":1297},[1050,9924,1274],{"class":1195},[1050,9926,9928,9930,9932,9934,9936,9938,9940,9942],{"class":1052,"line":9927},330,[1050,9929,2404],{"class":1187},[1050,9931,2229],{"class":1796},[1050,9933,1301],{"class":1195},[1050,9935,3006],{"class":1297},[1050,9937,1401],{"class":1195},[1050,9939,2239],{"class":1404},[1050,9941,2243],{"class":2242},[1050,9943,1234],{"class":1195},[1050,9945,9947,9950,9952,9954,9956,9958,9960,9962],{"class":1052,"line":9946},331,[1050,9948,9949],{"class":1191},"                    suggestions",[1050,9951,1591],{"class":1195},[1050,9953,1651],{"class":1643},[1050,9955,9704],{"class":1647},[1050,9957,1651],{"class":1643},[1050,9959,4405],{"class":1195},[1050,9961,1634],{"class":1297},[1050,9963,2759],{"class":1195},[1050,9965,9967,9970,9973,9975,9978,9980,9982,9984,9986,9988,9990,9992],{"class":1052,"line":9966},332,[1050,9968,9969],{"class":1226},"                        f",[1050,9971,9972],{"class":1647},"\"Group ",[1050,9974,2017],{"class":2016},[1050,9976,9977],{"class":1796},"len",[1050,9979,1301],{"class":1195},[1050,9981,3006],{"class":1297},[1050,9983,1401],{"class":1195},[1050,9985,2026],{"class":2016},[1050,9987,7705],{"class":2016},[1050,9989,9859],{"class":1297},[1050,9991,2026],{"class":2016},[1050,9993,9994],{"class":1647}," operations into separate migration\"\n",[1050,9996,9998],{"class":1052,"line":9997},333,[1050,9999,10000],{"class":1195},"                    )\n",[1050,10002,10004],{"class":1052,"line":10003},334,[1050,10005,1477],{"class":1191},[1050,10007,10009,10011],{"class":1052,"line":10008},335,[1050,10010,1313],{"class":1187},[1050,10012,10013],{"class":1191}," suggestions\n",[1026,10015,10016],{},"Understanding how Django migrations work internally enables you to write more efficient migrations, debug complex migration issues, and optimize database schema changes for production environments. This knowledge is essential for maintaining large Django applications with evolving data models.",[10018,10019,10020],"style",{},"html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sCyAa, html code.shiki .sCyAa{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sqOPj, html code.shiki .sqOPj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B07D48;--shiki-default-font-style:inherit;--shiki-dark:#BD976A;--shiki-dark-font-style:inherit}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}",{"title":1045,"searchDepth":1053,"depth":1060,"links":10022},[10023,10027],{"id":1032,"depth":1060,"text":1033,"children":10024},[10025,10026],{"id":1037,"depth":1066,"text":1038},{"id":2469,"depth":1066,"text":2470},{"id":5640,"depth":1060,"text":5641,"children":10028},[10029],{"id":5644,"depth":1066,"text":5645},"md",null,{},{"title":338,"description":1028},"VbYMECthDlMVxE0TWaWezPN8SSipMao16d5YTYQZl3o",[10036,10038],{"title":332,"path":333,"stem":334,"description":10037,"children":-1},"Django migrations provide a version control system for your database schema, allowing you to evolve your models over time while maintaining data integrity. Understanding migrations is essential for managing database changes in development, testing, and production environments.",{"title":342,"path":343,"stem":344,"description":10039,"children":-1},"Django provides a comprehensive set of management commands for working with migrations. Understanding these commands and their options enables effective migration management across development, testing, and production environments.",1772474922755]