[{"data":1,"prerenderedAt":7237},["ShallowReactive",2],{"navigation":3,"/models-and-databases/raw-sql-queries":1016,"/models-and-databases/raw-sql-queries-surround":7232},[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":296,"body":1018,"description":1028,"extension":7227,"links":7228,"meta":7229,"navigation":1453,"path":297,"seo":7230,"stem":298,"__hash__":7231},"docs/07.models-and-databases/11.raw-sql-queries.md",{"type":1019,"value":1020,"toc":7209},"minimark",[1021,1025,1029,1034,1039,1969,1973,1977,2674,2678,3214,3218,3222,4653,4657,4661,5629,5633,5637,7202,7205],[1022,1023,296],"h1",{"id":1024},"raw-sql-queries",[1026,1027,1028],"p",{},"While Django's ORM handles most database operations elegantly, there are times when you need the power and flexibility of raw SQL. Understanding how to safely execute raw SQL queries enables you to optimize performance, use database-specific features, and handle complex operations that are difficult to express with the ORM.",[1030,1031,1033],"h2",{"id":1032},"when-to-use-raw-sql","When to Use Raw SQL",[1035,1036,1038],"h3",{"id":1037},"scenarios-for-raw-sql","Scenarios for Raw SQL",[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","# Complex analytical queries\ndef get_monthly_revenue_report():\n    \"\"\"Complex financial report that's easier in raw SQL\"\"\"\n    \n    sql = \"\"\"\n    SELECT \n        DATE_TRUNC('month', o.created_at) as month,\n        COUNT(DISTINCT o.id) as order_count,\n        COUNT(DISTINCT o.customer_id) as unique_customers,\n        SUM(oi.quantity * oi.unit_price) as gross_revenue,\n        SUM(oi.quantity * p.cost_price) as total_cost,\n        SUM(oi.quantity * oi.unit_price) - SUM(oi.quantity * p.cost_price) as profit,\n        AVG(oi.quantity * oi.unit_price) as avg_order_value\n    FROM orders_order o\n    JOIN orders_orderitem oi ON o.id = oi.order_id\n    JOIN products_product p ON oi.product_id = p.id\n    WHERE o.status = 'completed'\n        AND o.created_at >= %s\n    GROUP BY DATE_TRUNC('month', o.created_at)\n    ORDER BY month DESC\n    \"\"\"\n    \n    from django.db import connection\n    from datetime import datetime, timedelta\n    \n    start_date = datetime.now() - timedelta(days=365)\n    \n    with connection.cursor() as cursor:\n        cursor.execute(sql, [start_date])\n        columns = [col[0] for col in cursor.description]\n        return [dict(zip(columns, row)) for row in cursor.fetchall()]\n\n# Database-specific optimizations\ndef get_top_products_with_window_functions():\n    \"\"\"Use PostgreSQL window functions for ranking\"\"\"\n    \n    sql = \"\"\"\n    SELECT \n        p.name,\n        p.category_id,\n        c.name as category_name,\n        SUM(oi.quantity) as total_sold,\n        SUM(oi.quantity * oi.unit_price) as revenue,\n        RANK() OVER (PARTITION BY p.category_id ORDER BY SUM(oi.quantity) DESC) as category_rank,\n        PERCENT_RANK() OVER (ORDER BY SUM(oi.quantity) DESC) as overall_percentile\n    FROM products_product p\n    JOIN products_category c ON p.category_id = c.id\n    JOIN orders_orderitem oi ON p.id = oi.product_id\n    JOIN orders_order o ON oi.order_id = o.id\n    WHERE o.status = 'completed'\n        AND o.created_at >= CURRENT_DATE - INTERVAL '90 days'\n    GROUP BY p.id, p.name, p.category_id, c.name\n    HAVING SUM(oi.quantity) > 0\n    ORDER BY category_id, category_rank\n    \"\"\"\n    \n    return execute_raw_query(sql)\n\n# Performance-critical queries\ndef get_user_activity_summary(user_id):\n    \"\"\"Optimized user activity query\"\"\"\n    \n    sql = \"\"\"\n    WITH user_stats AS (\n        SELECT \n            COUNT(DISTINCT p.id) as post_count,\n            COUNT(DISTINCT c.id) as comment_count,\n            COUNT(DISTINCT l.id) as like_count,\n            MAX(p.created_at) as last_post_date,\n            MAX(c.created_at) as last_comment_date\n        FROM auth_user u\n        LEFT JOIN blog_post p ON u.id = p.author_id\n        LEFT JOIN blog_comment c ON u.id = c.author_id\n        LEFT JOIN blog_like l ON u.id = l.user_id\n        WHERE u.id = %s\n    ),\n    engagement_score AS (\n        SELECT \n            (post_count * 10 + comment_count * 2 + like_count) as score\n        FROM user_stats\n    )\n    SELECT \n        us.*,\n        es.score as engagement_score,\n        CASE \n            WHEN es.score >= 100 THEN 'High'\n            WHEN es.score >= 50 THEN 'Medium'\n            ELSE 'Low'\n        END as engagement_level\n    FROM user_stats us, engagement_score es\n    \"\"\"\n    \n    with connection.cursor() as cursor:\n        cursor.execute(sql, [user_id])\n        columns = [col[0] for col in cursor.description]\n        result = cursor.fetchone()\n        return dict(zip(columns, result)) if result else None\n","python","",[1047,1048,1049,1058,1073,1087,1094,1107,1114,1120,1126,1132,1138,1144,1150,1156,1162,1168,1174,1180,1190,1196,1202,1208,1213,1235,1254,1259,1301,1306,1331,1358,1400,1448,1455,1461,1471,1481,1486,1495,1500,1506,1512,1518,1524,1530,1536,1542,1548,1554,1560,1566,1571,1577,1583,1589,1595,1600,1605,1620,1625,1631,1648,1658,1663,1672,1678,1684,1690,1696,1702,1708,1714,1720,1726,1732,1738,1746,1752,1758,1763,1769,1775,1781,1786,1792,1798,1804,1810,1816,1822,1828,1834,1839,1844,1863,1884,1915,1933],"code",{"__ignoreMap":1045},[1050,1051,1054],"span",{"class":1052,"line":1053},"line",1,[1050,1055,1057],{"class":1056},"s9Tkl","# Complex analytical queries\n",[1050,1059,1061,1065,1069],{"class":1052,"line":1060},2,[1050,1062,1064],{"class":1063},"s5Kfy","def",[1050,1066,1068],{"class":1067},"sljsM"," get_monthly_revenue_report",[1050,1070,1072],{"class":1071},"soVBu","():\n",[1050,1074,1076,1080,1084],{"class":1052,"line":1075},3,[1050,1077,1079],{"class":1078},"sm7ve","    \"\"\"",[1050,1081,1083],{"class":1082},"sVyVU","Complex financial report that's easier in raw SQL",[1050,1085,1086],{"class":1078},"\"\"\"\n",[1050,1088,1090],{"class":1052,"line":1089},4,[1050,1091,1093],{"class":1092},"sftqT","    \n",[1050,1095,1097,1100,1103],{"class":1052,"line":1096},5,[1050,1098,1099],{"class":1092},"    sql ",[1050,1101,1102],{"class":1071},"=",[1050,1104,1106],{"class":1105},"sbYkP"," \"\"\"\n",[1050,1108,1110],{"class":1052,"line":1109},6,[1050,1111,1113],{"class":1112},"sTbE_","    SELECT \n",[1050,1115,1117],{"class":1052,"line":1116},7,[1050,1118,1119],{"class":1112},"        DATE_TRUNC('month', o.created_at) as month,\n",[1050,1121,1123],{"class":1052,"line":1122},8,[1050,1124,1125],{"class":1112},"        COUNT(DISTINCT o.id) as order_count,\n",[1050,1127,1129],{"class":1052,"line":1128},9,[1050,1130,1131],{"class":1112},"        COUNT(DISTINCT o.customer_id) as unique_customers,\n",[1050,1133,1135],{"class":1052,"line":1134},10,[1050,1136,1137],{"class":1112},"        SUM(oi.quantity * oi.unit_price) as gross_revenue,\n",[1050,1139,1141],{"class":1052,"line":1140},11,[1050,1142,1143],{"class":1112},"        SUM(oi.quantity * p.cost_price) as total_cost,\n",[1050,1145,1147],{"class":1052,"line":1146},12,[1050,1148,1149],{"class":1112},"        SUM(oi.quantity * oi.unit_price) - SUM(oi.quantity * p.cost_price) as profit,\n",[1050,1151,1153],{"class":1052,"line":1152},13,[1050,1154,1155],{"class":1112},"        AVG(oi.quantity * oi.unit_price) as avg_order_value\n",[1050,1157,1159],{"class":1052,"line":1158},14,[1050,1160,1161],{"class":1112},"    FROM orders_order o\n",[1050,1163,1165],{"class":1052,"line":1164},15,[1050,1166,1167],{"class":1112},"    JOIN orders_orderitem oi ON o.id = oi.order_id\n",[1050,1169,1171],{"class":1052,"line":1170},16,[1050,1172,1173],{"class":1112},"    JOIN products_product p ON oi.product_id = p.id\n",[1050,1175,1177],{"class":1052,"line":1176},17,[1050,1178,1179],{"class":1112},"    WHERE o.status = 'completed'\n",[1050,1181,1183,1186],{"class":1052,"line":1182},18,[1050,1184,1185],{"class":1112},"        AND o.created_at >= ",[1050,1187,1189],{"class":1188},"s3h35","%s\n",[1050,1191,1193],{"class":1052,"line":1192},19,[1050,1194,1195],{"class":1112},"    GROUP BY DATE_TRUNC('month', o.created_at)\n",[1050,1197,1199],{"class":1052,"line":1198},20,[1050,1200,1201],{"class":1112},"    ORDER BY month DESC\n",[1050,1203,1205],{"class":1052,"line":1204},21,[1050,1206,1207],{"class":1105},"    \"\"\"\n",[1050,1209,1211],{"class":1052,"line":1210},22,[1050,1212,1093],{"class":1092},[1050,1214,1216,1220,1223,1226,1229,1232],{"class":1052,"line":1215},23,[1050,1217,1219],{"class":1218},"siDh9","    from",[1050,1221,1222],{"class":1092}," django",[1050,1224,1225],{"class":1071},".",[1050,1227,1228],{"class":1092},"db ",[1050,1230,1231],{"class":1218},"import",[1050,1233,1234],{"class":1092}," connection\n",[1050,1236,1238,1240,1243,1245,1248,1251],{"class":1052,"line":1237},24,[1050,1239,1219],{"class":1218},[1050,1241,1242],{"class":1092}," datetime ",[1050,1244,1231],{"class":1218},[1050,1246,1247],{"class":1092}," datetime",[1050,1249,1250],{"class":1071},",",[1050,1252,1253],{"class":1092}," timedelta\n",[1050,1255,1257],{"class":1052,"line":1256},25,[1050,1258,1093],{"class":1092},[1050,1260,1262,1265,1267,1269,1271,1275,1278,1282,1285,1288,1292,1294,1298],{"class":1052,"line":1261},26,[1050,1263,1264],{"class":1092},"    start_date ",[1050,1266,1102],{"class":1071},[1050,1268,1247],{"class":1092},[1050,1270,1225],{"class":1071},[1050,1272,1274],{"class":1273},"siWMO","now",[1050,1276,1277],{"class":1071},"()",[1050,1279,1281],{"class":1280},"sVsLi"," -",[1050,1283,1284],{"class":1273}," timedelta",[1050,1286,1287],{"class":1071},"(",[1050,1289,1291],{"class":1290},"sqOPj","days",[1050,1293,1102],{"class":1071},[1050,1295,1297],{"class":1296},"s7CZa","365",[1050,1299,1300],{"class":1071},")\n",[1050,1302,1304],{"class":1052,"line":1303},27,[1050,1305,1093],{"class":1092},[1050,1307,1309,1312,1315,1317,1320,1322,1325,1328],{"class":1052,"line":1308},28,[1050,1310,1311],{"class":1218},"    with",[1050,1313,1314],{"class":1092}," connection",[1050,1316,1225],{"class":1071},[1050,1318,1319],{"class":1273},"cursor",[1050,1321,1277],{"class":1071},[1050,1323,1324],{"class":1218}," as",[1050,1326,1327],{"class":1092}," cursor",[1050,1329,1330],{"class":1071},":\n",[1050,1332,1334,1337,1339,1342,1344,1347,1349,1352,1355],{"class":1052,"line":1333},29,[1050,1335,1336],{"class":1092},"        cursor",[1050,1338,1225],{"class":1071},[1050,1340,1341],{"class":1273},"execute",[1050,1343,1287],{"class":1071},[1050,1345,1346],{"class":1273},"sql",[1050,1348,1250],{"class":1071},[1050,1350,1351],{"class":1071}," [",[1050,1353,1354],{"class":1273},"start_date",[1050,1356,1357],{"class":1071},"])\n",[1050,1359,1361,1364,1366,1368,1371,1374,1377,1380,1383,1386,1389,1391,1393,1397],{"class":1052,"line":1360},30,[1050,1362,1363],{"class":1092},"        columns ",[1050,1365,1102],{"class":1071},[1050,1367,1351],{"class":1071},[1050,1369,1370],{"class":1092},"col",[1050,1372,1373],{"class":1071},"[",[1050,1375,1376],{"class":1296},"0",[1050,1378,1379],{"class":1071},"]",[1050,1381,1382],{"class":1218}," for",[1050,1384,1385],{"class":1092}," col ",[1050,1387,1388],{"class":1218},"in",[1050,1390,1327],{"class":1092},[1050,1392,1225],{"class":1071},[1050,1394,1396],{"class":1395},"sBPpx","description",[1050,1398,1399],{"class":1071},"]\n",[1050,1401,1403,1406,1408,1412,1414,1418,1420,1423,1425,1428,1431,1433,1436,1438,1440,1442,1445],{"class":1052,"line":1402},31,[1050,1404,1405],{"class":1218},"        return",[1050,1407,1351],{"class":1071},[1050,1409,1411],{"class":1410},"sa2tF","dict",[1050,1413,1287],{"class":1071},[1050,1415,1417],{"class":1416},"sJdAF","zip",[1050,1419,1287],{"class":1071},[1050,1421,1422],{"class":1273},"columns",[1050,1424,1250],{"class":1071},[1050,1426,1427],{"class":1273}," row",[1050,1429,1430],{"class":1071},"))",[1050,1432,1382],{"class":1218},[1050,1434,1435],{"class":1092}," row ",[1050,1437,1388],{"class":1218},[1050,1439,1327],{"class":1092},[1050,1441,1225],{"class":1071},[1050,1443,1444],{"class":1273},"fetchall",[1050,1446,1447],{"class":1071},"()]\n",[1050,1449,1451],{"class":1052,"line":1450},32,[1050,1452,1454],{"emptyLinePlaceholder":1453},true,"\n",[1050,1456,1458],{"class":1052,"line":1457},33,[1050,1459,1460],{"class":1056},"# Database-specific optimizations\n",[1050,1462,1464,1466,1469],{"class":1052,"line":1463},34,[1050,1465,1064],{"class":1063},[1050,1467,1468],{"class":1067}," get_top_products_with_window_functions",[1050,1470,1072],{"class":1071},[1050,1472,1474,1476,1479],{"class":1052,"line":1473},35,[1050,1475,1079],{"class":1078},[1050,1477,1478],{"class":1082},"Use PostgreSQL window functions for ranking",[1050,1480,1086],{"class":1078},[1050,1482,1484],{"class":1052,"line":1483},36,[1050,1485,1093],{"class":1092},[1050,1487,1489,1491,1493],{"class":1052,"line":1488},37,[1050,1490,1099],{"class":1092},[1050,1492,1102],{"class":1071},[1050,1494,1106],{"class":1105},[1050,1496,1498],{"class":1052,"line":1497},38,[1050,1499,1113],{"class":1112},[1050,1501,1503],{"class":1052,"line":1502},39,[1050,1504,1505],{"class":1112},"        p.name,\n",[1050,1507,1509],{"class":1052,"line":1508},40,[1050,1510,1511],{"class":1112},"        p.category_id,\n",[1050,1513,1515],{"class":1052,"line":1514},41,[1050,1516,1517],{"class":1112},"        c.name as category_name,\n",[1050,1519,1521],{"class":1052,"line":1520},42,[1050,1522,1523],{"class":1112},"        SUM(oi.quantity) as total_sold,\n",[1050,1525,1527],{"class":1052,"line":1526},43,[1050,1528,1529],{"class":1112},"        SUM(oi.quantity * oi.unit_price) as revenue,\n",[1050,1531,1533],{"class":1052,"line":1532},44,[1050,1534,1535],{"class":1112},"        RANK() OVER (PARTITION BY p.category_id ORDER BY SUM(oi.quantity) DESC) as category_rank,\n",[1050,1537,1539],{"class":1052,"line":1538},45,[1050,1540,1541],{"class":1112},"        PERCENT_RANK() OVER (ORDER BY SUM(oi.quantity) DESC) as overall_percentile\n",[1050,1543,1545],{"class":1052,"line":1544},46,[1050,1546,1547],{"class":1112},"    FROM products_product p\n",[1050,1549,1551],{"class":1052,"line":1550},47,[1050,1552,1553],{"class":1112},"    JOIN products_category c ON p.category_id = c.id\n",[1050,1555,1557],{"class":1052,"line":1556},48,[1050,1558,1559],{"class":1112},"    JOIN orders_orderitem oi ON p.id = oi.product_id\n",[1050,1561,1563],{"class":1052,"line":1562},49,[1050,1564,1565],{"class":1112},"    JOIN orders_order o ON oi.order_id = o.id\n",[1050,1567,1569],{"class":1052,"line":1568},50,[1050,1570,1179],{"class":1112},[1050,1572,1574],{"class":1052,"line":1573},51,[1050,1575,1576],{"class":1112},"        AND o.created_at >= CURRENT_DATE - INTERVAL '90 days'\n",[1050,1578,1580],{"class":1052,"line":1579},52,[1050,1581,1582],{"class":1112},"    GROUP BY p.id, p.name, p.category_id, c.name\n",[1050,1584,1586],{"class":1052,"line":1585},53,[1050,1587,1588],{"class":1112},"    HAVING SUM(oi.quantity) > 0\n",[1050,1590,1592],{"class":1052,"line":1591},54,[1050,1593,1594],{"class":1112},"    ORDER BY category_id, category_rank\n",[1050,1596,1598],{"class":1052,"line":1597},55,[1050,1599,1207],{"class":1105},[1050,1601,1603],{"class":1052,"line":1602},56,[1050,1604,1093],{"class":1092},[1050,1606,1608,1611,1614,1616,1618],{"class":1052,"line":1607},57,[1050,1609,1610],{"class":1218},"    return",[1050,1612,1613],{"class":1273}," execute_raw_query",[1050,1615,1287],{"class":1071},[1050,1617,1346],{"class":1273},[1050,1619,1300],{"class":1071},[1050,1621,1623],{"class":1052,"line":1622},58,[1050,1624,1454],{"emptyLinePlaceholder":1453},[1050,1626,1628],{"class":1052,"line":1627},59,[1050,1629,1630],{"class":1056},"# Performance-critical queries\n",[1050,1632,1634,1636,1639,1641,1645],{"class":1052,"line":1633},60,[1050,1635,1064],{"class":1063},[1050,1637,1638],{"class":1067}," get_user_activity_summary",[1050,1640,1287],{"class":1071},[1050,1642,1644],{"class":1643},"sCyAa","user_id",[1050,1646,1647],{"class":1071},"):\n",[1050,1649,1651,1653,1656],{"class":1052,"line":1650},61,[1050,1652,1079],{"class":1078},[1050,1654,1655],{"class":1082},"Optimized user activity query",[1050,1657,1086],{"class":1078},[1050,1659,1661],{"class":1052,"line":1660},62,[1050,1662,1093],{"class":1092},[1050,1664,1666,1668,1670],{"class":1052,"line":1665},63,[1050,1667,1099],{"class":1092},[1050,1669,1102],{"class":1071},[1050,1671,1106],{"class":1105},[1050,1673,1675],{"class":1052,"line":1674},64,[1050,1676,1677],{"class":1112},"    WITH user_stats AS (\n",[1050,1679,1681],{"class":1052,"line":1680},65,[1050,1682,1683],{"class":1112},"        SELECT \n",[1050,1685,1687],{"class":1052,"line":1686},66,[1050,1688,1689],{"class":1112},"            COUNT(DISTINCT p.id) as post_count,\n",[1050,1691,1693],{"class":1052,"line":1692},67,[1050,1694,1695],{"class":1112},"            COUNT(DISTINCT c.id) as comment_count,\n",[1050,1697,1699],{"class":1052,"line":1698},68,[1050,1700,1701],{"class":1112},"            COUNT(DISTINCT l.id) as like_count,\n",[1050,1703,1705],{"class":1052,"line":1704},69,[1050,1706,1707],{"class":1112},"            MAX(p.created_at) as last_post_date,\n",[1050,1709,1711],{"class":1052,"line":1710},70,[1050,1712,1713],{"class":1112},"            MAX(c.created_at) as last_comment_date\n",[1050,1715,1717],{"class":1052,"line":1716},71,[1050,1718,1719],{"class":1112},"        FROM auth_user u\n",[1050,1721,1723],{"class":1052,"line":1722},72,[1050,1724,1725],{"class":1112},"        LEFT JOIN blog_post p ON u.id = p.author_id\n",[1050,1727,1729],{"class":1052,"line":1728},73,[1050,1730,1731],{"class":1112},"        LEFT JOIN blog_comment c ON u.id = c.author_id\n",[1050,1733,1735],{"class":1052,"line":1734},74,[1050,1736,1737],{"class":1112},"        LEFT JOIN blog_like l ON u.id = l.user_id\n",[1050,1739,1741,1744],{"class":1052,"line":1740},75,[1050,1742,1743],{"class":1112},"        WHERE u.id = ",[1050,1745,1189],{"class":1188},[1050,1747,1749],{"class":1052,"line":1748},76,[1050,1750,1751],{"class":1112},"    ),\n",[1050,1753,1755],{"class":1052,"line":1754},77,[1050,1756,1757],{"class":1112},"    engagement_score AS (\n",[1050,1759,1761],{"class":1052,"line":1760},78,[1050,1762,1683],{"class":1112},[1050,1764,1766],{"class":1052,"line":1765},79,[1050,1767,1768],{"class":1112},"            (post_count * 10 + comment_count * 2 + like_count) as score\n",[1050,1770,1772],{"class":1052,"line":1771},80,[1050,1773,1774],{"class":1112},"        FROM user_stats\n",[1050,1776,1778],{"class":1052,"line":1777},81,[1050,1779,1780],{"class":1112},"    )\n",[1050,1782,1784],{"class":1052,"line":1783},82,[1050,1785,1113],{"class":1112},[1050,1787,1789],{"class":1052,"line":1788},83,[1050,1790,1791],{"class":1112},"        us.*,\n",[1050,1793,1795],{"class":1052,"line":1794},84,[1050,1796,1797],{"class":1112},"        es.score as engagement_score,\n",[1050,1799,1801],{"class":1052,"line":1800},85,[1050,1802,1803],{"class":1112},"        CASE \n",[1050,1805,1807],{"class":1052,"line":1806},86,[1050,1808,1809],{"class":1112},"            WHEN es.score >= 100 THEN 'High'\n",[1050,1811,1813],{"class":1052,"line":1812},87,[1050,1814,1815],{"class":1112},"            WHEN es.score >= 50 THEN 'Medium'\n",[1050,1817,1819],{"class":1052,"line":1818},88,[1050,1820,1821],{"class":1112},"            ELSE 'Low'\n",[1050,1823,1825],{"class":1052,"line":1824},89,[1050,1826,1827],{"class":1112},"        END as engagement_level\n",[1050,1829,1831],{"class":1052,"line":1830},90,[1050,1832,1833],{"class":1112},"    FROM user_stats us, engagement_score es\n",[1050,1835,1837],{"class":1052,"line":1836},91,[1050,1838,1207],{"class":1105},[1050,1840,1842],{"class":1052,"line":1841},92,[1050,1843,1093],{"class":1092},[1050,1845,1847,1849,1851,1853,1855,1857,1859,1861],{"class":1052,"line":1846},93,[1050,1848,1311],{"class":1218},[1050,1850,1314],{"class":1092},[1050,1852,1225],{"class":1071},[1050,1854,1319],{"class":1273},[1050,1856,1277],{"class":1071},[1050,1858,1324],{"class":1218},[1050,1860,1327],{"class":1092},[1050,1862,1330],{"class":1071},[1050,1864,1866,1868,1870,1872,1874,1876,1878,1880,1882],{"class":1052,"line":1865},94,[1050,1867,1336],{"class":1092},[1050,1869,1225],{"class":1071},[1050,1871,1341],{"class":1273},[1050,1873,1287],{"class":1071},[1050,1875,1346],{"class":1273},[1050,1877,1250],{"class":1071},[1050,1879,1351],{"class":1071},[1050,1881,1644],{"class":1273},[1050,1883,1357],{"class":1071},[1050,1885,1887,1889,1891,1893,1895,1897,1899,1901,1903,1905,1907,1909,1911,1913],{"class":1052,"line":1886},95,[1050,1888,1363],{"class":1092},[1050,1890,1102],{"class":1071},[1050,1892,1351],{"class":1071},[1050,1894,1370],{"class":1092},[1050,1896,1373],{"class":1071},[1050,1898,1376],{"class":1296},[1050,1900,1379],{"class":1071},[1050,1902,1382],{"class":1218},[1050,1904,1385],{"class":1092},[1050,1906,1388],{"class":1218},[1050,1908,1327],{"class":1092},[1050,1910,1225],{"class":1071},[1050,1912,1396],{"class":1395},[1050,1914,1399],{"class":1071},[1050,1916,1918,1921,1923,1925,1927,1930],{"class":1052,"line":1917},96,[1050,1919,1920],{"class":1092},"        result ",[1050,1922,1102],{"class":1071},[1050,1924,1327],{"class":1092},[1050,1926,1225],{"class":1071},[1050,1928,1929],{"class":1273},"fetchone",[1050,1931,1932],{"class":1071},"()\n",[1050,1934,1936,1938,1941,1943,1945,1947,1949,1951,1954,1956,1959,1962,1965],{"class":1052,"line":1935},97,[1050,1937,1405],{"class":1218},[1050,1939,1940],{"class":1410}," dict",[1050,1942,1287],{"class":1071},[1050,1944,1417],{"class":1416},[1050,1946,1287],{"class":1071},[1050,1948,1422],{"class":1273},[1050,1950,1250],{"class":1071},[1050,1952,1953],{"class":1273}," result",[1050,1955,1430],{"class":1071},[1050,1957,1958],{"class":1218}," if",[1050,1960,1961],{"class":1092}," result ",[1050,1963,1964],{"class":1218},"else",[1050,1966,1968],{"class":1967},"s8XtY"," None\n",[1030,1970,1972],{"id":1971},"raw-sql-with-model-instances","Raw SQL with Model Instances",[1035,1974,1976],{"id":1975},"using-raw-method","Using raw() Method",[1040,1978,1980],{"className":1042,"code":1979,"language":1044,"meta":1045,"style":1045},"from django.db import models\n\nclass PostManager(models.Manager):\n    def popular_posts_raw(self, min_views=1000):\n        \"\"\"Get popular posts using raw SQL but return model instances\"\"\"\n        \n        return self.raw(\"\"\"\n            SELECT * FROM blog_post \n            WHERE view_count >= %s \n                AND status = 'published'\n            ORDER BY view_count DESC, created_at DESC\n        \"\"\", [min_views])\n    \n    def posts_with_engagement_score(self):\n        \"\"\"Calculate engagement score using raw SQL\"\"\"\n        \n        return self.raw(\"\"\"\n            SELECT \n                p.*,\n                (p.view_count + COUNT(c.id) * 5 + COUNT(l.id) * 2) as engagement_score\n            FROM blog_post p\n            LEFT JOIN blog_comment c ON p.id = c.post_id AND c.is_approved = true\n            LEFT JOIN blog_like l ON p.id = l.post_id\n            WHERE p.status = 'published'\n            GROUP BY p.id\n            ORDER BY engagement_score DESC\n        \"\"\")\n    \n    def search_posts_full_text(self, query):\n        \"\"\"PostgreSQL full-text search using raw SQL\"\"\"\n        \n        return self.raw(\"\"\"\n            SELECT \n                *,\n                ts_rank(to_tsvector('english', title || ' ' || content), plainto_tsquery('english', %s)) as rank\n            FROM blog_post\n            WHERE to_tsvector('english', title || ' ' || content) @@ plainto_tsquery('english', %s)\n                AND status = 'published'\n            ORDER BY rank DESC, created_at DESC\n        \"\"\", [query, query])\n\nclass Post(models.Model):\n    title = models.CharField(max_length=200)\n    content = models.TextField()\n    view_count = models.PositiveIntegerField(default=0)\n    status = models.CharField(max_length=20, default='draft')\n    created_at = models.DateTimeField(auto_now_add=True)\n    \n    objects = PostManager()\n\n# Usage\npopular_posts = Post.objects.popular_posts_raw(min_views=500)\nfor post in popular_posts:\n    print(f\"{post.title}: {post.view_count} views\")\n\n# Access additional fields from raw SQL\nposts_with_scores = Post.objects.posts_with_engagement_score()\nfor post in posts_with_scores:\n    print(f\"{post.title}: {post.engagement_score} engagement\")\n",[1047,1981,1982,1998,2002,2024,2050,2060,2065,2082,2087,2098,2103,2108,2121,2125,2138,2147,2151,2165,2170,2175,2180,2185,2190,2195,2200,2205,2210,2216,2220,2238,2247,2251,2265,2269,2274,2284,2289,2298,2302,2307,2324,2328,2346,2373,2389,2414,2453,2479,2483,2494,2498,2503,2533,2548,2594,2598,2603,2623,2636],{"__ignoreMap":1045},[1050,1983,1984,1987,1989,1991,1993,1995],{"class":1052,"line":1053},[1050,1985,1986],{"class":1218},"from",[1050,1988,1222],{"class":1092},[1050,1990,1225],{"class":1071},[1050,1992,1228],{"class":1092},[1050,1994,1231],{"class":1218},[1050,1996,1997],{"class":1092}," models\n",[1050,1999,2000],{"class":1052,"line":1060},[1050,2001,1454],{"emptyLinePlaceholder":1453},[1050,2003,2004,2007,2011,2013,2017,2019,2022],{"class":1052,"line":1075},[1050,2005,2006],{"class":1063},"class",[1050,2008,2010],{"class":2009},"sD-vU"," PostManager",[1050,2012,1287],{"class":1071},[1050,2014,2016],{"class":2015},"sYn-s","models",[1050,2018,1225],{"class":1071},[1050,2020,2021],{"class":2015},"Manager",[1050,2023,1647],{"class":1071},[1050,2025,2026,2029,2032,2034,2038,2040,2043,2045,2048],{"class":1052,"line":1089},[1050,2027,2028],{"class":1063},"    def",[1050,2030,2031],{"class":1067}," popular_posts_raw",[1050,2033,1287],{"class":1071},[1050,2035,2037],{"class":2036},"sRjD_","self",[1050,2039,1250],{"class":1071},[1050,2041,2042],{"class":1643}," min_views",[1050,2044,1102],{"class":1280},[1050,2046,2047],{"class":1296},"1000",[1050,2049,1647],{"class":1071},[1050,2051,2052,2055,2058],{"class":1052,"line":1096},[1050,2053,2054],{"class":1078},"        \"\"\"",[1050,2056,2057],{"class":1082},"Get popular posts using raw SQL but return model instances",[1050,2059,1086],{"class":1078},[1050,2061,2062],{"class":1052,"line":1109},[1050,2063,2064],{"class":1092},"        \n",[1050,2066,2067,2069,2073,2075,2078,2080],{"class":1052,"line":1116},[1050,2068,1405],{"class":1218},[1050,2070,2072],{"class":2071},"se3Ec"," self",[1050,2074,1225],{"class":1071},[1050,2076,2077],{"class":1273},"raw",[1050,2079,1287],{"class":1071},[1050,2081,1086],{"class":1105},[1050,2083,2084],{"class":1052,"line":1122},[1050,2085,2086],{"class":1112},"            SELECT * FROM blog_post \n",[1050,2088,2089,2092,2095],{"class":1052,"line":1128},[1050,2090,2091],{"class":1112},"            WHERE view_count >= ",[1050,2093,2094],{"class":1188},"%s",[1050,2096,2097],{"class":1112}," \n",[1050,2099,2100],{"class":1052,"line":1134},[1050,2101,2102],{"class":1112},"                AND status = 'published'\n",[1050,2104,2105],{"class":1052,"line":1140},[1050,2106,2107],{"class":1112},"            ORDER BY view_count DESC, created_at DESC\n",[1050,2109,2110,2112,2114,2116,2119],{"class":1052,"line":1146},[1050,2111,2054],{"class":1105},[1050,2113,1250],{"class":1071},[1050,2115,1351],{"class":1071},[1050,2117,2118],{"class":1273},"min_views",[1050,2120,1357],{"class":1071},[1050,2122,2123],{"class":1052,"line":1152},[1050,2124,1093],{"class":1092},[1050,2126,2127,2129,2132,2134,2136],{"class":1052,"line":1158},[1050,2128,2028],{"class":1063},[1050,2130,2131],{"class":1067}," posts_with_engagement_score",[1050,2133,1287],{"class":1071},[1050,2135,2037],{"class":2036},[1050,2137,1647],{"class":1071},[1050,2139,2140,2142,2145],{"class":1052,"line":1164},[1050,2141,2054],{"class":1078},[1050,2143,2144],{"class":1082},"Calculate engagement score using raw SQL",[1050,2146,1086],{"class":1078},[1050,2148,2149],{"class":1052,"line":1170},[1050,2150,2064],{"class":1092},[1050,2152,2153,2155,2157,2159,2161,2163],{"class":1052,"line":1176},[1050,2154,1405],{"class":1218},[1050,2156,2072],{"class":2071},[1050,2158,1225],{"class":1071},[1050,2160,2077],{"class":1273},[1050,2162,1287],{"class":1071},[1050,2164,1086],{"class":1105},[1050,2166,2167],{"class":1052,"line":1182},[1050,2168,2169],{"class":1112},"            SELECT \n",[1050,2171,2172],{"class":1052,"line":1192},[1050,2173,2174],{"class":1112},"                p.*,\n",[1050,2176,2177],{"class":1052,"line":1198},[1050,2178,2179],{"class":1112},"                (p.view_count + COUNT(c.id) * 5 + COUNT(l.id) * 2) as engagement_score\n",[1050,2181,2182],{"class":1052,"line":1204},[1050,2183,2184],{"class":1112},"            FROM blog_post p\n",[1050,2186,2187],{"class":1052,"line":1210},[1050,2188,2189],{"class":1112},"            LEFT JOIN blog_comment c ON p.id = c.post_id AND c.is_approved = true\n",[1050,2191,2192],{"class":1052,"line":1215},[1050,2193,2194],{"class":1112},"            LEFT JOIN blog_like l ON p.id = l.post_id\n",[1050,2196,2197],{"class":1052,"line":1237},[1050,2198,2199],{"class":1112},"            WHERE p.status = 'published'\n",[1050,2201,2202],{"class":1052,"line":1256},[1050,2203,2204],{"class":1112},"            GROUP BY p.id\n",[1050,2206,2207],{"class":1052,"line":1261},[1050,2208,2209],{"class":1112},"            ORDER BY engagement_score DESC\n",[1050,2211,2212,2214],{"class":1052,"line":1303},[1050,2213,2054],{"class":1105},[1050,2215,1300],{"class":1071},[1050,2217,2218],{"class":1052,"line":1308},[1050,2219,1093],{"class":1092},[1050,2221,2222,2224,2227,2229,2231,2233,2236],{"class":1052,"line":1333},[1050,2223,2028],{"class":1063},[1050,2225,2226],{"class":1067}," search_posts_full_text",[1050,2228,1287],{"class":1071},[1050,2230,2037],{"class":2036},[1050,2232,1250],{"class":1071},[1050,2234,2235],{"class":1643}," query",[1050,2237,1647],{"class":1071},[1050,2239,2240,2242,2245],{"class":1052,"line":1360},[1050,2241,2054],{"class":1078},[1050,2243,2244],{"class":1082},"PostgreSQL full-text search using raw SQL",[1050,2246,1086],{"class":1078},[1050,2248,2249],{"class":1052,"line":1402},[1050,2250,2064],{"class":1092},[1050,2252,2253,2255,2257,2259,2261,2263],{"class":1052,"line":1450},[1050,2254,1405],{"class":1218},[1050,2256,2072],{"class":2071},[1050,2258,1225],{"class":1071},[1050,2260,2077],{"class":1273},[1050,2262,1287],{"class":1071},[1050,2264,1086],{"class":1105},[1050,2266,2267],{"class":1052,"line":1457},[1050,2268,2169],{"class":1112},[1050,2270,2271],{"class":1052,"line":1463},[1050,2272,2273],{"class":1112},"                *,\n",[1050,2275,2276,2279,2281],{"class":1052,"line":1473},[1050,2277,2278],{"class":1112},"                ts_rank(to_tsvector('english', title || ' ' || content), plainto_tsquery('english', ",[1050,2280,2094],{"class":1188},[1050,2282,2283],{"class":1112},")) as rank\n",[1050,2285,2286],{"class":1052,"line":1483},[1050,2287,2288],{"class":1112},"            FROM blog_post\n",[1050,2290,2291,2294,2296],{"class":1052,"line":1488},[1050,2292,2293],{"class":1112},"            WHERE to_tsvector('english', title || ' ' || content) @@ plainto_tsquery('english', ",[1050,2295,2094],{"class":1188},[1050,2297,1300],{"class":1112},[1050,2299,2300],{"class":1052,"line":1497},[1050,2301,2102],{"class":1112},[1050,2303,2304],{"class":1052,"line":1502},[1050,2305,2306],{"class":1112},"            ORDER BY rank DESC, created_at DESC\n",[1050,2308,2309,2311,2313,2315,2318,2320,2322],{"class":1052,"line":1508},[1050,2310,2054],{"class":1105},[1050,2312,1250],{"class":1071},[1050,2314,1351],{"class":1071},[1050,2316,2317],{"class":1273},"query",[1050,2319,1250],{"class":1071},[1050,2321,2235],{"class":1273},[1050,2323,1357],{"class":1071},[1050,2325,2326],{"class":1052,"line":1514},[1050,2327,1454],{"emptyLinePlaceholder":1453},[1050,2329,2330,2332,2335,2337,2339,2341,2344],{"class":1052,"line":1520},[1050,2331,2006],{"class":1063},[1050,2333,2334],{"class":2009}," Post",[1050,2336,1287],{"class":1071},[1050,2338,2016],{"class":2015},[1050,2340,1225],{"class":1071},[1050,2342,2343],{"class":2015},"Model",[1050,2345,1647],{"class":1071},[1050,2347,2348,2351,2353,2356,2358,2361,2363,2366,2368,2371],{"class":1052,"line":1526},[1050,2349,2350],{"class":1092},"    title ",[1050,2352,1102],{"class":1071},[1050,2354,2355],{"class":1092}," models",[1050,2357,1225],{"class":1071},[1050,2359,2360],{"class":1273},"CharField",[1050,2362,1287],{"class":1071},[1050,2364,2365],{"class":1290},"max_length",[1050,2367,1102],{"class":1071},[1050,2369,2370],{"class":1296},"200",[1050,2372,1300],{"class":1071},[1050,2374,2375,2378,2380,2382,2384,2387],{"class":1052,"line":1532},[1050,2376,2377],{"class":1092},"    content ",[1050,2379,1102],{"class":1071},[1050,2381,2355],{"class":1092},[1050,2383,1225],{"class":1071},[1050,2385,2386],{"class":1273},"TextField",[1050,2388,1932],{"class":1071},[1050,2390,2391,2394,2396,2398,2400,2403,2405,2408,2410,2412],{"class":1052,"line":1538},[1050,2392,2393],{"class":1092},"    view_count ",[1050,2395,1102],{"class":1071},[1050,2397,2355],{"class":1092},[1050,2399,1225],{"class":1071},[1050,2401,2402],{"class":1273},"PositiveIntegerField",[1050,2404,1287],{"class":1071},[1050,2406,2407],{"class":1290},"default",[1050,2409,1102],{"class":1071},[1050,2411,1376],{"class":1296},[1050,2413,1300],{"class":1071},[1050,2415,2416,2419,2421,2423,2425,2427,2429,2431,2433,2436,2438,2441,2443,2446,2449,2451],{"class":1052,"line":1544},[1050,2417,2418],{"class":1092},"    status ",[1050,2420,1102],{"class":1071},[1050,2422,2355],{"class":1092},[1050,2424,1225],{"class":1071},[1050,2426,2360],{"class":1273},[1050,2428,1287],{"class":1071},[1050,2430,2365],{"class":1290},[1050,2432,1102],{"class":1071},[1050,2434,2435],{"class":1296},"20",[1050,2437,1250],{"class":1071},[1050,2439,2440],{"class":1290}," default",[1050,2442,1102],{"class":1071},[1050,2444,2445],{"class":1105},"'",[1050,2447,2448],{"class":1112},"draft",[1050,2450,2445],{"class":1105},[1050,2452,1300],{"class":1071},[1050,2454,2455,2458,2460,2462,2464,2467,2469,2472,2474,2477],{"class":1052,"line":1550},[1050,2456,2457],{"class":1092},"    created_at ",[1050,2459,1102],{"class":1071},[1050,2461,2355],{"class":1092},[1050,2463,1225],{"class":1071},[1050,2465,2466],{"class":1273},"DateTimeField",[1050,2468,1287],{"class":1071},[1050,2470,2471],{"class":1290},"auto_now_add",[1050,2473,1102],{"class":1071},[1050,2475,2476],{"class":1967},"True",[1050,2478,1300],{"class":1071},[1050,2480,2481],{"class":1052,"line":1556},[1050,2482,1093],{"class":1092},[1050,2484,2485,2488,2490,2492],{"class":1052,"line":1562},[1050,2486,2487],{"class":1092},"    objects ",[1050,2489,1102],{"class":1071},[1050,2491,2010],{"class":1273},[1050,2493,1932],{"class":1071},[1050,2495,2496],{"class":1052,"line":1568},[1050,2497,1454],{"emptyLinePlaceholder":1453},[1050,2499,2500],{"class":1052,"line":1573},[1050,2501,2502],{"class":1056},"# Usage\n",[1050,2504,2505,2508,2510,2512,2514,2517,2519,2522,2524,2526,2528,2531],{"class":1052,"line":1579},[1050,2506,2507],{"class":1092},"popular_posts ",[1050,2509,1102],{"class":1071},[1050,2511,2334],{"class":1092},[1050,2513,1225],{"class":1071},[1050,2515,2516],{"class":1395},"objects",[1050,2518,1225],{"class":1071},[1050,2520,2521],{"class":1273},"popular_posts_raw",[1050,2523,1287],{"class":1071},[1050,2525,2118],{"class":1290},[1050,2527,1102],{"class":1071},[1050,2529,2530],{"class":1296},"500",[1050,2532,1300],{"class":1071},[1050,2534,2535,2538,2541,2543,2546],{"class":1052,"line":1585},[1050,2536,2537],{"class":1218},"for",[1050,2539,2540],{"class":1092}," post ",[1050,2542,1388],{"class":1218},[1050,2544,2545],{"class":1092}," popular_posts",[1050,2547,1330],{"class":1071},[1050,2549,2550,2553,2555,2558,2561,2564,2567,2569,2572,2575,2578,2580,2582,2584,2587,2589,2592],{"class":1052,"line":1591},[1050,2551,2552],{"class":1416},"    print",[1050,2554,1287],{"class":1071},[1050,2556,2557],{"class":1063},"f",[1050,2559,2560],{"class":1112},"\"",[1050,2562,2563],{"class":1188},"{",[1050,2565,2566],{"class":1273},"post",[1050,2568,1225],{"class":1071},[1050,2570,2571],{"class":1395},"title",[1050,2573,2574],{"class":1188},"}",[1050,2576,2577],{"class":1112},": ",[1050,2579,2563],{"class":1188},[1050,2581,2566],{"class":1273},[1050,2583,1225],{"class":1071},[1050,2585,2586],{"class":1395},"view_count",[1050,2588,2574],{"class":1188},[1050,2590,2591],{"class":1112}," views\"",[1050,2593,1300],{"class":1071},[1050,2595,2596],{"class":1052,"line":1597},[1050,2597,1454],{"emptyLinePlaceholder":1453},[1050,2599,2600],{"class":1052,"line":1602},[1050,2601,2602],{"class":1056},"# Access additional fields from raw SQL\n",[1050,2604,2605,2608,2610,2612,2614,2616,2618,2621],{"class":1052,"line":1607},[1050,2606,2607],{"class":1092},"posts_with_scores ",[1050,2609,1102],{"class":1071},[1050,2611,2334],{"class":1092},[1050,2613,1225],{"class":1071},[1050,2615,2516],{"class":1395},[1050,2617,1225],{"class":1071},[1050,2619,2620],{"class":1273},"posts_with_engagement_score",[1050,2622,1932],{"class":1071},[1050,2624,2625,2627,2629,2631,2634],{"class":1052,"line":1622},[1050,2626,2537],{"class":1218},[1050,2628,2540],{"class":1092},[1050,2630,1388],{"class":1218},[1050,2632,2633],{"class":1092}," posts_with_scores",[1050,2635,1330],{"class":1071},[1050,2637,2638,2640,2642,2644,2646,2648,2650,2652,2654,2656,2658,2660,2662,2664,2667,2669,2672],{"class":1052,"line":1627},[1050,2639,2552],{"class":1416},[1050,2641,1287],{"class":1071},[1050,2643,2557],{"class":1063},[1050,2645,2560],{"class":1112},[1050,2647,2563],{"class":1188},[1050,2649,2566],{"class":1273},[1050,2651,1225],{"class":1071},[1050,2653,2571],{"class":1395},[1050,2655,2574],{"class":1188},[1050,2657,2577],{"class":1112},[1050,2659,2563],{"class":1188},[1050,2661,2566],{"class":1273},[1050,2663,1225],{"class":1071},[1050,2665,2666],{"class":1395},"engagement_score",[1050,2668,2574],{"class":1188},[1050,2670,2671],{"class":1112}," engagement\"",[1050,2673,1300],{"class":1071},[1035,2675,2677],{"id":2676},"raw-sql-with-annotations","Raw SQL with Annotations",[1040,2679,2681],{"className":1042,"code":2680,"language":1044,"meta":1045,"style":1045},"class AdvancedPostManager(models.Manager):\n    def annotate_with_raw_sql(self):\n        \"\"\"Combine ORM with raw SQL for complex calculations\"\"\"\n        \n        return self.extra(\n            select={\n                'comment_count': \"\"\"\n                    SELECT COUNT(*) \n                    FROM blog_comment \n                    WHERE blog_comment.post_id = blog_post.id \n                        AND blog_comment.is_approved = true\n                \"\"\",\n                'avg_rating': \"\"\"\n                    SELECT AVG(rating) \n                    FROM blog_rating \n                    WHERE blog_rating.post_id = blog_post.id\n                \"\"\",\n                'days_since_published': \"\"\"\n                    CASE \n                        WHEN published_at IS NOT NULL \n                        THEN EXTRACT(days FROM (NOW() - published_at))\n                        ELSE NULL \n                    END\n                \"\"\"\n            },\n            where=[\n                \"status = %s\",\n                \"created_at >= %s\"\n            ],\n            params=['published', '2023-01-01'],\n            order_by=['-view_count']\n        )\n    \n    def complex_filtering_with_raw(self, author_ids, min_engagement=100):\n        \"\"\"Complex filtering using raw SQL conditions\"\"\"\n        \n        return self.extra(\n            select={\n                'engagement_score': \"\"\"\n                    (view_count + \n                     (SELECT COUNT(*) FROM blog_comment WHERE post_id = blog_post.id) * 5 +\n                     (SELECT COUNT(*) FROM blog_like WHERE post_id = blog_post.id) * 2)\n                \"\"\"\n            },\n            where=[\n                \"\"\"\n                author_id = ANY(%s) AND\n                (view_count + \n                 (SELECT COUNT(*) FROM blog_comment WHERE post_id = blog_post.id) * 5 +\n                 (SELECT COUNT(*) FROM blog_like WHERE post_id = blog_post.id) * 2) >= %s\n                \"\"\"\n            ],\n            params=[author_ids, min_engagement]\n        )\n\n# Usage\nannotated_posts = Post.objects.annotate_with_raw_sql()\nfor post in annotated_posts:\n    print(f\"{post.title}: {post.comment_count} comments, {post.avg_rating} rating\")\n",[1047,2682,2683,2700,2713,2722,2726,2740,2748,2763,2768,2773,2778,2783,2791,2804,2809,2814,2819,2825,2838,2843,2848,2853,2858,2863,2868,2873,2881,2895,2907,2912,2940,2956,2961,2965,2993,3002,3006,3018,3024,3036,3041,3046,3051,3055,3059,3065,3069,3079,3084,3089,3096,3100,3104,3119,3123,3127,3131,3151,3164],{"__ignoreMap":1045},[1050,2684,2685,2687,2690,2692,2694,2696,2698],{"class":1052,"line":1053},[1050,2686,2006],{"class":1063},[1050,2688,2689],{"class":2009}," AdvancedPostManager",[1050,2691,1287],{"class":1071},[1050,2693,2016],{"class":2015},[1050,2695,1225],{"class":1071},[1050,2697,2021],{"class":2015},[1050,2699,1647],{"class":1071},[1050,2701,2702,2704,2707,2709,2711],{"class":1052,"line":1060},[1050,2703,2028],{"class":1063},[1050,2705,2706],{"class":1067}," annotate_with_raw_sql",[1050,2708,1287],{"class":1071},[1050,2710,2037],{"class":2036},[1050,2712,1647],{"class":1071},[1050,2714,2715,2717,2720],{"class":1052,"line":1075},[1050,2716,2054],{"class":1078},[1050,2718,2719],{"class":1082},"Combine ORM with raw SQL for complex calculations",[1050,2721,1086],{"class":1078},[1050,2723,2724],{"class":1052,"line":1089},[1050,2725,2064],{"class":1092},[1050,2727,2728,2730,2732,2734,2737],{"class":1052,"line":1096},[1050,2729,1405],{"class":1218},[1050,2731,2072],{"class":2071},[1050,2733,1225],{"class":1071},[1050,2735,2736],{"class":1273},"extra",[1050,2738,2739],{"class":1071},"(\n",[1050,2741,2742,2745],{"class":1052,"line":1109},[1050,2743,2744],{"class":1290},"            select",[1050,2746,2747],{"class":1071},"={\n",[1050,2749,2750,2753,2756,2758,2761],{"class":1052,"line":1116},[1050,2751,2752],{"class":1105},"                '",[1050,2754,2755],{"class":1112},"comment_count",[1050,2757,2445],{"class":1105},[1050,2759,2760],{"class":1071},":",[1050,2762,1106],{"class":1105},[1050,2764,2765],{"class":1052,"line":1122},[1050,2766,2767],{"class":1112},"                    SELECT COUNT(*) \n",[1050,2769,2770],{"class":1052,"line":1128},[1050,2771,2772],{"class":1112},"                    FROM blog_comment \n",[1050,2774,2775],{"class":1052,"line":1134},[1050,2776,2777],{"class":1112},"                    WHERE blog_comment.post_id = blog_post.id \n",[1050,2779,2780],{"class":1052,"line":1140},[1050,2781,2782],{"class":1112},"                        AND blog_comment.is_approved = true\n",[1050,2784,2785,2788],{"class":1052,"line":1146},[1050,2786,2787],{"class":1105},"                \"\"\"",[1050,2789,2790],{"class":1071},",\n",[1050,2792,2793,2795,2798,2800,2802],{"class":1052,"line":1152},[1050,2794,2752],{"class":1105},[1050,2796,2797],{"class":1112},"avg_rating",[1050,2799,2445],{"class":1105},[1050,2801,2760],{"class":1071},[1050,2803,1106],{"class":1105},[1050,2805,2806],{"class":1052,"line":1158},[1050,2807,2808],{"class":1112},"                    SELECT AVG(rating) \n",[1050,2810,2811],{"class":1052,"line":1164},[1050,2812,2813],{"class":1112},"                    FROM blog_rating \n",[1050,2815,2816],{"class":1052,"line":1170},[1050,2817,2818],{"class":1112},"                    WHERE blog_rating.post_id = blog_post.id\n",[1050,2820,2821,2823],{"class":1052,"line":1176},[1050,2822,2787],{"class":1105},[1050,2824,2790],{"class":1071},[1050,2826,2827,2829,2832,2834,2836],{"class":1052,"line":1182},[1050,2828,2752],{"class":1105},[1050,2830,2831],{"class":1112},"days_since_published",[1050,2833,2445],{"class":1105},[1050,2835,2760],{"class":1071},[1050,2837,1106],{"class":1105},[1050,2839,2840],{"class":1052,"line":1192},[1050,2841,2842],{"class":1112},"                    CASE \n",[1050,2844,2845],{"class":1052,"line":1198},[1050,2846,2847],{"class":1112},"                        WHEN published_at IS NOT NULL \n",[1050,2849,2850],{"class":1052,"line":1204},[1050,2851,2852],{"class":1112},"                        THEN EXTRACT(days FROM (NOW() - published_at))\n",[1050,2854,2855],{"class":1052,"line":1210},[1050,2856,2857],{"class":1112},"                        ELSE NULL \n",[1050,2859,2860],{"class":1052,"line":1215},[1050,2861,2862],{"class":1112},"                    END\n",[1050,2864,2865],{"class":1052,"line":1237},[1050,2866,2867],{"class":1105},"                \"\"\"\n",[1050,2869,2870],{"class":1052,"line":1256},[1050,2871,2872],{"class":1071},"            },\n",[1050,2874,2875,2878],{"class":1052,"line":1261},[1050,2876,2877],{"class":1290},"            where",[1050,2879,2880],{"class":1071},"=[\n",[1050,2882,2883,2886,2889,2891,2893],{"class":1052,"line":1303},[1050,2884,2885],{"class":1105},"                \"",[1050,2887,2888],{"class":1112},"status = ",[1050,2890,2094],{"class":1188},[1050,2892,2560],{"class":1105},[1050,2894,2790],{"class":1071},[1050,2896,2897,2899,2902,2904],{"class":1052,"line":1308},[1050,2898,2885],{"class":1105},[1050,2900,2901],{"class":1112},"created_at >= ",[1050,2903,2094],{"class":1188},[1050,2905,2906],{"class":1105},"\"\n",[1050,2908,2909],{"class":1052,"line":1333},[1050,2910,2911],{"class":1071},"            ],\n",[1050,2913,2914,2917,2920,2922,2925,2927,2929,2932,2935,2937],{"class":1052,"line":1360},[1050,2915,2916],{"class":1290},"            params",[1050,2918,2919],{"class":1071},"=[",[1050,2921,2445],{"class":1105},[1050,2923,2924],{"class":1112},"published",[1050,2926,2445],{"class":1105},[1050,2928,1250],{"class":1071},[1050,2930,2931],{"class":1105}," '",[1050,2933,2934],{"class":1112},"2023-01-01",[1050,2936,2445],{"class":1105},[1050,2938,2939],{"class":1071},"],\n",[1050,2941,2942,2945,2947,2949,2952,2954],{"class":1052,"line":1402},[1050,2943,2944],{"class":1290},"            order_by",[1050,2946,2919],{"class":1071},[1050,2948,2445],{"class":1105},[1050,2950,2951],{"class":1112},"-view_count",[1050,2953,2445],{"class":1105},[1050,2955,1399],{"class":1071},[1050,2957,2958],{"class":1052,"line":1450},[1050,2959,2960],{"class":1071},"        )\n",[1050,2962,2963],{"class":1052,"line":1457},[1050,2964,1093],{"class":1092},[1050,2966,2967,2969,2972,2974,2976,2978,2981,2983,2986,2988,2991],{"class":1052,"line":1463},[1050,2968,2028],{"class":1063},[1050,2970,2971],{"class":1067}," complex_filtering_with_raw",[1050,2973,1287],{"class":1071},[1050,2975,2037],{"class":2036},[1050,2977,1250],{"class":1071},[1050,2979,2980],{"class":1643}," author_ids",[1050,2982,1250],{"class":1071},[1050,2984,2985],{"class":1643}," min_engagement",[1050,2987,1102],{"class":1280},[1050,2989,2990],{"class":1296},"100",[1050,2992,1647],{"class":1071},[1050,2994,2995,2997,3000],{"class":1052,"line":1473},[1050,2996,2054],{"class":1078},[1050,2998,2999],{"class":1082},"Complex filtering using raw SQL conditions",[1050,3001,1086],{"class":1078},[1050,3003,3004],{"class":1052,"line":1483},[1050,3005,2064],{"class":1092},[1050,3007,3008,3010,3012,3014,3016],{"class":1052,"line":1488},[1050,3009,1405],{"class":1218},[1050,3011,2072],{"class":2071},[1050,3013,1225],{"class":1071},[1050,3015,2736],{"class":1273},[1050,3017,2739],{"class":1071},[1050,3019,3020,3022],{"class":1052,"line":1497},[1050,3021,2744],{"class":1290},[1050,3023,2747],{"class":1071},[1050,3025,3026,3028,3030,3032,3034],{"class":1052,"line":1502},[1050,3027,2752],{"class":1105},[1050,3029,2666],{"class":1112},[1050,3031,2445],{"class":1105},[1050,3033,2760],{"class":1071},[1050,3035,1106],{"class":1105},[1050,3037,3038],{"class":1052,"line":1508},[1050,3039,3040],{"class":1112},"                    (view_count + \n",[1050,3042,3043],{"class":1052,"line":1514},[1050,3044,3045],{"class":1112},"                     (SELECT COUNT(*) FROM blog_comment WHERE post_id = blog_post.id) * 5 +\n",[1050,3047,3048],{"class":1052,"line":1520},[1050,3049,3050],{"class":1112},"                     (SELECT COUNT(*) FROM blog_like WHERE post_id = blog_post.id) * 2)\n",[1050,3052,3053],{"class":1052,"line":1526},[1050,3054,2867],{"class":1105},[1050,3056,3057],{"class":1052,"line":1532},[1050,3058,2872],{"class":1071},[1050,3060,3061,3063],{"class":1052,"line":1538},[1050,3062,2877],{"class":1290},[1050,3064,2880],{"class":1071},[1050,3066,3067],{"class":1052,"line":1544},[1050,3068,2867],{"class":1105},[1050,3070,3071,3074,3076],{"class":1052,"line":1550},[1050,3072,3073],{"class":1112},"                author_id = ANY(",[1050,3075,2094],{"class":1188},[1050,3077,3078],{"class":1112},") AND\n",[1050,3080,3081],{"class":1052,"line":1556},[1050,3082,3083],{"class":1112},"                (view_count + \n",[1050,3085,3086],{"class":1052,"line":1562},[1050,3087,3088],{"class":1112},"                 (SELECT COUNT(*) FROM blog_comment WHERE post_id = blog_post.id) * 5 +\n",[1050,3090,3091,3094],{"class":1052,"line":1568},[1050,3092,3093],{"class":1112},"                 (SELECT COUNT(*) FROM blog_like WHERE post_id = blog_post.id) * 2) >= ",[1050,3095,1189],{"class":1188},[1050,3097,3098],{"class":1052,"line":1573},[1050,3099,2867],{"class":1105},[1050,3101,3102],{"class":1052,"line":1579},[1050,3103,2911],{"class":1071},[1050,3105,3106,3108,3110,3113,3115,3117],{"class":1052,"line":1585},[1050,3107,2916],{"class":1290},[1050,3109,2919],{"class":1071},[1050,3111,3112],{"class":1273},"author_ids",[1050,3114,1250],{"class":1071},[1050,3116,2985],{"class":1273},[1050,3118,1399],{"class":1071},[1050,3120,3121],{"class":1052,"line":1591},[1050,3122,2960],{"class":1071},[1050,3124,3125],{"class":1052,"line":1597},[1050,3126,1454],{"emptyLinePlaceholder":1453},[1050,3128,3129],{"class":1052,"line":1602},[1050,3130,2502],{"class":1056},[1050,3132,3133,3136,3138,3140,3142,3144,3146,3149],{"class":1052,"line":1607},[1050,3134,3135],{"class":1092},"annotated_posts ",[1050,3137,1102],{"class":1071},[1050,3139,2334],{"class":1092},[1050,3141,1225],{"class":1071},[1050,3143,2516],{"class":1395},[1050,3145,1225],{"class":1071},[1050,3147,3148],{"class":1273},"annotate_with_raw_sql",[1050,3150,1932],{"class":1071},[1050,3152,3153,3155,3157,3159,3162],{"class":1052,"line":1622},[1050,3154,2537],{"class":1218},[1050,3156,2540],{"class":1092},[1050,3158,1388],{"class":1218},[1050,3160,3161],{"class":1092}," annotated_posts",[1050,3163,1330],{"class":1071},[1050,3165,3166,3168,3170,3172,3174,3176,3178,3180,3182,3184,3186,3188,3190,3192,3194,3196,3199,3201,3203,3205,3207,3209,3212],{"class":1052,"line":1627},[1050,3167,2552],{"class":1416},[1050,3169,1287],{"class":1071},[1050,3171,2557],{"class":1063},[1050,3173,2560],{"class":1112},[1050,3175,2563],{"class":1188},[1050,3177,2566],{"class":1273},[1050,3179,1225],{"class":1071},[1050,3181,2571],{"class":1395},[1050,3183,2574],{"class":1188},[1050,3185,2577],{"class":1112},[1050,3187,2563],{"class":1188},[1050,3189,2566],{"class":1273},[1050,3191,1225],{"class":1071},[1050,3193,2755],{"class":1395},[1050,3195,2574],{"class":1188},[1050,3197,3198],{"class":1112}," comments, ",[1050,3200,2563],{"class":1188},[1050,3202,2566],{"class":1273},[1050,3204,1225],{"class":1071},[1050,3206,2797],{"class":1395},[1050,3208,2574],{"class":1188},[1050,3210,3211],{"class":1112}," rating\"",[1050,3213,1300],{"class":1071},[1030,3215,3217],{"id":3216},"direct-database-access","Direct Database Access",[1035,3219,3221],{"id":3220},"using-djangos-database-connection","Using Django's Database Connection",[1040,3223,3225],{"className":1042,"code":3224,"language":1044,"meta":1045,"style":1045},"from django.db import connection, connections\n\ndef execute_raw_query(sql, params=None, database='default'):\n    \"\"\"Execute raw SQL query and return results\"\"\"\n    \n    db_connection = connections[database]\n    \n    with db_connection.cursor() as cursor:\n        cursor.execute(sql, params or [])\n        \n        if cursor.description:\n            # SELECT query - return results\n            columns = [col[0] for col in cursor.description]\n            return [dict(zip(columns, row)) for row in cursor.fetchall()]\n        else:\n            # INSERT/UPDATE/DELETE - return affected rows\n            return cursor.rowcount\n\ndef execute_many_raw(sql, param_list, database='default'):\n    \"\"\"Execute raw SQL with multiple parameter sets\"\"\"\n    \n    db_connection = connections[database]\n    \n    with db_connection.cursor() as cursor:\n        cursor.executemany(sql, param_list)\n        return cursor.rowcount\n\n# Complex reporting queries\ndef generate_sales_report(start_date, end_date):\n    \"\"\"Generate comprehensive sales report\"\"\"\n    \n    sql = \"\"\"\n    WITH daily_sales AS (\n        SELECT \n            DATE(o.created_at) as sale_date,\n            COUNT(DISTINCT o.id) as order_count,\n            COUNT(DISTINCT o.customer_id) as unique_customers,\n            SUM(oi.quantity * oi.unit_price) as daily_revenue,\n            AVG(oi.quantity * oi.unit_price) as avg_order_value\n        FROM orders_order o\n        JOIN orders_orderitem oi ON o.id = oi.order_id\n        WHERE o.status = 'completed'\n            AND o.created_at BETWEEN %s AND %s\n        GROUP BY DATE(o.created_at)\n    ),\n    product_performance AS (\n        SELECT \n            p.name as product_name,\n            p.category_id,\n            SUM(oi.quantity) as units_sold,\n            SUM(oi.quantity * oi.unit_price) as product_revenue,\n            COUNT(DISTINCT oi.order_id) as orders_containing_product\n        FROM products_product p\n        JOIN orders_orderitem oi ON p.id = oi.product_id\n        JOIN orders_order o ON oi.order_id = o.id\n        WHERE o.status = 'completed'\n            AND o.created_at BETWEEN %s AND %s\n        GROUP BY p.id, p.name, p.category_id\n    ),\n    customer_segments AS (\n        SELECT \n            CASE \n                WHEN total_spent >= 1000 THEN 'VIP'\n                WHEN total_spent >= 500 THEN 'Premium'\n                WHEN total_spent >= 100 THEN 'Regular'\n                ELSE 'New'\n            END as segment,\n            COUNT(*) as customer_count,\n            AVG(total_spent) as avg_spent_per_customer\n        FROM (\n            SELECT \n                o.customer_id,\n                SUM(oi.quantity * oi.unit_price) as total_spent\n            FROM orders_order o\n            JOIN orders_orderitem oi ON o.id = oi.order_id\n            WHERE o.status = 'completed'\n                AND o.created_at BETWEEN %s AND %s\n            GROUP BY o.customer_id\n        ) customer_totals\n        GROUP BY segment\n    )\n    SELECT \n        'daily_sales' as report_type,\n        json_agg(daily_sales.*) as data\n    FROM daily_sales\n    UNION ALL\n    SELECT \n        'product_performance' as report_type,\n        json_agg(product_performance.*) as data\n    FROM product_performance\n    UNION ALL\n    SELECT \n        'customer_segments' as report_type,\n        json_agg(customer_segments.*) as data\n    FROM customer_segments\n    \"\"\"\n    \n    params = [start_date, end_date] * 3  # Same date range for all CTEs\n    results = execute_raw_query(sql, params)\n    \n    # Organize results by report type\n    report_data = {}\n    for row in results:\n        report_data[row['report_type']] = row['data']\n    \n    return report_data\n\n# Bulk operations with raw SQL\ndef bulk_update_view_counts(post_view_data):\n    \"\"\"Efficiently update view counts for multiple posts\"\"\"\n    \n    sql = \"\"\"\n    UPDATE blog_post \n    SET view_count = view_count + data.increment\n    FROM (VALUES %s) AS data(post_id, increment)\n    WHERE blog_post.id = data.post_id\n    \"\"\"\n    \n    # Prepare values for PostgreSQL\n    values = ','.join([f\"({post_id}, {increment})\" for post_id, increment in post_view_data])\n    final_sql = sql.replace('%s', values)\n    \n    with connection.cursor() as cursor:\n        cursor.execute(final_sql)\n        return cursor.rowcount\n\ndef bulk_insert_analytics_data(analytics_records):\n    \"\"\"Bulk insert analytics data\"\"\"\n    \n    sql = \"\"\"\n    INSERT INTO analytics_pageview (url, user_id, session_id, timestamp, user_agent)\n    VALUES %s\n    ON CONFLICT (url, user_id, session_id, timestamp) DO NOTHING\n    \"\"\"\n    \n    values = ','.join([\n        f\"('{record['url']}', {record['user_id']}, '{record['session_id']}', \"\n        f\"'{record['timestamp']}', '{record['user_agent']}')\"\n        for record in analytics_records\n    ])\n    \n    final_sql = sql.replace('%s', values)\n    \n    with connection.cursor() as cursor:\n        cursor.execute(final_sql)\n        return cursor.rowcount\n",[1047,3226,3227,3246,3250,3285,3294,3298,3315,3319,3338,3361,3365,3378,3383,3414,3451,3458,3463,3474,3478,3508,3517,3521,3535,3539,3557,3576,3586,3590,3595,3613,3622,3626,3634,3639,3643,3648,3653,3658,3663,3668,3673,3678,3683,3695,3700,3704,3709,3713,3718,3723,3728,3733,3738,3743,3748,3753,3757,3767,3772,3776,3781,3785,3790,3795,3800,3805,3810,3815,3820,3825,3830,3834,3839,3844,3849,3854,3859,3870,3875,3880,3885,3889,3893,3898,3903,3908,3913,3917,3922,3927,3932,3936,3940,3945,3950,3955,3959,3963,3990,4010,4015,4021,4032,4047,4086,4091,4099,4104,4110,4125,4135,4140,4149,4155,4161,4172,4178,4183,4188,4194,4258,4289,4294,4313,4329,4340,4345,4360,4370,4375,4384,4390,4398,4404,4409,4414,4434,4503,4551,4565,4571,4576,4603,4608,4627,4642],{"__ignoreMap":1045},[1050,3228,3229,3231,3233,3235,3237,3239,3241,3243],{"class":1052,"line":1053},[1050,3230,1986],{"class":1218},[1050,3232,1222],{"class":1092},[1050,3234,1225],{"class":1071},[1050,3236,1228],{"class":1092},[1050,3238,1231],{"class":1218},[1050,3240,1314],{"class":1092},[1050,3242,1250],{"class":1071},[1050,3244,3245],{"class":1092}," connections\n",[1050,3247,3248],{"class":1052,"line":1060},[1050,3249,1454],{"emptyLinePlaceholder":1453},[1050,3251,3252,3254,3256,3258,3260,3262,3265,3267,3270,3272,3275,3277,3279,3281,3283],{"class":1052,"line":1075},[1050,3253,1064],{"class":1063},[1050,3255,1613],{"class":1067},[1050,3257,1287],{"class":1071},[1050,3259,1346],{"class":1643},[1050,3261,1250],{"class":1071},[1050,3263,3264],{"class":1643}," params",[1050,3266,1102],{"class":1280},[1050,3268,3269],{"class":1967},"None",[1050,3271,1250],{"class":1071},[1050,3273,3274],{"class":1643}," database",[1050,3276,1102],{"class":1280},[1050,3278,2445],{"class":1105},[1050,3280,2407],{"class":1112},[1050,3282,2445],{"class":1105},[1050,3284,1647],{"class":1071},[1050,3286,3287,3289,3292],{"class":1052,"line":1089},[1050,3288,1079],{"class":1078},[1050,3290,3291],{"class":1082},"Execute raw SQL query and return results",[1050,3293,1086],{"class":1078},[1050,3295,3296],{"class":1052,"line":1096},[1050,3297,1093],{"class":1092},[1050,3299,3300,3303,3305,3308,3310,3313],{"class":1052,"line":1109},[1050,3301,3302],{"class":1092},"    db_connection ",[1050,3304,1102],{"class":1071},[1050,3306,3307],{"class":1092}," connections",[1050,3309,1373],{"class":1071},[1050,3311,3312],{"class":1092},"database",[1050,3314,1399],{"class":1071},[1050,3316,3317],{"class":1052,"line":1116},[1050,3318,1093],{"class":1092},[1050,3320,3321,3323,3326,3328,3330,3332,3334,3336],{"class":1052,"line":1122},[1050,3322,1311],{"class":1218},[1050,3324,3325],{"class":1092}," db_connection",[1050,3327,1225],{"class":1071},[1050,3329,1319],{"class":1273},[1050,3331,1277],{"class":1071},[1050,3333,1324],{"class":1218},[1050,3335,1327],{"class":1092},[1050,3337,1330],{"class":1071},[1050,3339,3340,3342,3344,3346,3348,3350,3352,3355,3358],{"class":1052,"line":1128},[1050,3341,1336],{"class":1092},[1050,3343,1225],{"class":1071},[1050,3345,1341],{"class":1273},[1050,3347,1287],{"class":1071},[1050,3349,1346],{"class":1273},[1050,3351,1250],{"class":1071},[1050,3353,3354],{"class":1273}," params ",[1050,3356,3357],{"class":1218},"or",[1050,3359,3360],{"class":1071}," [])\n",[1050,3362,3363],{"class":1052,"line":1134},[1050,3364,2064],{"class":1092},[1050,3366,3367,3370,3372,3374,3376],{"class":1052,"line":1140},[1050,3368,3369],{"class":1218},"        if",[1050,3371,1327],{"class":1092},[1050,3373,1225],{"class":1071},[1050,3375,1396],{"class":1395},[1050,3377,1330],{"class":1071},[1050,3379,3380],{"class":1052,"line":1146},[1050,3381,3382],{"class":1056},"            # SELECT query - return results\n",[1050,3384,3385,3388,3390,3392,3394,3396,3398,3400,3402,3404,3406,3408,3410,3412],{"class":1052,"line":1152},[1050,3386,3387],{"class":1092},"            columns ",[1050,3389,1102],{"class":1071},[1050,3391,1351],{"class":1071},[1050,3393,1370],{"class":1092},[1050,3395,1373],{"class":1071},[1050,3397,1376],{"class":1296},[1050,3399,1379],{"class":1071},[1050,3401,1382],{"class":1218},[1050,3403,1385],{"class":1092},[1050,3405,1388],{"class":1218},[1050,3407,1327],{"class":1092},[1050,3409,1225],{"class":1071},[1050,3411,1396],{"class":1395},[1050,3413,1399],{"class":1071},[1050,3415,3416,3419,3421,3423,3425,3427,3429,3431,3433,3435,3437,3439,3441,3443,3445,3447,3449],{"class":1052,"line":1158},[1050,3417,3418],{"class":1218},"            return",[1050,3420,1351],{"class":1071},[1050,3422,1411],{"class":1410},[1050,3424,1287],{"class":1071},[1050,3426,1417],{"class":1416},[1050,3428,1287],{"class":1071},[1050,3430,1422],{"class":1273},[1050,3432,1250],{"class":1071},[1050,3434,1427],{"class":1273},[1050,3436,1430],{"class":1071},[1050,3438,1382],{"class":1218},[1050,3440,1435],{"class":1092},[1050,3442,1388],{"class":1218},[1050,3444,1327],{"class":1092},[1050,3446,1225],{"class":1071},[1050,3448,1444],{"class":1273},[1050,3450,1447],{"class":1071},[1050,3452,3453,3456],{"class":1052,"line":1164},[1050,3454,3455],{"class":1218},"        else",[1050,3457,1330],{"class":1071},[1050,3459,3460],{"class":1052,"line":1170},[1050,3461,3462],{"class":1056},"            # INSERT/UPDATE/DELETE - return affected rows\n",[1050,3464,3465,3467,3469,3471],{"class":1052,"line":1176},[1050,3466,3418],{"class":1218},[1050,3468,1327],{"class":1092},[1050,3470,1225],{"class":1071},[1050,3472,3473],{"class":1395},"rowcount\n",[1050,3475,3476],{"class":1052,"line":1182},[1050,3477,1454],{"emptyLinePlaceholder":1453},[1050,3479,3480,3482,3485,3487,3489,3491,3494,3496,3498,3500,3502,3504,3506],{"class":1052,"line":1192},[1050,3481,1064],{"class":1063},[1050,3483,3484],{"class":1067}," execute_many_raw",[1050,3486,1287],{"class":1071},[1050,3488,1346],{"class":1643},[1050,3490,1250],{"class":1071},[1050,3492,3493],{"class":1643}," param_list",[1050,3495,1250],{"class":1071},[1050,3497,3274],{"class":1643},[1050,3499,1102],{"class":1280},[1050,3501,2445],{"class":1105},[1050,3503,2407],{"class":1112},[1050,3505,2445],{"class":1105},[1050,3507,1647],{"class":1071},[1050,3509,3510,3512,3515],{"class":1052,"line":1198},[1050,3511,1079],{"class":1078},[1050,3513,3514],{"class":1082},"Execute raw SQL with multiple parameter sets",[1050,3516,1086],{"class":1078},[1050,3518,3519],{"class":1052,"line":1204},[1050,3520,1093],{"class":1092},[1050,3522,3523,3525,3527,3529,3531,3533],{"class":1052,"line":1210},[1050,3524,3302],{"class":1092},[1050,3526,1102],{"class":1071},[1050,3528,3307],{"class":1092},[1050,3530,1373],{"class":1071},[1050,3532,3312],{"class":1092},[1050,3534,1399],{"class":1071},[1050,3536,3537],{"class":1052,"line":1215},[1050,3538,1093],{"class":1092},[1050,3540,3541,3543,3545,3547,3549,3551,3553,3555],{"class":1052,"line":1237},[1050,3542,1311],{"class":1218},[1050,3544,3325],{"class":1092},[1050,3546,1225],{"class":1071},[1050,3548,1319],{"class":1273},[1050,3550,1277],{"class":1071},[1050,3552,1324],{"class":1218},[1050,3554,1327],{"class":1092},[1050,3556,1330],{"class":1071},[1050,3558,3559,3561,3563,3566,3568,3570,3572,3574],{"class":1052,"line":1256},[1050,3560,1336],{"class":1092},[1050,3562,1225],{"class":1071},[1050,3564,3565],{"class":1273},"executemany",[1050,3567,1287],{"class":1071},[1050,3569,1346],{"class":1273},[1050,3571,1250],{"class":1071},[1050,3573,3493],{"class":1273},[1050,3575,1300],{"class":1071},[1050,3577,3578,3580,3582,3584],{"class":1052,"line":1261},[1050,3579,1405],{"class":1218},[1050,3581,1327],{"class":1092},[1050,3583,1225],{"class":1071},[1050,3585,3473],{"class":1395},[1050,3587,3588],{"class":1052,"line":1303},[1050,3589,1454],{"emptyLinePlaceholder":1453},[1050,3591,3592],{"class":1052,"line":1308},[1050,3593,3594],{"class":1056},"# Complex reporting queries\n",[1050,3596,3597,3599,3602,3604,3606,3608,3611],{"class":1052,"line":1333},[1050,3598,1064],{"class":1063},[1050,3600,3601],{"class":1067}," generate_sales_report",[1050,3603,1287],{"class":1071},[1050,3605,1354],{"class":1643},[1050,3607,1250],{"class":1071},[1050,3609,3610],{"class":1643}," end_date",[1050,3612,1647],{"class":1071},[1050,3614,3615,3617,3620],{"class":1052,"line":1360},[1050,3616,1079],{"class":1078},[1050,3618,3619],{"class":1082},"Generate comprehensive sales report",[1050,3621,1086],{"class":1078},[1050,3623,3624],{"class":1052,"line":1402},[1050,3625,1093],{"class":1092},[1050,3627,3628,3630,3632],{"class":1052,"line":1450},[1050,3629,1099],{"class":1092},[1050,3631,1102],{"class":1071},[1050,3633,1106],{"class":1105},[1050,3635,3636],{"class":1052,"line":1457},[1050,3637,3638],{"class":1112},"    WITH daily_sales AS (\n",[1050,3640,3641],{"class":1052,"line":1463},[1050,3642,1683],{"class":1112},[1050,3644,3645],{"class":1052,"line":1473},[1050,3646,3647],{"class":1112},"            DATE(o.created_at) as sale_date,\n",[1050,3649,3650],{"class":1052,"line":1483},[1050,3651,3652],{"class":1112},"            COUNT(DISTINCT o.id) as order_count,\n",[1050,3654,3655],{"class":1052,"line":1488},[1050,3656,3657],{"class":1112},"            COUNT(DISTINCT o.customer_id) as unique_customers,\n",[1050,3659,3660],{"class":1052,"line":1497},[1050,3661,3662],{"class":1112},"            SUM(oi.quantity * oi.unit_price) as daily_revenue,\n",[1050,3664,3665],{"class":1052,"line":1502},[1050,3666,3667],{"class":1112},"            AVG(oi.quantity * oi.unit_price) as avg_order_value\n",[1050,3669,3670],{"class":1052,"line":1508},[1050,3671,3672],{"class":1112},"        FROM orders_order o\n",[1050,3674,3675],{"class":1052,"line":1514},[1050,3676,3677],{"class":1112},"        JOIN orders_orderitem oi ON o.id = oi.order_id\n",[1050,3679,3680],{"class":1052,"line":1520},[1050,3681,3682],{"class":1112},"        WHERE o.status = 'completed'\n",[1050,3684,3685,3688,3690,3693],{"class":1052,"line":1526},[1050,3686,3687],{"class":1112},"            AND o.created_at BETWEEN ",[1050,3689,2094],{"class":1188},[1050,3691,3692],{"class":1112}," AND ",[1050,3694,1189],{"class":1188},[1050,3696,3697],{"class":1052,"line":1532},[1050,3698,3699],{"class":1112},"        GROUP BY DATE(o.created_at)\n",[1050,3701,3702],{"class":1052,"line":1538},[1050,3703,1751],{"class":1112},[1050,3705,3706],{"class":1052,"line":1544},[1050,3707,3708],{"class":1112},"    product_performance AS (\n",[1050,3710,3711],{"class":1052,"line":1550},[1050,3712,1683],{"class":1112},[1050,3714,3715],{"class":1052,"line":1556},[1050,3716,3717],{"class":1112},"            p.name as product_name,\n",[1050,3719,3720],{"class":1052,"line":1562},[1050,3721,3722],{"class":1112},"            p.category_id,\n",[1050,3724,3725],{"class":1052,"line":1568},[1050,3726,3727],{"class":1112},"            SUM(oi.quantity) as units_sold,\n",[1050,3729,3730],{"class":1052,"line":1573},[1050,3731,3732],{"class":1112},"            SUM(oi.quantity * oi.unit_price) as product_revenue,\n",[1050,3734,3735],{"class":1052,"line":1579},[1050,3736,3737],{"class":1112},"            COUNT(DISTINCT oi.order_id) as orders_containing_product\n",[1050,3739,3740],{"class":1052,"line":1585},[1050,3741,3742],{"class":1112},"        FROM products_product p\n",[1050,3744,3745],{"class":1052,"line":1591},[1050,3746,3747],{"class":1112},"        JOIN orders_orderitem oi ON p.id = oi.product_id\n",[1050,3749,3750],{"class":1052,"line":1597},[1050,3751,3752],{"class":1112},"        JOIN orders_order o ON oi.order_id = o.id\n",[1050,3754,3755],{"class":1052,"line":1602},[1050,3756,3682],{"class":1112},[1050,3758,3759,3761,3763,3765],{"class":1052,"line":1607},[1050,3760,3687],{"class":1112},[1050,3762,2094],{"class":1188},[1050,3764,3692],{"class":1112},[1050,3766,1189],{"class":1188},[1050,3768,3769],{"class":1052,"line":1622},[1050,3770,3771],{"class":1112},"        GROUP BY p.id, p.name, p.category_id\n",[1050,3773,3774],{"class":1052,"line":1627},[1050,3775,1751],{"class":1112},[1050,3777,3778],{"class":1052,"line":1633},[1050,3779,3780],{"class":1112},"    customer_segments AS (\n",[1050,3782,3783],{"class":1052,"line":1650},[1050,3784,1683],{"class":1112},[1050,3786,3787],{"class":1052,"line":1660},[1050,3788,3789],{"class":1112},"            CASE \n",[1050,3791,3792],{"class":1052,"line":1665},[1050,3793,3794],{"class":1112},"                WHEN total_spent >= 1000 THEN 'VIP'\n",[1050,3796,3797],{"class":1052,"line":1674},[1050,3798,3799],{"class":1112},"                WHEN total_spent >= 500 THEN 'Premium'\n",[1050,3801,3802],{"class":1052,"line":1680},[1050,3803,3804],{"class":1112},"                WHEN total_spent >= 100 THEN 'Regular'\n",[1050,3806,3807],{"class":1052,"line":1686},[1050,3808,3809],{"class":1112},"                ELSE 'New'\n",[1050,3811,3812],{"class":1052,"line":1692},[1050,3813,3814],{"class":1112},"            END as segment,\n",[1050,3816,3817],{"class":1052,"line":1698},[1050,3818,3819],{"class":1112},"            COUNT(*) as customer_count,\n",[1050,3821,3822],{"class":1052,"line":1704},[1050,3823,3824],{"class":1112},"            AVG(total_spent) as avg_spent_per_customer\n",[1050,3826,3827],{"class":1052,"line":1710},[1050,3828,3829],{"class":1112},"        FROM (\n",[1050,3831,3832],{"class":1052,"line":1716},[1050,3833,2169],{"class":1112},[1050,3835,3836],{"class":1052,"line":1722},[1050,3837,3838],{"class":1112},"                o.customer_id,\n",[1050,3840,3841],{"class":1052,"line":1728},[1050,3842,3843],{"class":1112},"                SUM(oi.quantity * oi.unit_price) as total_spent\n",[1050,3845,3846],{"class":1052,"line":1734},[1050,3847,3848],{"class":1112},"            FROM orders_order o\n",[1050,3850,3851],{"class":1052,"line":1740},[1050,3852,3853],{"class":1112},"            JOIN orders_orderitem oi ON o.id = oi.order_id\n",[1050,3855,3856],{"class":1052,"line":1748},[1050,3857,3858],{"class":1112},"            WHERE o.status = 'completed'\n",[1050,3860,3861,3864,3866,3868],{"class":1052,"line":1754},[1050,3862,3863],{"class":1112},"                AND o.created_at BETWEEN ",[1050,3865,2094],{"class":1188},[1050,3867,3692],{"class":1112},[1050,3869,1189],{"class":1188},[1050,3871,3872],{"class":1052,"line":1760},[1050,3873,3874],{"class":1112},"            GROUP BY o.customer_id\n",[1050,3876,3877],{"class":1052,"line":1765},[1050,3878,3879],{"class":1112},"        ) customer_totals\n",[1050,3881,3882],{"class":1052,"line":1771},[1050,3883,3884],{"class":1112},"        GROUP BY segment\n",[1050,3886,3887],{"class":1052,"line":1777},[1050,3888,1780],{"class":1112},[1050,3890,3891],{"class":1052,"line":1783},[1050,3892,1113],{"class":1112},[1050,3894,3895],{"class":1052,"line":1788},[1050,3896,3897],{"class":1112},"        'daily_sales' as report_type,\n",[1050,3899,3900],{"class":1052,"line":1794},[1050,3901,3902],{"class":1112},"        json_agg(daily_sales.*) as data\n",[1050,3904,3905],{"class":1052,"line":1800},[1050,3906,3907],{"class":1112},"    FROM daily_sales\n",[1050,3909,3910],{"class":1052,"line":1806},[1050,3911,3912],{"class":1112},"    UNION ALL\n",[1050,3914,3915],{"class":1052,"line":1812},[1050,3916,1113],{"class":1112},[1050,3918,3919],{"class":1052,"line":1818},[1050,3920,3921],{"class":1112},"        'product_performance' as report_type,\n",[1050,3923,3924],{"class":1052,"line":1824},[1050,3925,3926],{"class":1112},"        json_agg(product_performance.*) as data\n",[1050,3928,3929],{"class":1052,"line":1830},[1050,3930,3931],{"class":1112},"    FROM product_performance\n",[1050,3933,3934],{"class":1052,"line":1836},[1050,3935,3912],{"class":1112},[1050,3937,3938],{"class":1052,"line":1841},[1050,3939,1113],{"class":1112},[1050,3941,3942],{"class":1052,"line":1846},[1050,3943,3944],{"class":1112},"        'customer_segments' as report_type,\n",[1050,3946,3947],{"class":1052,"line":1865},[1050,3948,3949],{"class":1112},"        json_agg(customer_segments.*) as data\n",[1050,3951,3952],{"class":1052,"line":1886},[1050,3953,3954],{"class":1112},"    FROM customer_segments\n",[1050,3956,3957],{"class":1052,"line":1917},[1050,3958,1207],{"class":1105},[1050,3960,3961],{"class":1052,"line":1935},[1050,3962,1093],{"class":1092},[1050,3964,3966,3969,3971,3973,3975,3977,3979,3981,3984,3987],{"class":1052,"line":3965},98,[1050,3967,3968],{"class":1092},"    params ",[1050,3970,1102],{"class":1071},[1050,3972,1351],{"class":1071},[1050,3974,1354],{"class":1092},[1050,3976,1250],{"class":1071},[1050,3978,3610],{"class":1092},[1050,3980,1379],{"class":1071},[1050,3982,3983],{"class":1280}," *",[1050,3985,3986],{"class":1296}," 3",[1050,3988,3989],{"class":1056},"  # Same date range for all CTEs\n",[1050,3991,3993,3996,3998,4000,4002,4004,4006,4008],{"class":1052,"line":3992},99,[1050,3994,3995],{"class":1092},"    results ",[1050,3997,1102],{"class":1071},[1050,3999,1613],{"class":1273},[1050,4001,1287],{"class":1071},[1050,4003,1346],{"class":1273},[1050,4005,1250],{"class":1071},[1050,4007,3264],{"class":1273},[1050,4009,1300],{"class":1071},[1050,4011,4013],{"class":1052,"line":4012},100,[1050,4014,1093],{"class":1092},[1050,4016,4018],{"class":1052,"line":4017},101,[1050,4019,4020],{"class":1056},"    # Organize results by report type\n",[1050,4022,4024,4027,4029],{"class":1052,"line":4023},102,[1050,4025,4026],{"class":1092},"    report_data ",[1050,4028,1102],{"class":1071},[1050,4030,4031],{"class":1071}," {}\n",[1050,4033,4035,4038,4040,4042,4045],{"class":1052,"line":4034},103,[1050,4036,4037],{"class":1218},"    for",[1050,4039,1435],{"class":1092},[1050,4041,1388],{"class":1218},[1050,4043,4044],{"class":1092}," results",[1050,4046,1330],{"class":1071},[1050,4048,4050,4053,4055,4058,4060,4062,4065,4067,4070,4073,4075,4077,4079,4082,4084],{"class":1052,"line":4049},104,[1050,4051,4052],{"class":1092},"        report_data",[1050,4054,1373],{"class":1071},[1050,4056,4057],{"class":1092},"row",[1050,4059,1373],{"class":1071},[1050,4061,2445],{"class":1105},[1050,4063,4064],{"class":1112},"report_type",[1050,4066,2445],{"class":1105},[1050,4068,4069],{"class":1071},"]]",[1050,4071,4072],{"class":1071}," =",[1050,4074,1427],{"class":1092},[1050,4076,1373],{"class":1071},[1050,4078,2445],{"class":1105},[1050,4080,4081],{"class":1112},"data",[1050,4083,2445],{"class":1105},[1050,4085,1399],{"class":1071},[1050,4087,4089],{"class":1052,"line":4088},105,[1050,4090,1093],{"class":1092},[1050,4092,4094,4096],{"class":1052,"line":4093},106,[1050,4095,1610],{"class":1218},[1050,4097,4098],{"class":1092}," report_data\n",[1050,4100,4102],{"class":1052,"line":4101},107,[1050,4103,1454],{"emptyLinePlaceholder":1453},[1050,4105,4107],{"class":1052,"line":4106},108,[1050,4108,4109],{"class":1056},"# Bulk operations with raw SQL\n",[1050,4111,4113,4115,4118,4120,4123],{"class":1052,"line":4112},109,[1050,4114,1064],{"class":1063},[1050,4116,4117],{"class":1067}," bulk_update_view_counts",[1050,4119,1287],{"class":1071},[1050,4121,4122],{"class":1643},"post_view_data",[1050,4124,1647],{"class":1071},[1050,4126,4128,4130,4133],{"class":1052,"line":4127},110,[1050,4129,1079],{"class":1078},[1050,4131,4132],{"class":1082},"Efficiently update view counts for multiple posts",[1050,4134,1086],{"class":1078},[1050,4136,4138],{"class":1052,"line":4137},111,[1050,4139,1093],{"class":1092},[1050,4141,4143,4145,4147],{"class":1052,"line":4142},112,[1050,4144,1099],{"class":1092},[1050,4146,1102],{"class":1071},[1050,4148,1106],{"class":1105},[1050,4150,4152],{"class":1052,"line":4151},113,[1050,4153,4154],{"class":1112},"    UPDATE blog_post \n",[1050,4156,4158],{"class":1052,"line":4157},114,[1050,4159,4160],{"class":1112},"    SET view_count = view_count + data.increment\n",[1050,4162,4164,4167,4169],{"class":1052,"line":4163},115,[1050,4165,4166],{"class":1112},"    FROM (VALUES ",[1050,4168,2094],{"class":1188},[1050,4170,4171],{"class":1112},") AS data(post_id, increment)\n",[1050,4173,4175],{"class":1052,"line":4174},116,[1050,4176,4177],{"class":1112},"    WHERE blog_post.id = data.post_id\n",[1050,4179,4181],{"class":1052,"line":4180},117,[1050,4182,1207],{"class":1105},[1050,4184,4186],{"class":1052,"line":4185},118,[1050,4187,1093],{"class":1092},[1050,4189,4191],{"class":1052,"line":4190},119,[1050,4192,4193],{"class":1056},"    # Prepare values for PostgreSQL\n",[1050,4195,4197,4200,4202,4204,4206,4208,4210,4213,4216,4218,4221,4223,4226,4228,4231,4233,4236,4238,4241,4243,4246,4248,4251,4253,4256],{"class":1052,"line":4196},120,[1050,4198,4199],{"class":1092},"    values ",[1050,4201,1102],{"class":1071},[1050,4203,2931],{"class":1105},[1050,4205,1250],{"class":1112},[1050,4207,2445],{"class":1105},[1050,4209,1225],{"class":1071},[1050,4211,4212],{"class":1273},"join",[1050,4214,4215],{"class":1071},"([",[1050,4217,2557],{"class":1063},[1050,4219,4220],{"class":1112},"\"(",[1050,4222,2563],{"class":1188},[1050,4224,4225],{"class":1273},"post_id",[1050,4227,2574],{"class":1188},[1050,4229,4230],{"class":1112},", ",[1050,4232,2563],{"class":1188},[1050,4234,4235],{"class":1273},"increment",[1050,4237,2574],{"class":1188},[1050,4239,4240],{"class":1112},")\"",[1050,4242,1382],{"class":1218},[1050,4244,4245],{"class":1273}," post_id",[1050,4247,1250],{"class":1071},[1050,4249,4250],{"class":1273}," increment ",[1050,4252,1388],{"class":1218},[1050,4254,4255],{"class":1273}," post_view_data",[1050,4257,1357],{"class":1071},[1050,4259,4261,4264,4266,4269,4271,4274,4276,4278,4280,4282,4284,4287],{"class":1052,"line":4260},121,[1050,4262,4263],{"class":1092},"    final_sql ",[1050,4265,1102],{"class":1071},[1050,4267,4268],{"class":1092}," sql",[1050,4270,1225],{"class":1071},[1050,4272,4273],{"class":1273},"replace",[1050,4275,1287],{"class":1071},[1050,4277,2445],{"class":1105},[1050,4279,2094],{"class":1188},[1050,4281,2445],{"class":1105},[1050,4283,1250],{"class":1071},[1050,4285,4286],{"class":1273}," values",[1050,4288,1300],{"class":1071},[1050,4290,4292],{"class":1052,"line":4291},122,[1050,4293,1093],{"class":1092},[1050,4295,4297,4299,4301,4303,4305,4307,4309,4311],{"class":1052,"line":4296},123,[1050,4298,1311],{"class":1218},[1050,4300,1314],{"class":1092},[1050,4302,1225],{"class":1071},[1050,4304,1319],{"class":1273},[1050,4306,1277],{"class":1071},[1050,4308,1324],{"class":1218},[1050,4310,1327],{"class":1092},[1050,4312,1330],{"class":1071},[1050,4314,4316,4318,4320,4322,4324,4327],{"class":1052,"line":4315},124,[1050,4317,1336],{"class":1092},[1050,4319,1225],{"class":1071},[1050,4321,1341],{"class":1273},[1050,4323,1287],{"class":1071},[1050,4325,4326],{"class":1273},"final_sql",[1050,4328,1300],{"class":1071},[1050,4330,4332,4334,4336,4338],{"class":1052,"line":4331},125,[1050,4333,1405],{"class":1218},[1050,4335,1327],{"class":1092},[1050,4337,1225],{"class":1071},[1050,4339,3473],{"class":1395},[1050,4341,4343],{"class":1052,"line":4342},126,[1050,4344,1454],{"emptyLinePlaceholder":1453},[1050,4346,4348,4350,4353,4355,4358],{"class":1052,"line":4347},127,[1050,4349,1064],{"class":1063},[1050,4351,4352],{"class":1067}," bulk_insert_analytics_data",[1050,4354,1287],{"class":1071},[1050,4356,4357],{"class":1643},"analytics_records",[1050,4359,1647],{"class":1071},[1050,4361,4363,4365,4368],{"class":1052,"line":4362},128,[1050,4364,1079],{"class":1078},[1050,4366,4367],{"class":1082},"Bulk insert analytics data",[1050,4369,1086],{"class":1078},[1050,4371,4373],{"class":1052,"line":4372},129,[1050,4374,1093],{"class":1092},[1050,4376,4378,4380,4382],{"class":1052,"line":4377},130,[1050,4379,1099],{"class":1092},[1050,4381,1102],{"class":1071},[1050,4383,1106],{"class":1105},[1050,4385,4387],{"class":1052,"line":4386},131,[1050,4388,4389],{"class":1112},"    INSERT INTO analytics_pageview (url, user_id, session_id, timestamp, user_agent)\n",[1050,4391,4393,4396],{"class":1052,"line":4392},132,[1050,4394,4395],{"class":1112},"    VALUES ",[1050,4397,1189],{"class":1188},[1050,4399,4401],{"class":1052,"line":4400},133,[1050,4402,4403],{"class":1112},"    ON CONFLICT (url, user_id, session_id, timestamp) DO NOTHING\n",[1050,4405,4407],{"class":1052,"line":4406},134,[1050,4408,1207],{"class":1105},[1050,4410,4412],{"class":1052,"line":4411},135,[1050,4413,1093],{"class":1092},[1050,4415,4417,4419,4421,4423,4425,4427,4429,4431],{"class":1052,"line":4416},136,[1050,4418,4199],{"class":1092},[1050,4420,1102],{"class":1071},[1050,4422,2931],{"class":1105},[1050,4424,1250],{"class":1112},[1050,4426,2445],{"class":1105},[1050,4428,1225],{"class":1071},[1050,4430,4212],{"class":1273},[1050,4432,4433],{"class":1071},"([\n",[1050,4435,4437,4440,4443,4445,4448,4450,4452,4455,4457,4459,4461,4464,4466,4468,4470,4472,4474,4476,4478,4480,4483,4485,4487,4489,4491,4494,4496,4498,4500],{"class":1052,"line":4436},137,[1050,4438,4439],{"class":1063},"        f",[1050,4441,4442],{"class":1112},"\"('",[1050,4444,2563],{"class":1188},[1050,4446,4447],{"class":1273},"record",[1050,4449,1373],{"class":1071},[1050,4451,2445],{"class":1105},[1050,4453,4454],{"class":1112},"url",[1050,4456,2445],{"class":1105},[1050,4458,1379],{"class":1071},[1050,4460,2574],{"class":1188},[1050,4462,4463],{"class":1112},"', ",[1050,4465,2563],{"class":1188},[1050,4467,4447],{"class":1273},[1050,4469,1373],{"class":1071},[1050,4471,2445],{"class":1105},[1050,4473,1644],{"class":1112},[1050,4475,2445],{"class":1105},[1050,4477,1379],{"class":1071},[1050,4479,2574],{"class":1188},[1050,4481,4482],{"class":1112},", '",[1050,4484,2563],{"class":1188},[1050,4486,4447],{"class":1273},[1050,4488,1373],{"class":1071},[1050,4490,2445],{"class":1105},[1050,4492,4493],{"class":1112},"session_id",[1050,4495,2445],{"class":1105},[1050,4497,1379],{"class":1071},[1050,4499,2574],{"class":1188},[1050,4501,4502],{"class":1112},"', \"\n",[1050,4504,4506,4508,4511,4513,4515,4517,4519,4522,4524,4526,4528,4531,4533,4535,4537,4539,4542,4544,4546,4548],{"class":1052,"line":4505},138,[1050,4507,4439],{"class":1063},[1050,4509,4510],{"class":1112},"\"'",[1050,4512,2563],{"class":1188},[1050,4514,4447],{"class":1273},[1050,4516,1373],{"class":1071},[1050,4518,2445],{"class":1105},[1050,4520,4521],{"class":1112},"timestamp",[1050,4523,2445],{"class":1105},[1050,4525,1379],{"class":1071},[1050,4527,2574],{"class":1188},[1050,4529,4530],{"class":1112},"', '",[1050,4532,2563],{"class":1188},[1050,4534,4447],{"class":1273},[1050,4536,1373],{"class":1071},[1050,4538,2445],{"class":1105},[1050,4540,4541],{"class":1112},"user_agent",[1050,4543,2445],{"class":1105},[1050,4545,1379],{"class":1071},[1050,4547,2574],{"class":1188},[1050,4549,4550],{"class":1112},"')\"\n",[1050,4552,4554,4557,4560,4562],{"class":1052,"line":4553},139,[1050,4555,4556],{"class":1218},"        for",[1050,4558,4559],{"class":1273}," record ",[1050,4561,1388],{"class":1218},[1050,4563,4564],{"class":1273}," analytics_records\n",[1050,4566,4568],{"class":1052,"line":4567},140,[1050,4569,4570],{"class":1071},"    ])\n",[1050,4572,4574],{"class":1052,"line":4573},141,[1050,4575,1093],{"class":1092},[1050,4577,4579,4581,4583,4585,4587,4589,4591,4593,4595,4597,4599,4601],{"class":1052,"line":4578},142,[1050,4580,4263],{"class":1092},[1050,4582,1102],{"class":1071},[1050,4584,4268],{"class":1092},[1050,4586,1225],{"class":1071},[1050,4588,4273],{"class":1273},[1050,4590,1287],{"class":1071},[1050,4592,2445],{"class":1105},[1050,4594,2094],{"class":1188},[1050,4596,2445],{"class":1105},[1050,4598,1250],{"class":1071},[1050,4600,4286],{"class":1273},[1050,4602,1300],{"class":1071},[1050,4604,4606],{"class":1052,"line":4605},143,[1050,4607,1093],{"class":1092},[1050,4609,4611,4613,4615,4617,4619,4621,4623,4625],{"class":1052,"line":4610},144,[1050,4612,1311],{"class":1218},[1050,4614,1314],{"class":1092},[1050,4616,1225],{"class":1071},[1050,4618,1319],{"class":1273},[1050,4620,1277],{"class":1071},[1050,4622,1324],{"class":1218},[1050,4624,1327],{"class":1092},[1050,4626,1330],{"class":1071},[1050,4628,4630,4632,4634,4636,4638,4640],{"class":1052,"line":4629},145,[1050,4631,1336],{"class":1092},[1050,4633,1225],{"class":1071},[1050,4635,1341],{"class":1273},[1050,4637,1287],{"class":1071},[1050,4639,4326],{"class":1273},[1050,4641,1300],{"class":1071},[1050,4643,4645,4647,4649,4651],{"class":1052,"line":4644},146,[1050,4646,1405],{"class":1218},[1050,4648,1327],{"class":1092},[1050,4650,1225],{"class":1071},[1050,4652,3473],{"class":1395},[1030,4654,4656],{"id":4655},"database-specific-features","Database-Specific Features",[1035,4658,4660],{"id":4659},"postgresql-advanced-features","PostgreSQL Advanced Features",[1040,4662,4664],{"className":1042,"code":4663,"language":1044,"meta":1045,"style":1045},"# PostgreSQL-specific raw SQL features\nclass PostgreSQLQueries:\n    \n    @staticmethod\n    def jsonb_aggregation_query():\n        \"\"\"Use PostgreSQL JSONB aggregation\"\"\"\n        \n        sql = \"\"\"\n        SELECT \n            c.name as category_name,\n            jsonb_agg(\n                jsonb_build_object(\n                    'id', p.id,\n                    'title', p.title,\n                    'view_count', p.view_count,\n                    'tags', (\n                        SELECT jsonb_agg(t.name)\n                        FROM blog_tag t\n                        JOIN blog_post_tags pt ON t.id = pt.tag_id\n                        WHERE pt.post_id = p.id\n                    )\n                ) ORDER BY p.view_count DESC\n            ) as posts\n        FROM blog_category c\n        JOIN blog_post p ON c.id = p.category_id\n        WHERE p.status = 'published'\n        GROUP BY c.id, c.name\n        ORDER BY c.name\n        \"\"\"\n        \n        return execute_raw_query(sql)\n    \n    @staticmethod\n    def array_operations():\n        \"\"\"PostgreSQL array operations\"\"\"\n        \n        sql = \"\"\"\n        SELECT \n            p.title,\n            array_agg(DISTINCT t.name ORDER BY t.name) as tag_names,\n            array_length(array_agg(DISTINCT t.name), 1) as tag_count\n        FROM blog_post p\n        LEFT JOIN blog_post_tags pt ON p.id = pt.post_id\n        LEFT JOIN blog_tag t ON pt.tag_id = t.id\n        WHERE p.status = 'published'\n        GROUP BY p.id, p.title\n        HAVING array_length(array_agg(DISTINCT t.name), 1) > 2\n        ORDER BY tag_count DESC\n        \"\"\"\n        \n        return execute_raw_query(sql)\n    \n    @staticmethod\n    def recursive_category_tree():\n        \"\"\"Recursive CTE for category hierarchy\"\"\"\n        \n        sql = \"\"\"\n        WITH RECURSIVE category_tree AS (\n            -- Base case: root categories\n            SELECT \n                id, \n                name, \n                parent_id, \n                0 as level,\n                ARRAY[name] as path,\n                name as root_category\n            FROM blog_category \n            WHERE parent_id IS NULL\n            \n            UNION ALL\n            \n            -- Recursive case: child categories\n            SELECT \n                c.id, \n                c.name, \n                c.parent_id,\n                ct.level + 1,\n                ct.path || c.name,\n                ct.root_category\n            FROM blog_category c\n            JOIN category_tree ct ON c.parent_id = ct.id\n        )\n        SELECT \n            ct.*,\n            array_to_string(ct.path, ' > ') as full_path,\n            (SELECT COUNT(*) FROM blog_post WHERE category_id = ct.id) as post_count\n        FROM category_tree ct\n        ORDER BY ct.root_category, ct.level, ct.name\n        \"\"\"\n        \n        return execute_raw_query(sql)\n\n# MySQL-specific features\nclass MySQLQueries:\n    \n    @staticmethod\n    def full_text_search_with_boolean_mode():\n        \"\"\"MySQL full-text search with boolean operators\"\"\"\n        \n        sql = \"\"\"\n        SELECT \n            *,\n            MATCH(title, content) AGAINST(%s IN BOOLEAN MODE) as relevance_score\n        FROM blog_post\n        WHERE MATCH(title, content) AGAINST(%s IN BOOLEAN MODE)\n            AND status = 'published'\n        ORDER BY relevance_score DESC\n        LIMIT 20\n        \"\"\"\n        \n        # Boolean search: +django +tutorial -beginner\n        query = \"+django +tutorial -beginner\"\n        return execute_raw_query(sql, [query, query])\n    \n    @staticmethod\n    def json_operations():\n        \"\"\"MySQL JSON operations (MySQL 5.7+)\"\"\"\n        \n        sql = \"\"\"\n        SELECT \n            id,\n            title,\n            JSON_EXTRACT(metadata, '$.tags') as tags,\n            JSON_EXTRACT(metadata, '$.difficulty') as difficulty,\n            JSON_LENGTH(JSON_EXTRACT(metadata, '$.tags')) as tag_count\n        FROM blog_post\n        WHERE JSON_EXTRACT(metadata, '$.difficulty') = 'intermediate'\n            AND JSON_LENGTH(JSON_EXTRACT(metadata, '$.tags')) > 2\n        ORDER BY created_at DESC\n        \"\"\"\n        \n        return execute_raw_query(sql)\n\n# SQLite-specific optimizations\nclass SQLiteQueries:\n    \n    @staticmethod\n    def fts_search():\n        \"\"\"SQLite FTS (Full-Text Search)\"\"\"\n        \n        # First, create FTS virtual table (in migration)\n        \"\"\"\n        CREATE VIRTUAL TABLE post_fts USING fts5(\n            title, content, content='blog_post', content_rowid='id'\n        );\n        \n        -- Populate FTS table\n        INSERT INTO post_fts(rowid, title, content)\n        SELECT id, title, content FROM blog_post WHERE status = 'published';\n        \"\"\"\n        \n        sql = \"\"\"\n        SELECT \n            p.*,\n            bm25(post_fts) as rank\n        FROM post_fts\n        JOIN blog_post p ON post_fts.rowid = p.id\n        WHERE post_fts MATCH %s\n            AND p.status = 'published'\n        ORDER BY rank\n        \"\"\"\n        \n        return execute_raw_query(sql, ['django tutorial'])\n",[1047,4665,4666,4671,4680,4684,4692,4701,4710,4714,4723,4727,4732,4737,4742,4747,4752,4757,4762,4767,4772,4777,4782,4787,4792,4797,4802,4807,4812,4817,4822,4827,4831,4843,4847,4853,4862,4871,4875,4883,4887,4892,4897,4902,4907,4912,4917,4921,4926,4931,4936,4940,4944,4956,4960,4966,4975,4984,4988,4996,5001,5006,5010,5015,5020,5025,5030,5035,5040,5045,5050,5055,5060,5064,5069,5073,5078,5083,5088,5093,5098,5103,5108,5113,5117,5121,5126,5131,5136,5141,5146,5150,5154,5166,5170,5175,5184,5188,5194,5203,5212,5216,5224,5228,5233,5243,5248,5258,5263,5268,5273,5277,5281,5286,5301,5323,5327,5333,5342,5351,5355,5363,5367,5372,5377,5382,5387,5392,5396,5401,5406,5411,5415,5419,5431,5435,5440,5449,5453,5459,5468,5477,5481,5486,5490,5495,5500,5505,5509,5515,5521,5527,5532,5537,5546,5551,5557,5563,5569,5575,5583,5589,5595,5600,5605],{"__ignoreMap":1045},[1050,4667,4668],{"class":1052,"line":1053},[1050,4669,4670],{"class":1056},"# PostgreSQL-specific raw SQL features\n",[1050,4672,4673,4675,4678],{"class":1052,"line":1060},[1050,4674,2006],{"class":1063},[1050,4676,4677],{"class":2009}," PostgreSQLQueries",[1050,4679,1330],{"class":1071},[1050,4681,4682],{"class":1052,"line":1075},[1050,4683,1093],{"class":1092},[1050,4685,4686,4689],{"class":1052,"line":1089},[1050,4687,4688],{"class":1071},"    @",[1050,4690,4691],{"class":1410},"staticmethod\n",[1050,4693,4694,4696,4699],{"class":1052,"line":1096},[1050,4695,2028],{"class":1063},[1050,4697,4698],{"class":1067}," jsonb_aggregation_query",[1050,4700,1072],{"class":1071},[1050,4702,4703,4705,4708],{"class":1052,"line":1109},[1050,4704,2054],{"class":1078},[1050,4706,4707],{"class":1082},"Use PostgreSQL JSONB aggregation",[1050,4709,1086],{"class":1078},[1050,4711,4712],{"class":1052,"line":1116},[1050,4713,2064],{"class":1092},[1050,4715,4716,4719,4721],{"class":1052,"line":1122},[1050,4717,4718],{"class":1092},"        sql ",[1050,4720,1102],{"class":1071},[1050,4722,1106],{"class":1105},[1050,4724,4725],{"class":1052,"line":1128},[1050,4726,1683],{"class":1112},[1050,4728,4729],{"class":1052,"line":1134},[1050,4730,4731],{"class":1112},"            c.name as category_name,\n",[1050,4733,4734],{"class":1052,"line":1140},[1050,4735,4736],{"class":1112},"            jsonb_agg(\n",[1050,4738,4739],{"class":1052,"line":1146},[1050,4740,4741],{"class":1112},"                jsonb_build_object(\n",[1050,4743,4744],{"class":1052,"line":1152},[1050,4745,4746],{"class":1112},"                    'id', p.id,\n",[1050,4748,4749],{"class":1052,"line":1158},[1050,4750,4751],{"class":1112},"                    'title', p.title,\n",[1050,4753,4754],{"class":1052,"line":1164},[1050,4755,4756],{"class":1112},"                    'view_count', p.view_count,\n",[1050,4758,4759],{"class":1052,"line":1170},[1050,4760,4761],{"class":1112},"                    'tags', (\n",[1050,4763,4764],{"class":1052,"line":1176},[1050,4765,4766],{"class":1112},"                        SELECT jsonb_agg(t.name)\n",[1050,4768,4769],{"class":1052,"line":1182},[1050,4770,4771],{"class":1112},"                        FROM blog_tag t\n",[1050,4773,4774],{"class":1052,"line":1192},[1050,4775,4776],{"class":1112},"                        JOIN blog_post_tags pt ON t.id = pt.tag_id\n",[1050,4778,4779],{"class":1052,"line":1198},[1050,4780,4781],{"class":1112},"                        WHERE pt.post_id = p.id\n",[1050,4783,4784],{"class":1052,"line":1204},[1050,4785,4786],{"class":1112},"                    )\n",[1050,4788,4789],{"class":1052,"line":1210},[1050,4790,4791],{"class":1112},"                ) ORDER BY p.view_count DESC\n",[1050,4793,4794],{"class":1052,"line":1215},[1050,4795,4796],{"class":1112},"            ) as posts\n",[1050,4798,4799],{"class":1052,"line":1237},[1050,4800,4801],{"class":1112},"        FROM blog_category c\n",[1050,4803,4804],{"class":1052,"line":1256},[1050,4805,4806],{"class":1112},"        JOIN blog_post p ON c.id = p.category_id\n",[1050,4808,4809],{"class":1052,"line":1261},[1050,4810,4811],{"class":1112},"        WHERE p.status = 'published'\n",[1050,4813,4814],{"class":1052,"line":1303},[1050,4815,4816],{"class":1112},"        GROUP BY c.id, c.name\n",[1050,4818,4819],{"class":1052,"line":1308},[1050,4820,4821],{"class":1112},"        ORDER BY c.name\n",[1050,4823,4824],{"class":1052,"line":1333},[1050,4825,4826],{"class":1105},"        \"\"\"\n",[1050,4828,4829],{"class":1052,"line":1360},[1050,4830,2064],{"class":1092},[1050,4832,4833,4835,4837,4839,4841],{"class":1052,"line":1402},[1050,4834,1405],{"class":1218},[1050,4836,1613],{"class":1273},[1050,4838,1287],{"class":1071},[1050,4840,1346],{"class":1273},[1050,4842,1300],{"class":1071},[1050,4844,4845],{"class":1052,"line":1450},[1050,4846,1093],{"class":1092},[1050,4848,4849,4851],{"class":1052,"line":1457},[1050,4850,4688],{"class":1071},[1050,4852,4691],{"class":1410},[1050,4854,4855,4857,4860],{"class":1052,"line":1463},[1050,4856,2028],{"class":1063},[1050,4858,4859],{"class":1067}," array_operations",[1050,4861,1072],{"class":1071},[1050,4863,4864,4866,4869],{"class":1052,"line":1473},[1050,4865,2054],{"class":1078},[1050,4867,4868],{"class":1082},"PostgreSQL array operations",[1050,4870,1086],{"class":1078},[1050,4872,4873],{"class":1052,"line":1483},[1050,4874,2064],{"class":1092},[1050,4876,4877,4879,4881],{"class":1052,"line":1488},[1050,4878,4718],{"class":1092},[1050,4880,1102],{"class":1071},[1050,4882,1106],{"class":1105},[1050,4884,4885],{"class":1052,"line":1497},[1050,4886,1683],{"class":1112},[1050,4888,4889],{"class":1052,"line":1502},[1050,4890,4891],{"class":1112},"            p.title,\n",[1050,4893,4894],{"class":1052,"line":1508},[1050,4895,4896],{"class":1112},"            array_agg(DISTINCT t.name ORDER BY t.name) as tag_names,\n",[1050,4898,4899],{"class":1052,"line":1514},[1050,4900,4901],{"class":1112},"            array_length(array_agg(DISTINCT t.name), 1) as tag_count\n",[1050,4903,4904],{"class":1052,"line":1520},[1050,4905,4906],{"class":1112},"        FROM blog_post p\n",[1050,4908,4909],{"class":1052,"line":1526},[1050,4910,4911],{"class":1112},"        LEFT JOIN blog_post_tags pt ON p.id = pt.post_id\n",[1050,4913,4914],{"class":1052,"line":1532},[1050,4915,4916],{"class":1112},"        LEFT JOIN blog_tag t ON pt.tag_id = t.id\n",[1050,4918,4919],{"class":1052,"line":1538},[1050,4920,4811],{"class":1112},[1050,4922,4923],{"class":1052,"line":1544},[1050,4924,4925],{"class":1112},"        GROUP BY p.id, p.title\n",[1050,4927,4928],{"class":1052,"line":1550},[1050,4929,4930],{"class":1112},"        HAVING array_length(array_agg(DISTINCT t.name), 1) > 2\n",[1050,4932,4933],{"class":1052,"line":1556},[1050,4934,4935],{"class":1112},"        ORDER BY tag_count DESC\n",[1050,4937,4938],{"class":1052,"line":1562},[1050,4939,4826],{"class":1105},[1050,4941,4942],{"class":1052,"line":1568},[1050,4943,2064],{"class":1092},[1050,4945,4946,4948,4950,4952,4954],{"class":1052,"line":1573},[1050,4947,1405],{"class":1218},[1050,4949,1613],{"class":1273},[1050,4951,1287],{"class":1071},[1050,4953,1346],{"class":1273},[1050,4955,1300],{"class":1071},[1050,4957,4958],{"class":1052,"line":1579},[1050,4959,1093],{"class":1092},[1050,4961,4962,4964],{"class":1052,"line":1585},[1050,4963,4688],{"class":1071},[1050,4965,4691],{"class":1410},[1050,4967,4968,4970,4973],{"class":1052,"line":1591},[1050,4969,2028],{"class":1063},[1050,4971,4972],{"class":1067}," recursive_category_tree",[1050,4974,1072],{"class":1071},[1050,4976,4977,4979,4982],{"class":1052,"line":1597},[1050,4978,2054],{"class":1078},[1050,4980,4981],{"class":1082},"Recursive CTE for category hierarchy",[1050,4983,1086],{"class":1078},[1050,4985,4986],{"class":1052,"line":1602},[1050,4987,2064],{"class":1092},[1050,4989,4990,4992,4994],{"class":1052,"line":1607},[1050,4991,4718],{"class":1092},[1050,4993,1102],{"class":1071},[1050,4995,1106],{"class":1105},[1050,4997,4998],{"class":1052,"line":1622},[1050,4999,5000],{"class":1112},"        WITH RECURSIVE category_tree AS (\n",[1050,5002,5003],{"class":1052,"line":1627},[1050,5004,5005],{"class":1112},"            -- Base case: root categories\n",[1050,5007,5008],{"class":1052,"line":1633},[1050,5009,2169],{"class":1112},[1050,5011,5012],{"class":1052,"line":1650},[1050,5013,5014],{"class":1112},"                id, \n",[1050,5016,5017],{"class":1052,"line":1660},[1050,5018,5019],{"class":1112},"                name, \n",[1050,5021,5022],{"class":1052,"line":1665},[1050,5023,5024],{"class":1112},"                parent_id, \n",[1050,5026,5027],{"class":1052,"line":1674},[1050,5028,5029],{"class":1112},"                0 as level,\n",[1050,5031,5032],{"class":1052,"line":1680},[1050,5033,5034],{"class":1112},"                ARRAY[name] as path,\n",[1050,5036,5037],{"class":1052,"line":1686},[1050,5038,5039],{"class":1112},"                name as root_category\n",[1050,5041,5042],{"class":1052,"line":1692},[1050,5043,5044],{"class":1112},"            FROM blog_category \n",[1050,5046,5047],{"class":1052,"line":1698},[1050,5048,5049],{"class":1112},"            WHERE parent_id IS NULL\n",[1050,5051,5052],{"class":1052,"line":1704},[1050,5053,5054],{"class":1112},"            \n",[1050,5056,5057],{"class":1052,"line":1710},[1050,5058,5059],{"class":1112},"            UNION ALL\n",[1050,5061,5062],{"class":1052,"line":1716},[1050,5063,5054],{"class":1112},[1050,5065,5066],{"class":1052,"line":1722},[1050,5067,5068],{"class":1112},"            -- Recursive case: child categories\n",[1050,5070,5071],{"class":1052,"line":1728},[1050,5072,2169],{"class":1112},[1050,5074,5075],{"class":1052,"line":1734},[1050,5076,5077],{"class":1112},"                c.id, \n",[1050,5079,5080],{"class":1052,"line":1740},[1050,5081,5082],{"class":1112},"                c.name, \n",[1050,5084,5085],{"class":1052,"line":1748},[1050,5086,5087],{"class":1112},"                c.parent_id,\n",[1050,5089,5090],{"class":1052,"line":1754},[1050,5091,5092],{"class":1112},"                ct.level + 1,\n",[1050,5094,5095],{"class":1052,"line":1760},[1050,5096,5097],{"class":1112},"                ct.path || c.name,\n",[1050,5099,5100],{"class":1052,"line":1765},[1050,5101,5102],{"class":1112},"                ct.root_category\n",[1050,5104,5105],{"class":1052,"line":1771},[1050,5106,5107],{"class":1112},"            FROM blog_category c\n",[1050,5109,5110],{"class":1052,"line":1777},[1050,5111,5112],{"class":1112},"            JOIN category_tree ct ON c.parent_id = ct.id\n",[1050,5114,5115],{"class":1052,"line":1783},[1050,5116,2960],{"class":1112},[1050,5118,5119],{"class":1052,"line":1788},[1050,5120,1683],{"class":1112},[1050,5122,5123],{"class":1052,"line":1794},[1050,5124,5125],{"class":1112},"            ct.*,\n",[1050,5127,5128],{"class":1052,"line":1800},[1050,5129,5130],{"class":1112},"            array_to_string(ct.path, ' > ') as full_path,\n",[1050,5132,5133],{"class":1052,"line":1806},[1050,5134,5135],{"class":1112},"            (SELECT COUNT(*) FROM blog_post WHERE category_id = ct.id) as post_count\n",[1050,5137,5138],{"class":1052,"line":1812},[1050,5139,5140],{"class":1112},"        FROM category_tree ct\n",[1050,5142,5143],{"class":1052,"line":1818},[1050,5144,5145],{"class":1112},"        ORDER BY ct.root_category, ct.level, ct.name\n",[1050,5147,5148],{"class":1052,"line":1824},[1050,5149,4826],{"class":1105},[1050,5151,5152],{"class":1052,"line":1830},[1050,5153,2064],{"class":1092},[1050,5155,5156,5158,5160,5162,5164],{"class":1052,"line":1836},[1050,5157,1405],{"class":1218},[1050,5159,1613],{"class":1273},[1050,5161,1287],{"class":1071},[1050,5163,1346],{"class":1273},[1050,5165,1300],{"class":1071},[1050,5167,5168],{"class":1052,"line":1841},[1050,5169,1454],{"emptyLinePlaceholder":1453},[1050,5171,5172],{"class":1052,"line":1846},[1050,5173,5174],{"class":1056},"# MySQL-specific features\n",[1050,5176,5177,5179,5182],{"class":1052,"line":1865},[1050,5178,2006],{"class":1063},[1050,5180,5181],{"class":2009}," MySQLQueries",[1050,5183,1330],{"class":1071},[1050,5185,5186],{"class":1052,"line":1886},[1050,5187,1093],{"class":1092},[1050,5189,5190,5192],{"class":1052,"line":1917},[1050,5191,4688],{"class":1071},[1050,5193,4691],{"class":1410},[1050,5195,5196,5198,5201],{"class":1052,"line":1935},[1050,5197,2028],{"class":1063},[1050,5199,5200],{"class":1067}," full_text_search_with_boolean_mode",[1050,5202,1072],{"class":1071},[1050,5204,5205,5207,5210],{"class":1052,"line":3965},[1050,5206,2054],{"class":1078},[1050,5208,5209],{"class":1082},"MySQL full-text search with boolean operators",[1050,5211,1086],{"class":1078},[1050,5213,5214],{"class":1052,"line":3992},[1050,5215,2064],{"class":1092},[1050,5217,5218,5220,5222],{"class":1052,"line":4012},[1050,5219,4718],{"class":1092},[1050,5221,1102],{"class":1071},[1050,5223,1106],{"class":1105},[1050,5225,5226],{"class":1052,"line":4017},[1050,5227,1683],{"class":1112},[1050,5229,5230],{"class":1052,"line":4023},[1050,5231,5232],{"class":1112},"            *,\n",[1050,5234,5235,5238,5240],{"class":1052,"line":4034},[1050,5236,5237],{"class":1112},"            MATCH(title, content) AGAINST(",[1050,5239,2094],{"class":1188},[1050,5241,5242],{"class":1112}," IN BOOLEAN MODE) as relevance_score\n",[1050,5244,5245],{"class":1052,"line":4049},[1050,5246,5247],{"class":1112},"        FROM blog_post\n",[1050,5249,5250,5253,5255],{"class":1052,"line":4088},[1050,5251,5252],{"class":1112},"        WHERE MATCH(title, content) AGAINST(",[1050,5254,2094],{"class":1188},[1050,5256,5257],{"class":1112}," IN BOOLEAN MODE)\n",[1050,5259,5260],{"class":1052,"line":4093},[1050,5261,5262],{"class":1112},"            AND status = 'published'\n",[1050,5264,5265],{"class":1052,"line":4101},[1050,5266,5267],{"class":1112},"        ORDER BY relevance_score DESC\n",[1050,5269,5270],{"class":1052,"line":4106},[1050,5271,5272],{"class":1112},"        LIMIT 20\n",[1050,5274,5275],{"class":1052,"line":4112},[1050,5276,4826],{"class":1105},[1050,5278,5279],{"class":1052,"line":4127},[1050,5280,2064],{"class":1092},[1050,5282,5283],{"class":1052,"line":4137},[1050,5284,5285],{"class":1056},"        # Boolean search: +django +tutorial -beginner\n",[1050,5287,5288,5291,5293,5296,5299],{"class":1052,"line":4142},[1050,5289,5290],{"class":1092},"        query ",[1050,5292,1102],{"class":1071},[1050,5294,5295],{"class":1105}," \"",[1050,5297,5298],{"class":1112},"+django +tutorial -beginner",[1050,5300,2906],{"class":1105},[1050,5302,5303,5305,5307,5309,5311,5313,5315,5317,5319,5321],{"class":1052,"line":4151},[1050,5304,1405],{"class":1218},[1050,5306,1613],{"class":1273},[1050,5308,1287],{"class":1071},[1050,5310,1346],{"class":1273},[1050,5312,1250],{"class":1071},[1050,5314,1351],{"class":1071},[1050,5316,2317],{"class":1273},[1050,5318,1250],{"class":1071},[1050,5320,2235],{"class":1273},[1050,5322,1357],{"class":1071},[1050,5324,5325],{"class":1052,"line":4157},[1050,5326,1093],{"class":1092},[1050,5328,5329,5331],{"class":1052,"line":4163},[1050,5330,4688],{"class":1071},[1050,5332,4691],{"class":1410},[1050,5334,5335,5337,5340],{"class":1052,"line":4174},[1050,5336,2028],{"class":1063},[1050,5338,5339],{"class":1067}," json_operations",[1050,5341,1072],{"class":1071},[1050,5343,5344,5346,5349],{"class":1052,"line":4180},[1050,5345,2054],{"class":1078},[1050,5347,5348],{"class":1082},"MySQL JSON operations (MySQL 5.7+)",[1050,5350,1086],{"class":1078},[1050,5352,5353],{"class":1052,"line":4185},[1050,5354,2064],{"class":1092},[1050,5356,5357,5359,5361],{"class":1052,"line":4190},[1050,5358,4718],{"class":1092},[1050,5360,1102],{"class":1071},[1050,5362,1106],{"class":1105},[1050,5364,5365],{"class":1052,"line":4196},[1050,5366,1683],{"class":1112},[1050,5368,5369],{"class":1052,"line":4260},[1050,5370,5371],{"class":1112},"            id,\n",[1050,5373,5374],{"class":1052,"line":4291},[1050,5375,5376],{"class":1112},"            title,\n",[1050,5378,5379],{"class":1052,"line":4296},[1050,5380,5381],{"class":1112},"            JSON_EXTRACT(metadata, '$.tags') as tags,\n",[1050,5383,5384],{"class":1052,"line":4315},[1050,5385,5386],{"class":1112},"            JSON_EXTRACT(metadata, '$.difficulty') as difficulty,\n",[1050,5388,5389],{"class":1052,"line":4331},[1050,5390,5391],{"class":1112},"            JSON_LENGTH(JSON_EXTRACT(metadata, '$.tags')) as tag_count\n",[1050,5393,5394],{"class":1052,"line":4342},[1050,5395,5247],{"class":1112},[1050,5397,5398],{"class":1052,"line":4347},[1050,5399,5400],{"class":1112},"        WHERE JSON_EXTRACT(metadata, '$.difficulty') = 'intermediate'\n",[1050,5402,5403],{"class":1052,"line":4362},[1050,5404,5405],{"class":1112},"            AND JSON_LENGTH(JSON_EXTRACT(metadata, '$.tags')) > 2\n",[1050,5407,5408],{"class":1052,"line":4372},[1050,5409,5410],{"class":1112},"        ORDER BY created_at DESC\n",[1050,5412,5413],{"class":1052,"line":4377},[1050,5414,4826],{"class":1105},[1050,5416,5417],{"class":1052,"line":4386},[1050,5418,2064],{"class":1092},[1050,5420,5421,5423,5425,5427,5429],{"class":1052,"line":4392},[1050,5422,1405],{"class":1218},[1050,5424,1613],{"class":1273},[1050,5426,1287],{"class":1071},[1050,5428,1346],{"class":1273},[1050,5430,1300],{"class":1071},[1050,5432,5433],{"class":1052,"line":4400},[1050,5434,1454],{"emptyLinePlaceholder":1453},[1050,5436,5437],{"class":1052,"line":4406},[1050,5438,5439],{"class":1056},"# SQLite-specific optimizations\n",[1050,5441,5442,5444,5447],{"class":1052,"line":4411},[1050,5443,2006],{"class":1063},[1050,5445,5446],{"class":2009}," SQLiteQueries",[1050,5448,1330],{"class":1071},[1050,5450,5451],{"class":1052,"line":4416},[1050,5452,1093],{"class":1092},[1050,5454,5455,5457],{"class":1052,"line":4436},[1050,5456,4688],{"class":1071},[1050,5458,4691],{"class":1410},[1050,5460,5461,5463,5466],{"class":1052,"line":4505},[1050,5462,2028],{"class":1063},[1050,5464,5465],{"class":1067}," fts_search",[1050,5467,1072],{"class":1071},[1050,5469,5470,5472,5475],{"class":1052,"line":4553},[1050,5471,2054],{"class":1078},[1050,5473,5474],{"class":1082},"SQLite FTS (Full-Text Search)",[1050,5476,1086],{"class":1078},[1050,5478,5479],{"class":1052,"line":4567},[1050,5480,2064],{"class":1092},[1050,5482,5483],{"class":1052,"line":4573},[1050,5484,5485],{"class":1056},"        # First, create FTS virtual table (in migration)\n",[1050,5487,5488],{"class":1052,"line":4578},[1050,5489,4826],{"class":1078},[1050,5491,5492],{"class":1052,"line":4605},[1050,5493,5494],{"class":1082},"        CREATE VIRTUAL TABLE post_fts USING fts5(\n",[1050,5496,5497],{"class":1052,"line":4610},[1050,5498,5499],{"class":1082},"            title, content, content='blog_post', content_rowid='id'\n",[1050,5501,5502],{"class":1052,"line":4629},[1050,5503,5504],{"class":1082},"        );\n",[1050,5506,5507],{"class":1052,"line":4644},[1050,5508,2064],{"class":1082},[1050,5510,5512],{"class":1052,"line":5511},147,[1050,5513,5514],{"class":1082},"        -- Populate FTS table\n",[1050,5516,5518],{"class":1052,"line":5517},148,[1050,5519,5520],{"class":1082},"        INSERT INTO post_fts(rowid, title, content)\n",[1050,5522,5524],{"class":1052,"line":5523},149,[1050,5525,5526],{"class":1082},"        SELECT id, title, content FROM blog_post WHERE status = 'published';\n",[1050,5528,5530],{"class":1052,"line":5529},150,[1050,5531,4826],{"class":1078},[1050,5533,5535],{"class":1052,"line":5534},151,[1050,5536,2064],{"class":1092},[1050,5538,5540,5542,5544],{"class":1052,"line":5539},152,[1050,5541,4718],{"class":1092},[1050,5543,1102],{"class":1071},[1050,5545,1106],{"class":1105},[1050,5547,5549],{"class":1052,"line":5548},153,[1050,5550,1683],{"class":1112},[1050,5552,5554],{"class":1052,"line":5553},154,[1050,5555,5556],{"class":1112},"            p.*,\n",[1050,5558,5560],{"class":1052,"line":5559},155,[1050,5561,5562],{"class":1112},"            bm25(post_fts) as rank\n",[1050,5564,5566],{"class":1052,"line":5565},156,[1050,5567,5568],{"class":1112},"        FROM post_fts\n",[1050,5570,5572],{"class":1052,"line":5571},157,[1050,5573,5574],{"class":1112},"        JOIN blog_post p ON post_fts.rowid = p.id\n",[1050,5576,5578,5581],{"class":1052,"line":5577},158,[1050,5579,5580],{"class":1112},"        WHERE post_fts MATCH ",[1050,5582,1189],{"class":1188},[1050,5584,5586],{"class":1052,"line":5585},159,[1050,5587,5588],{"class":1112},"            AND p.status = 'published'\n",[1050,5590,5592],{"class":1052,"line":5591},160,[1050,5593,5594],{"class":1112},"        ORDER BY rank\n",[1050,5596,5598],{"class":1052,"line":5597},161,[1050,5599,4826],{"class":1105},[1050,5601,5603],{"class":1052,"line":5602},162,[1050,5604,2064],{"class":1092},[1050,5606,5608,5610,5612,5614,5616,5618,5620,5622,5625,5627],{"class":1052,"line":5607},163,[1050,5609,1405],{"class":1218},[1050,5611,1613],{"class":1273},[1050,5613,1287],{"class":1071},[1050,5615,1346],{"class":1273},[1050,5617,1250],{"class":1071},[1050,5619,1351],{"class":1071},[1050,5621,2445],{"class":1105},[1050,5623,5624],{"class":1112},"django tutorial",[1050,5626,2445],{"class":1105},[1050,5628,1357],{"class":1071},[1030,5630,5632],{"id":5631},"security-and-best-practices","Security and Best Practices",[1035,5634,5636],{"id":5635},"sql-injection-prevention","SQL Injection Prevention",[1040,5638,5640],{"className":1042,"code":5639,"language":1044,"meta":1045,"style":1045},"# SECURE: Using parameterized queries\ndef secure_user_posts(user_id, status='published'):\n    \"\"\"Secure way to query user posts\"\"\"\n    \n    sql = \"\"\"\n    SELECT * FROM blog_post \n    WHERE author_id = %s AND status = %s\n    ORDER BY created_at DESC\n    \"\"\"\n    \n    return execute_raw_query(sql, [user_id, status])\n\n# INSECURE: String formatting (DON'T DO THIS)\ndef insecure_user_posts(user_id, status='published'):\n    \"\"\"INSECURE - vulnerable to SQL injection\"\"\"\n    \n    # DON'T DO THIS!\n    sql = f\"\"\"\n    SELECT * FROM blog_post \n    WHERE author_id = {user_id} AND status = '{status}'\n    ORDER BY created_at DESC\n    \"\"\"\n    \n    return execute_raw_query(sql)\n\n# Safe dynamic query building\ndef build_dynamic_search_query(filters):\n    \"\"\"Safely build dynamic queries\"\"\"\n    \n    base_sql = \"SELECT * FROM blog_post WHERE 1=1\"\n    params = []\n    \n    if filters.get('author_id'):\n        base_sql += \" AND author_id = %s\"\n        params.append(filters['author_id'])\n    \n    if filters.get('category_id'):\n        base_sql += \" AND category_id = %s\"\n        params.append(filters['category_id'])\n    \n    if filters.get('status'):\n        base_sql += \" AND status = %s\"\n        params.append(filters['status'])\n    \n    if filters.get('search_term'):\n        base_sql += \" AND (title ILIKE %s OR content ILIKE %s)\"\n        search_pattern = f\"%{filters['search_term']}%\"\n        params.extend([search_pattern, search_pattern])\n    \n    base_sql += \" ORDER BY created_at DESC\"\n    \n    return execute_raw_query(base_sql, params)\n\n# Input validation and sanitization\ndef validate_and_execute_query(table_name, columns, filters):\n    \"\"\"Validate inputs before executing raw SQL\"\"\"\n    \n    # Whitelist allowed tables and columns\n    ALLOWED_TABLES = ['blog_post', 'blog_category', 'auth_user']\n    ALLOWED_COLUMNS = {\n        'blog_post': ['id', 'title', 'content', 'author_id', 'status', 'created_at'],\n        'blog_category': ['id', 'name', 'slug'],\n        'auth_user': ['id', 'username', 'email', 'first_name', 'last_name']\n    }\n    \n    # Validate table name\n    if table_name not in ALLOWED_TABLES:\n        raise ValueError(f\"Table '{table_name}' not allowed\")\n    \n    # Validate columns\n    for column in columns:\n        if column not in ALLOWED_COLUMNS[table_name]:\n            raise ValueError(f\"Column '{column}' not allowed for table '{table_name}'\")\n    \n    # Build safe query\n    column_list = ', '.join(columns)\n    sql = f\"SELECT {column_list} FROM {table_name} WHERE 1=1\"\n    params = []\n    \n    # Add filters safely\n    for field, value in filters.items():\n        if field in ALLOWED_COLUMNS[table_name]:\n            sql += f\" AND {field} = %s\"\n            params.append(value)\n    \n    return execute_raw_query(sql, params)\n\n# Transaction management with raw SQL\ndef execute_raw_transaction(queries_and_params):\n    \"\"\"Execute multiple raw SQL queries in a transaction\"\"\"\n    \n    from django.db import transaction\n    \n    results = []\n    \n    with transaction.atomic():\n        with connection.cursor() as cursor:\n            for sql, params in queries_and_params:\n                cursor.execute(sql, params)\n                \n                if cursor.description:\n                    columns = [col[0] for col in cursor.description]\n                    results.append([dict(zip(columns, row)) for row in cursor.fetchall()])\n                else:\n                    results.append(cursor.rowcount)\n    \n    return results\n\n# Usage\ntransaction_queries = [\n    (\"UPDATE blog_post SET view_count = view_count + 1 WHERE id = %s\", [1]),\n    (\"INSERT INTO analytics_view (post_id, timestamp) VALUES (%s, %s)\", [1, timezone.now()]),\n    (\"SELECT view_count FROM blog_post WHERE id = %s\", [1])\n]\n\nresults = execute_raw_transaction(transaction_queries)\n",[1047,5641,5642,5647,5673,5682,5686,5694,5699,5711,5716,5720,5724,5746,5750,5755,5780,5789,5793,5798,5809,5813,5836,5840,5844,5848,5860,5864,5869,5883,5892,5896,5910,5919,5923,5947,5964,5988,5992,6013,6028,6050,6054,6074,6088,6110,6114,6135,6158,6189,6210,6214,6227,6231,6248,6252,6257,6280,6289,6293,6298,6334,6344,6408,6446,6502,6507,6511,6516,6534,6560,6564,6569,6582,6602,6637,6641,6646,6669,6699,6707,6711,6716,6739,6756,6778,6793,6797,6813,6817,6822,6836,6845,6849,6864,6868,6876,6880,6894,6913,6931,6950,6955,6968,6999,7041,7048,7067,7071,7078,7082,7086,7096,7120,7157,7178,7182,7186],{"__ignoreMap":1045},[1050,5643,5644],{"class":1052,"line":1053},[1050,5645,5646],{"class":1056},"# SECURE: Using parameterized queries\n",[1050,5648,5649,5651,5654,5656,5658,5660,5663,5665,5667,5669,5671],{"class":1052,"line":1060},[1050,5650,1064],{"class":1063},[1050,5652,5653],{"class":1067}," secure_user_posts",[1050,5655,1287],{"class":1071},[1050,5657,1644],{"class":1643},[1050,5659,1250],{"class":1071},[1050,5661,5662],{"class":1643}," status",[1050,5664,1102],{"class":1280},[1050,5666,2445],{"class":1105},[1050,5668,2924],{"class":1112},[1050,5670,2445],{"class":1105},[1050,5672,1647],{"class":1071},[1050,5674,5675,5677,5680],{"class":1052,"line":1075},[1050,5676,1079],{"class":1078},[1050,5678,5679],{"class":1082},"Secure way to query user posts",[1050,5681,1086],{"class":1078},[1050,5683,5684],{"class":1052,"line":1089},[1050,5685,1093],{"class":1092},[1050,5687,5688,5690,5692],{"class":1052,"line":1096},[1050,5689,1099],{"class":1092},[1050,5691,1102],{"class":1071},[1050,5693,1106],{"class":1105},[1050,5695,5696],{"class":1052,"line":1109},[1050,5697,5698],{"class":1112},"    SELECT * FROM blog_post \n",[1050,5700,5701,5704,5706,5709],{"class":1052,"line":1116},[1050,5702,5703],{"class":1112},"    WHERE author_id = ",[1050,5705,2094],{"class":1188},[1050,5707,5708],{"class":1112}," AND status = ",[1050,5710,1189],{"class":1188},[1050,5712,5713],{"class":1052,"line":1122},[1050,5714,5715],{"class":1112},"    ORDER BY created_at DESC\n",[1050,5717,5718],{"class":1052,"line":1128},[1050,5719,1207],{"class":1105},[1050,5721,5722],{"class":1052,"line":1134},[1050,5723,1093],{"class":1092},[1050,5725,5726,5728,5730,5732,5734,5736,5738,5740,5742,5744],{"class":1052,"line":1140},[1050,5727,1610],{"class":1218},[1050,5729,1613],{"class":1273},[1050,5731,1287],{"class":1071},[1050,5733,1346],{"class":1273},[1050,5735,1250],{"class":1071},[1050,5737,1351],{"class":1071},[1050,5739,1644],{"class":1273},[1050,5741,1250],{"class":1071},[1050,5743,5662],{"class":1273},[1050,5745,1357],{"class":1071},[1050,5747,5748],{"class":1052,"line":1146},[1050,5749,1454],{"emptyLinePlaceholder":1453},[1050,5751,5752],{"class":1052,"line":1152},[1050,5753,5754],{"class":1056},"# INSECURE: String formatting (DON'T DO THIS)\n",[1050,5756,5757,5759,5762,5764,5766,5768,5770,5772,5774,5776,5778],{"class":1052,"line":1158},[1050,5758,1064],{"class":1063},[1050,5760,5761],{"class":1067}," insecure_user_posts",[1050,5763,1287],{"class":1071},[1050,5765,1644],{"class":1643},[1050,5767,1250],{"class":1071},[1050,5769,5662],{"class":1643},[1050,5771,1102],{"class":1280},[1050,5773,2445],{"class":1105},[1050,5775,2924],{"class":1112},[1050,5777,2445],{"class":1105},[1050,5779,1647],{"class":1071},[1050,5781,5782,5784,5787],{"class":1052,"line":1164},[1050,5783,1079],{"class":1078},[1050,5785,5786],{"class":1082},"INSECURE - vulnerable to SQL injection",[1050,5788,1086],{"class":1078},[1050,5790,5791],{"class":1052,"line":1170},[1050,5792,1093],{"class":1092},[1050,5794,5795],{"class":1052,"line":1176},[1050,5796,5797],{"class":1056},"    # DON'T DO THIS!\n",[1050,5799,5800,5802,5804,5807],{"class":1052,"line":1182},[1050,5801,1099],{"class":1092},[1050,5803,1102],{"class":1071},[1050,5805,5806],{"class":1063}," f",[1050,5808,1086],{"class":1112},[1050,5810,5811],{"class":1052,"line":1192},[1050,5812,5698],{"class":1112},[1050,5814,5815,5817,5819,5821,5823,5826,5828,5831,5833],{"class":1052,"line":1198},[1050,5816,5703],{"class":1112},[1050,5818,2563],{"class":1188},[1050,5820,1644],{"class":1092},[1050,5822,2574],{"class":1188},[1050,5824,5825],{"class":1112}," AND status = '",[1050,5827,2563],{"class":1188},[1050,5829,5830],{"class":1092},"status",[1050,5832,2574],{"class":1188},[1050,5834,5835],{"class":1112},"'\n",[1050,5837,5838],{"class":1052,"line":1204},[1050,5839,5715],{"class":1112},[1050,5841,5842],{"class":1052,"line":1210},[1050,5843,1207],{"class":1112},[1050,5845,5846],{"class":1052,"line":1215},[1050,5847,1093],{"class":1092},[1050,5849,5850,5852,5854,5856,5858],{"class":1052,"line":1237},[1050,5851,1610],{"class":1218},[1050,5853,1613],{"class":1273},[1050,5855,1287],{"class":1071},[1050,5857,1346],{"class":1273},[1050,5859,1300],{"class":1071},[1050,5861,5862],{"class":1052,"line":1256},[1050,5863,1454],{"emptyLinePlaceholder":1453},[1050,5865,5866],{"class":1052,"line":1261},[1050,5867,5868],{"class":1056},"# Safe dynamic query building\n",[1050,5870,5871,5873,5876,5878,5881],{"class":1052,"line":1303},[1050,5872,1064],{"class":1063},[1050,5874,5875],{"class":1067}," build_dynamic_search_query",[1050,5877,1287],{"class":1071},[1050,5879,5880],{"class":1643},"filters",[1050,5882,1647],{"class":1071},[1050,5884,5885,5887,5890],{"class":1052,"line":1308},[1050,5886,1079],{"class":1078},[1050,5888,5889],{"class":1082},"Safely build dynamic queries",[1050,5891,1086],{"class":1078},[1050,5893,5894],{"class":1052,"line":1333},[1050,5895,1093],{"class":1092},[1050,5897,5898,5901,5903,5905,5908],{"class":1052,"line":1360},[1050,5899,5900],{"class":1092},"    base_sql ",[1050,5902,1102],{"class":1071},[1050,5904,5295],{"class":1105},[1050,5906,5907],{"class":1112},"SELECT * FROM blog_post WHERE 1=1",[1050,5909,2906],{"class":1105},[1050,5911,5912,5914,5916],{"class":1052,"line":1402},[1050,5913,3968],{"class":1092},[1050,5915,1102],{"class":1071},[1050,5917,5918],{"class":1071}," []\n",[1050,5920,5921],{"class":1052,"line":1450},[1050,5922,1093],{"class":1092},[1050,5924,5925,5928,5931,5933,5936,5938,5940,5943,5945],{"class":1052,"line":1457},[1050,5926,5927],{"class":1218},"    if",[1050,5929,5930],{"class":1092}," filters",[1050,5932,1225],{"class":1071},[1050,5934,5935],{"class":1273},"get",[1050,5937,1287],{"class":1071},[1050,5939,2445],{"class":1105},[1050,5941,5942],{"class":1112},"author_id",[1050,5944,2445],{"class":1105},[1050,5946,1647],{"class":1071},[1050,5948,5949,5952,5955,5957,5960,5962],{"class":1052,"line":1463},[1050,5950,5951],{"class":1092},"        base_sql ",[1050,5953,5954],{"class":1071},"+=",[1050,5956,5295],{"class":1105},[1050,5958,5959],{"class":1112}," AND author_id = ",[1050,5961,2094],{"class":1188},[1050,5963,2906],{"class":1105},[1050,5965,5966,5969,5971,5974,5976,5978,5980,5982,5984,5986],{"class":1052,"line":1473},[1050,5967,5968],{"class":1092},"        params",[1050,5970,1225],{"class":1071},[1050,5972,5973],{"class":1273},"append",[1050,5975,1287],{"class":1071},[1050,5977,5880],{"class":1273},[1050,5979,1373],{"class":1071},[1050,5981,2445],{"class":1105},[1050,5983,5942],{"class":1112},[1050,5985,2445],{"class":1105},[1050,5987,1357],{"class":1071},[1050,5989,5990],{"class":1052,"line":1483},[1050,5991,1093],{"class":1092},[1050,5993,5994,5996,5998,6000,6002,6004,6006,6009,6011],{"class":1052,"line":1488},[1050,5995,5927],{"class":1218},[1050,5997,5930],{"class":1092},[1050,5999,1225],{"class":1071},[1050,6001,5935],{"class":1273},[1050,6003,1287],{"class":1071},[1050,6005,2445],{"class":1105},[1050,6007,6008],{"class":1112},"category_id",[1050,6010,2445],{"class":1105},[1050,6012,1647],{"class":1071},[1050,6014,6015,6017,6019,6021,6024,6026],{"class":1052,"line":1497},[1050,6016,5951],{"class":1092},[1050,6018,5954],{"class":1071},[1050,6020,5295],{"class":1105},[1050,6022,6023],{"class":1112}," AND category_id = ",[1050,6025,2094],{"class":1188},[1050,6027,2906],{"class":1105},[1050,6029,6030,6032,6034,6036,6038,6040,6042,6044,6046,6048],{"class":1052,"line":1502},[1050,6031,5968],{"class":1092},[1050,6033,1225],{"class":1071},[1050,6035,5973],{"class":1273},[1050,6037,1287],{"class":1071},[1050,6039,5880],{"class":1273},[1050,6041,1373],{"class":1071},[1050,6043,2445],{"class":1105},[1050,6045,6008],{"class":1112},[1050,6047,2445],{"class":1105},[1050,6049,1357],{"class":1071},[1050,6051,6052],{"class":1052,"line":1508},[1050,6053,1093],{"class":1092},[1050,6055,6056,6058,6060,6062,6064,6066,6068,6070,6072],{"class":1052,"line":1514},[1050,6057,5927],{"class":1218},[1050,6059,5930],{"class":1092},[1050,6061,1225],{"class":1071},[1050,6063,5935],{"class":1273},[1050,6065,1287],{"class":1071},[1050,6067,2445],{"class":1105},[1050,6069,5830],{"class":1112},[1050,6071,2445],{"class":1105},[1050,6073,1647],{"class":1071},[1050,6075,6076,6078,6080,6082,6084,6086],{"class":1052,"line":1520},[1050,6077,5951],{"class":1092},[1050,6079,5954],{"class":1071},[1050,6081,5295],{"class":1105},[1050,6083,5708],{"class":1112},[1050,6085,2094],{"class":1188},[1050,6087,2906],{"class":1105},[1050,6089,6090,6092,6094,6096,6098,6100,6102,6104,6106,6108],{"class":1052,"line":1526},[1050,6091,5968],{"class":1092},[1050,6093,1225],{"class":1071},[1050,6095,5973],{"class":1273},[1050,6097,1287],{"class":1071},[1050,6099,5880],{"class":1273},[1050,6101,1373],{"class":1071},[1050,6103,2445],{"class":1105},[1050,6105,5830],{"class":1112},[1050,6107,2445],{"class":1105},[1050,6109,1357],{"class":1071},[1050,6111,6112],{"class":1052,"line":1532},[1050,6113,1093],{"class":1092},[1050,6115,6116,6118,6120,6122,6124,6126,6128,6131,6133],{"class":1052,"line":1538},[1050,6117,5927],{"class":1218},[1050,6119,5930],{"class":1092},[1050,6121,1225],{"class":1071},[1050,6123,5935],{"class":1273},[1050,6125,1287],{"class":1071},[1050,6127,2445],{"class":1105},[1050,6129,6130],{"class":1112},"search_term",[1050,6132,2445],{"class":1105},[1050,6134,1647],{"class":1071},[1050,6136,6137,6139,6141,6143,6146,6148,6151,6153,6156],{"class":1052,"line":1544},[1050,6138,5951],{"class":1092},[1050,6140,5954],{"class":1071},[1050,6142,5295],{"class":1105},[1050,6144,6145],{"class":1112}," AND (title ILIKE ",[1050,6147,2094],{"class":1188},[1050,6149,6150],{"class":1112}," OR content ILIKE ",[1050,6152,2094],{"class":1188},[1050,6154,6155],{"class":1112},")",[1050,6157,2906],{"class":1105},[1050,6159,6160,6163,6165,6167,6170,6172,6174,6176,6178,6180,6182,6184,6186],{"class":1052,"line":1550},[1050,6161,6162],{"class":1092},"        search_pattern ",[1050,6164,1102],{"class":1071},[1050,6166,5806],{"class":1063},[1050,6168,6169],{"class":1112},"\"%",[1050,6171,2563],{"class":1188},[1050,6173,5880],{"class":1092},[1050,6175,1373],{"class":1071},[1050,6177,2445],{"class":1105},[1050,6179,6130],{"class":1112},[1050,6181,2445],{"class":1105},[1050,6183,1379],{"class":1071},[1050,6185,2574],{"class":1188},[1050,6187,6188],{"class":1112},"%\"\n",[1050,6190,6191,6193,6195,6198,6200,6203,6205,6208],{"class":1052,"line":1556},[1050,6192,5968],{"class":1092},[1050,6194,1225],{"class":1071},[1050,6196,6197],{"class":1273},"extend",[1050,6199,4215],{"class":1071},[1050,6201,6202],{"class":1273},"search_pattern",[1050,6204,1250],{"class":1071},[1050,6206,6207],{"class":1273}," search_pattern",[1050,6209,1357],{"class":1071},[1050,6211,6212],{"class":1052,"line":1562},[1050,6213,1093],{"class":1092},[1050,6215,6216,6218,6220,6222,6225],{"class":1052,"line":1568},[1050,6217,5900],{"class":1092},[1050,6219,5954],{"class":1071},[1050,6221,5295],{"class":1105},[1050,6223,6224],{"class":1112}," ORDER BY created_at DESC",[1050,6226,2906],{"class":1105},[1050,6228,6229],{"class":1052,"line":1573},[1050,6230,1093],{"class":1092},[1050,6232,6233,6235,6237,6239,6242,6244,6246],{"class":1052,"line":1579},[1050,6234,1610],{"class":1218},[1050,6236,1613],{"class":1273},[1050,6238,1287],{"class":1071},[1050,6240,6241],{"class":1273},"base_sql",[1050,6243,1250],{"class":1071},[1050,6245,3264],{"class":1273},[1050,6247,1300],{"class":1071},[1050,6249,6250],{"class":1052,"line":1585},[1050,6251,1454],{"emptyLinePlaceholder":1453},[1050,6253,6254],{"class":1052,"line":1591},[1050,6255,6256],{"class":1056},"# Input validation and sanitization\n",[1050,6258,6259,6261,6264,6266,6269,6271,6274,6276,6278],{"class":1052,"line":1597},[1050,6260,1064],{"class":1063},[1050,6262,6263],{"class":1067}," validate_and_execute_query",[1050,6265,1287],{"class":1071},[1050,6267,6268],{"class":1643},"table_name",[1050,6270,1250],{"class":1071},[1050,6272,6273],{"class":1643}," columns",[1050,6275,1250],{"class":1071},[1050,6277,5930],{"class":1643},[1050,6279,1647],{"class":1071},[1050,6281,6282,6284,6287],{"class":1052,"line":1602},[1050,6283,1079],{"class":1078},[1050,6285,6286],{"class":1082},"Validate inputs before executing raw SQL",[1050,6288,1086],{"class":1078},[1050,6290,6291],{"class":1052,"line":1607},[1050,6292,1093],{"class":1092},[1050,6294,6295],{"class":1052,"line":1622},[1050,6296,6297],{"class":1056},"    # Whitelist allowed tables and columns\n",[1050,6299,6300,6303,6305,6307,6309,6312,6314,6316,6318,6321,6323,6325,6327,6330,6332],{"class":1052,"line":1627},[1050,6301,6302],{"class":2071},"    ALLOWED_TABLES",[1050,6304,4072],{"class":1071},[1050,6306,1351],{"class":1071},[1050,6308,2445],{"class":1105},[1050,6310,6311],{"class":1112},"blog_post",[1050,6313,2445],{"class":1105},[1050,6315,1250],{"class":1071},[1050,6317,2931],{"class":1105},[1050,6319,6320],{"class":1112},"blog_category",[1050,6322,2445],{"class":1105},[1050,6324,1250],{"class":1071},[1050,6326,2931],{"class":1105},[1050,6328,6329],{"class":1112},"auth_user",[1050,6331,2445],{"class":1105},[1050,6333,1399],{"class":1071},[1050,6335,6336,6339,6341],{"class":1052,"line":1633},[1050,6337,6338],{"class":2071},"    ALLOWED_COLUMNS",[1050,6340,4072],{"class":1071},[1050,6342,6343],{"class":1071}," {\n",[1050,6345,6346,6349,6351,6353,6355,6357,6359,6362,6364,6366,6368,6370,6372,6374,6376,6379,6381,6383,6385,6387,6389,6391,6393,6395,6397,6399,6401,6404,6406],{"class":1052,"line":1650},[1050,6347,6348],{"class":1105},"        '",[1050,6350,6311],{"class":1112},[1050,6352,2445],{"class":1105},[1050,6354,2760],{"class":1071},[1050,6356,1351],{"class":1071},[1050,6358,2445],{"class":1105},[1050,6360,6361],{"class":1112},"id",[1050,6363,2445],{"class":1105},[1050,6365,1250],{"class":1071},[1050,6367,2931],{"class":1105},[1050,6369,2571],{"class":1112},[1050,6371,2445],{"class":1105},[1050,6373,1250],{"class":1071},[1050,6375,2931],{"class":1105},[1050,6377,6378],{"class":1112},"content",[1050,6380,2445],{"class":1105},[1050,6382,1250],{"class":1071},[1050,6384,2931],{"class":1105},[1050,6386,5942],{"class":1112},[1050,6388,2445],{"class":1105},[1050,6390,1250],{"class":1071},[1050,6392,2931],{"class":1105},[1050,6394,5830],{"class":1112},[1050,6396,2445],{"class":1105},[1050,6398,1250],{"class":1071},[1050,6400,2931],{"class":1105},[1050,6402,6403],{"class":1112},"created_at",[1050,6405,2445],{"class":1105},[1050,6407,2939],{"class":1071},[1050,6409,6410,6412,6414,6416,6418,6420,6422,6424,6426,6428,6430,6433,6435,6437,6439,6442,6444],{"class":1052,"line":1660},[1050,6411,6348],{"class":1105},[1050,6413,6320],{"class":1112},[1050,6415,2445],{"class":1105},[1050,6417,2760],{"class":1071},[1050,6419,1351],{"class":1071},[1050,6421,2445],{"class":1105},[1050,6423,6361],{"class":1112},[1050,6425,2445],{"class":1105},[1050,6427,1250],{"class":1071},[1050,6429,2931],{"class":1105},[1050,6431,6432],{"class":1112},"name",[1050,6434,2445],{"class":1105},[1050,6436,1250],{"class":1071},[1050,6438,2931],{"class":1105},[1050,6440,6441],{"class":1112},"slug",[1050,6443,2445],{"class":1105},[1050,6445,2939],{"class":1071},[1050,6447,6448,6450,6452,6454,6456,6458,6460,6462,6464,6466,6468,6471,6473,6475,6477,6480,6482,6484,6486,6489,6491,6493,6495,6498,6500],{"class":1052,"line":1665},[1050,6449,6348],{"class":1105},[1050,6451,6329],{"class":1112},[1050,6453,2445],{"class":1105},[1050,6455,2760],{"class":1071},[1050,6457,1351],{"class":1071},[1050,6459,2445],{"class":1105},[1050,6461,6361],{"class":1112},[1050,6463,2445],{"class":1105},[1050,6465,1250],{"class":1071},[1050,6467,2931],{"class":1105},[1050,6469,6470],{"class":1112},"username",[1050,6472,2445],{"class":1105},[1050,6474,1250],{"class":1071},[1050,6476,2931],{"class":1105},[1050,6478,6479],{"class":1112},"email",[1050,6481,2445],{"class":1105},[1050,6483,1250],{"class":1071},[1050,6485,2931],{"class":1105},[1050,6487,6488],{"class":1112},"first_name",[1050,6490,2445],{"class":1105},[1050,6492,1250],{"class":1071},[1050,6494,2931],{"class":1105},[1050,6496,6497],{"class":1112},"last_name",[1050,6499,2445],{"class":1105},[1050,6501,1399],{"class":1071},[1050,6503,6504],{"class":1052,"line":1674},[1050,6505,6506],{"class":1071},"    }\n",[1050,6508,6509],{"class":1052,"line":1680},[1050,6510,1093],{"class":1092},[1050,6512,6513],{"class":1052,"line":1686},[1050,6514,6515],{"class":1056},"    # Validate table name\n",[1050,6517,6518,6520,6523,6526,6529,6532],{"class":1052,"line":1692},[1050,6519,5927],{"class":1218},[1050,6521,6522],{"class":1092}," table_name ",[1050,6524,6525],{"class":1280},"not",[1050,6527,6528],{"class":1280}," in",[1050,6530,6531],{"class":2071}," ALLOWED_TABLES",[1050,6533,1330],{"class":1071},[1050,6535,6536,6539,6542,6544,6546,6549,6551,6553,6555,6558],{"class":1052,"line":1698},[1050,6537,6538],{"class":1218},"        raise",[1050,6540,6541],{"class":1410}," ValueError",[1050,6543,1287],{"class":1071},[1050,6545,2557],{"class":1063},[1050,6547,6548],{"class":1112},"\"Table '",[1050,6550,2563],{"class":1188},[1050,6552,6268],{"class":1273},[1050,6554,2574],{"class":1188},[1050,6556,6557],{"class":1112},"' not allowed\"",[1050,6559,1300],{"class":1071},[1050,6561,6562],{"class":1052,"line":1704},[1050,6563,1093],{"class":1092},[1050,6565,6566],{"class":1052,"line":1710},[1050,6567,6568],{"class":1056},"    # Validate columns\n",[1050,6570,6571,6573,6576,6578,6580],{"class":1052,"line":1716},[1050,6572,4037],{"class":1218},[1050,6574,6575],{"class":1092}," column ",[1050,6577,1388],{"class":1218},[1050,6579,6273],{"class":1092},[1050,6581,1330],{"class":1071},[1050,6583,6584,6586,6588,6590,6592,6595,6597,6599],{"class":1052,"line":1722},[1050,6585,3369],{"class":1218},[1050,6587,6575],{"class":1092},[1050,6589,6525],{"class":1280},[1050,6591,6528],{"class":1280},[1050,6593,6594],{"class":2071}," ALLOWED_COLUMNS",[1050,6596,1373],{"class":1071},[1050,6598,6268],{"class":1092},[1050,6600,6601],{"class":1071},"]:\n",[1050,6603,6604,6607,6609,6611,6613,6616,6618,6621,6623,6626,6628,6630,6632,6635],{"class":1052,"line":1728},[1050,6605,6606],{"class":1218},"            raise",[1050,6608,6541],{"class":1410},[1050,6610,1287],{"class":1071},[1050,6612,2557],{"class":1063},[1050,6614,6615],{"class":1112},"\"Column '",[1050,6617,2563],{"class":1188},[1050,6619,6620],{"class":1273},"column",[1050,6622,2574],{"class":1188},[1050,6624,6625],{"class":1112},"' not allowed for table '",[1050,6627,2563],{"class":1188},[1050,6629,6268],{"class":1273},[1050,6631,2574],{"class":1188},[1050,6633,6634],{"class":1112},"'\"",[1050,6636,1300],{"class":1071},[1050,6638,6639],{"class":1052,"line":1734},[1050,6640,1093],{"class":1092},[1050,6642,6643],{"class":1052,"line":1740},[1050,6644,6645],{"class":1056},"    # Build safe query\n",[1050,6647,6648,6651,6653,6655,6657,6659,6661,6663,6665,6667],{"class":1052,"line":1748},[1050,6649,6650],{"class":1092},"    column_list ",[1050,6652,1102],{"class":1071},[1050,6654,2931],{"class":1105},[1050,6656,4230],{"class":1112},[1050,6658,2445],{"class":1105},[1050,6660,1225],{"class":1071},[1050,6662,4212],{"class":1273},[1050,6664,1287],{"class":1071},[1050,6666,1422],{"class":1273},[1050,6668,1300],{"class":1071},[1050,6670,6671,6673,6675,6677,6680,6682,6685,6687,6690,6692,6694,6696],{"class":1052,"line":1754},[1050,6672,1099],{"class":1092},[1050,6674,1102],{"class":1071},[1050,6676,5806],{"class":1063},[1050,6678,6679],{"class":1112},"\"SELECT ",[1050,6681,2563],{"class":1188},[1050,6683,6684],{"class":1092},"column_list",[1050,6686,2574],{"class":1188},[1050,6688,6689],{"class":1112}," FROM ",[1050,6691,2563],{"class":1188},[1050,6693,6268],{"class":1092},[1050,6695,2574],{"class":1188},[1050,6697,6698],{"class":1112}," WHERE 1=1\"\n",[1050,6700,6701,6703,6705],{"class":1052,"line":1760},[1050,6702,3968],{"class":1092},[1050,6704,1102],{"class":1071},[1050,6706,5918],{"class":1071},[1050,6708,6709],{"class":1052,"line":1765},[1050,6710,1093],{"class":1092},[1050,6712,6713],{"class":1052,"line":1771},[1050,6714,6715],{"class":1056},"    # Add filters safely\n",[1050,6717,6718,6720,6723,6725,6728,6730,6732,6734,6737],{"class":1052,"line":1777},[1050,6719,4037],{"class":1218},[1050,6721,6722],{"class":1092}," field",[1050,6724,1250],{"class":1071},[1050,6726,6727],{"class":1092}," value ",[1050,6729,1388],{"class":1218},[1050,6731,5930],{"class":1092},[1050,6733,1225],{"class":1071},[1050,6735,6736],{"class":1273},"items",[1050,6738,1072],{"class":1071},[1050,6740,6741,6743,6746,6748,6750,6752,6754],{"class":1052,"line":1783},[1050,6742,3369],{"class":1218},[1050,6744,6745],{"class":1092}," field ",[1050,6747,1388],{"class":1280},[1050,6749,6594],{"class":2071},[1050,6751,1373],{"class":1071},[1050,6753,6268],{"class":1092},[1050,6755,6601],{"class":1071},[1050,6757,6758,6761,6763,6765,6768,6770,6773,6775],{"class":1052,"line":1788},[1050,6759,6760],{"class":1092},"            sql ",[1050,6762,5954],{"class":1071},[1050,6764,5806],{"class":1063},[1050,6766,6767],{"class":1112},"\" AND ",[1050,6769,2563],{"class":1188},[1050,6771,6772],{"class":1092},"field",[1050,6774,2574],{"class":1188},[1050,6776,6777],{"class":1112}," = %s\"\n",[1050,6779,6780,6782,6784,6786,6788,6791],{"class":1052,"line":1794},[1050,6781,2916],{"class":1092},[1050,6783,1225],{"class":1071},[1050,6785,5973],{"class":1273},[1050,6787,1287],{"class":1071},[1050,6789,6790],{"class":1273},"value",[1050,6792,1300],{"class":1071},[1050,6794,6795],{"class":1052,"line":1800},[1050,6796,1093],{"class":1092},[1050,6798,6799,6801,6803,6805,6807,6809,6811],{"class":1052,"line":1806},[1050,6800,1610],{"class":1218},[1050,6802,1613],{"class":1273},[1050,6804,1287],{"class":1071},[1050,6806,1346],{"class":1273},[1050,6808,1250],{"class":1071},[1050,6810,3264],{"class":1273},[1050,6812,1300],{"class":1071},[1050,6814,6815],{"class":1052,"line":1812},[1050,6816,1454],{"emptyLinePlaceholder":1453},[1050,6818,6819],{"class":1052,"line":1818},[1050,6820,6821],{"class":1056},"# Transaction management with raw SQL\n",[1050,6823,6824,6826,6829,6831,6834],{"class":1052,"line":1824},[1050,6825,1064],{"class":1063},[1050,6827,6828],{"class":1067}," execute_raw_transaction",[1050,6830,1287],{"class":1071},[1050,6832,6833],{"class":1643},"queries_and_params",[1050,6835,1647],{"class":1071},[1050,6837,6838,6840,6843],{"class":1052,"line":1830},[1050,6839,1079],{"class":1078},[1050,6841,6842],{"class":1082},"Execute multiple raw SQL queries in a transaction",[1050,6844,1086],{"class":1078},[1050,6846,6847],{"class":1052,"line":1836},[1050,6848,1093],{"class":1092},[1050,6850,6851,6853,6855,6857,6859,6861],{"class":1052,"line":1841},[1050,6852,1219],{"class":1218},[1050,6854,1222],{"class":1092},[1050,6856,1225],{"class":1071},[1050,6858,1228],{"class":1092},[1050,6860,1231],{"class":1218},[1050,6862,6863],{"class":1092}," transaction\n",[1050,6865,6866],{"class":1052,"line":1846},[1050,6867,1093],{"class":1092},[1050,6869,6870,6872,6874],{"class":1052,"line":1865},[1050,6871,3995],{"class":1092},[1050,6873,1102],{"class":1071},[1050,6875,5918],{"class":1071},[1050,6877,6878],{"class":1052,"line":1886},[1050,6879,1093],{"class":1092},[1050,6881,6882,6884,6887,6889,6892],{"class":1052,"line":1917},[1050,6883,1311],{"class":1218},[1050,6885,6886],{"class":1092}," transaction",[1050,6888,1225],{"class":1071},[1050,6890,6891],{"class":1273},"atomic",[1050,6893,1072],{"class":1071},[1050,6895,6896,6899,6901,6903,6905,6907,6909,6911],{"class":1052,"line":1935},[1050,6897,6898],{"class":1218},"        with",[1050,6900,1314],{"class":1092},[1050,6902,1225],{"class":1071},[1050,6904,1319],{"class":1273},[1050,6906,1277],{"class":1071},[1050,6908,1324],{"class":1218},[1050,6910,1327],{"class":1092},[1050,6912,1330],{"class":1071},[1050,6914,6915,6918,6920,6922,6924,6926,6929],{"class":1052,"line":3965},[1050,6916,6917],{"class":1218},"            for",[1050,6919,4268],{"class":1092},[1050,6921,1250],{"class":1071},[1050,6923,3354],{"class":1092},[1050,6925,1388],{"class":1218},[1050,6927,6928],{"class":1092}," queries_and_params",[1050,6930,1330],{"class":1071},[1050,6932,6933,6936,6938,6940,6942,6944,6946,6948],{"class":1052,"line":3992},[1050,6934,6935],{"class":1092},"                cursor",[1050,6937,1225],{"class":1071},[1050,6939,1341],{"class":1273},[1050,6941,1287],{"class":1071},[1050,6943,1346],{"class":1273},[1050,6945,1250],{"class":1071},[1050,6947,3264],{"class":1273},[1050,6949,1300],{"class":1071},[1050,6951,6952],{"class":1052,"line":4012},[1050,6953,6954],{"class":1092},"                \n",[1050,6956,6957,6960,6962,6964,6966],{"class":1052,"line":4017},[1050,6958,6959],{"class":1218},"                if",[1050,6961,1327],{"class":1092},[1050,6963,1225],{"class":1071},[1050,6965,1396],{"class":1395},[1050,6967,1330],{"class":1071},[1050,6969,6970,6973,6975,6977,6979,6981,6983,6985,6987,6989,6991,6993,6995,6997],{"class":1052,"line":4023},[1050,6971,6972],{"class":1092},"                    columns ",[1050,6974,1102],{"class":1071},[1050,6976,1351],{"class":1071},[1050,6978,1370],{"class":1092},[1050,6980,1373],{"class":1071},[1050,6982,1376],{"class":1296},[1050,6984,1379],{"class":1071},[1050,6986,1382],{"class":1218},[1050,6988,1385],{"class":1092},[1050,6990,1388],{"class":1218},[1050,6992,1327],{"class":1092},[1050,6994,1225],{"class":1071},[1050,6996,1396],{"class":1395},[1050,6998,1399],{"class":1071},[1050,7000,7001,7004,7006,7008,7010,7012,7014,7016,7018,7020,7022,7024,7026,7028,7030,7032,7034,7036,7038],{"class":1052,"line":4034},[1050,7002,7003],{"class":1092},"                    results",[1050,7005,1225],{"class":1071},[1050,7007,5973],{"class":1273},[1050,7009,4215],{"class":1071},[1050,7011,1411],{"class":1410},[1050,7013,1287],{"class":1071},[1050,7015,1417],{"class":1416},[1050,7017,1287],{"class":1071},[1050,7019,1422],{"class":1273},[1050,7021,1250],{"class":1071},[1050,7023,1427],{"class":1273},[1050,7025,1430],{"class":1071},[1050,7027,1382],{"class":1218},[1050,7029,1435],{"class":1273},[1050,7031,1388],{"class":1218},[1050,7033,1327],{"class":1273},[1050,7035,1225],{"class":1071},[1050,7037,1444],{"class":1273},[1050,7039,7040],{"class":1071},"()])\n",[1050,7042,7043,7046],{"class":1052,"line":4049},[1050,7044,7045],{"class":1218},"                else",[1050,7047,1330],{"class":1071},[1050,7049,7050,7052,7054,7056,7058,7060,7062,7065],{"class":1052,"line":4088},[1050,7051,7003],{"class":1092},[1050,7053,1225],{"class":1071},[1050,7055,5973],{"class":1273},[1050,7057,1287],{"class":1071},[1050,7059,1319],{"class":1273},[1050,7061,1225],{"class":1071},[1050,7063,7064],{"class":1395},"rowcount",[1050,7066,1300],{"class":1071},[1050,7068,7069],{"class":1052,"line":4093},[1050,7070,1093],{"class":1092},[1050,7072,7073,7075],{"class":1052,"line":4101},[1050,7074,1610],{"class":1218},[1050,7076,7077],{"class":1092}," results\n",[1050,7079,7080],{"class":1052,"line":4106},[1050,7081,1454],{"emptyLinePlaceholder":1453},[1050,7083,7084],{"class":1052,"line":4112},[1050,7085,2502],{"class":1056},[1050,7087,7088,7091,7093],{"class":1052,"line":4127},[1050,7089,7090],{"class":1092},"transaction_queries ",[1050,7092,1102],{"class":1071},[1050,7094,7095],{"class":1071}," [\n",[1050,7097,7098,7101,7103,7106,7108,7110,7112,7114,7117],{"class":1052,"line":4137},[1050,7099,7100],{"class":1071},"    (",[1050,7102,2560],{"class":1105},[1050,7104,7105],{"class":1112},"UPDATE blog_post SET view_count = view_count + 1 WHERE id = ",[1050,7107,2094],{"class":1188},[1050,7109,2560],{"class":1105},[1050,7111,1250],{"class":1071},[1050,7113,1351],{"class":1071},[1050,7115,7116],{"class":1296},"1",[1050,7118,7119],{"class":1071},"]),\n",[1050,7121,7122,7124,7126,7129,7131,7133,7135,7137,7139,7141,7143,7145,7147,7150,7152,7154],{"class":1052,"line":4142},[1050,7123,7100],{"class":1071},[1050,7125,2560],{"class":1105},[1050,7127,7128],{"class":1112},"INSERT INTO analytics_view (post_id, timestamp) VALUES (",[1050,7130,2094],{"class":1188},[1050,7132,4230],{"class":1112},[1050,7134,2094],{"class":1188},[1050,7136,6155],{"class":1112},[1050,7138,2560],{"class":1105},[1050,7140,1250],{"class":1071},[1050,7142,1351],{"class":1071},[1050,7144,7116],{"class":1296},[1050,7146,1250],{"class":1071},[1050,7148,7149],{"class":1092}," timezone",[1050,7151,1225],{"class":1071},[1050,7153,1274],{"class":1273},[1050,7155,7156],{"class":1071},"()]),\n",[1050,7158,7159,7161,7163,7166,7168,7170,7172,7174,7176],{"class":1052,"line":4151},[1050,7160,7100],{"class":1071},[1050,7162,2560],{"class":1105},[1050,7164,7165],{"class":1112},"SELECT view_count FROM blog_post WHERE id = ",[1050,7167,2094],{"class":1188},[1050,7169,2560],{"class":1105},[1050,7171,1250],{"class":1071},[1050,7173,1351],{"class":1071},[1050,7175,7116],{"class":1296},[1050,7177,1357],{"class":1071},[1050,7179,7180],{"class":1052,"line":4157},[1050,7181,1399],{"class":1071},[1050,7183,7184],{"class":1052,"line":4163},[1050,7185,1454],{"emptyLinePlaceholder":1453},[1050,7187,7188,7191,7193,7195,7197,7200],{"class":1052,"line":4174},[1050,7189,7190],{"class":1092},"results ",[1050,7192,1102],{"class":1071},[1050,7194,6828],{"class":1273},[1050,7196,1287],{"class":1071},[1050,7198,7199],{"class":1273},"transaction_queries",[1050,7201,1300],{"class":1071},[1026,7203,7204],{},"Raw SQL queries provide the ultimate flexibility for complex database operations, but they should be used judiciously with proper security measures and clear documentation of why the ORM wasn't sufficient for the specific use case.",[7206,7207,7208],"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 .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}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 .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--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 .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}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 .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}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 .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}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 .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}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 .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}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}",{"title":1045,"searchDepth":1053,"depth":1060,"links":7210},[7211,7214,7218,7221,7224],{"id":1032,"depth":1060,"text":1033,"children":7212},[7213],{"id":1037,"depth":1075,"text":1038},{"id":1971,"depth":1060,"text":1972,"children":7215},[7216,7217],{"id":1975,"depth":1075,"text":1976},{"id":2676,"depth":1075,"text":2677},{"id":3216,"depth":1060,"text":3217,"children":7219},[7220],{"id":3220,"depth":1075,"text":3221},{"id":4655,"depth":1060,"text":4656,"children":7222},[7223],{"id":4659,"depth":1075,"text":4660},{"id":5631,"depth":1060,"text":5632,"children":7225},[7226],{"id":5635,"depth":1075,"text":5636},"md",null,{},{"title":296,"description":1028},"li8QgbHCHnRxfZBH4dKsr-6SlHI29IAOXf-WtyRxQmM",[7233,7235],{"title":292,"path":293,"stem":294,"description":7234,"children":-1},"Django provides multiple approaches for implementing search functionality, from simple text-based searches to full-text search capabilities. Understanding these options enables you to choose the right search solution for your application's needs.",{"title":300,"path":301,"stem":302,"description":7236,"children":-1},"Database transactions ensure data consistency and integrity by grouping multiple database operations into atomic units. Django provides comprehensive transaction management tools that help you maintain data consistency even in complex scenarios.",1772474919790]