21 октября 2020

πŸπŸ—„οΈ Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python, SQLite ΠΈ SQLAlchemy

ΠŸΠΈΡˆΡƒ, ΠΏΠ΅Ρ€Π΅Π²ΠΎΠΆΡƒ ΠΈ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽ IT-ΡΡ‚Π°Ρ‚ΡŒΠΈ. На proglib написал 140 ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ². УвлСкаюсь Python, Π²Π΅Π±ΠΎΠΌ ΠΈ Data Science. ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΊ Π΄ΠΈΠ°Π»ΠΎΠ³Ρƒ – ссылки Π½Π° соцсСти ΠΈ мСссСндТСры: https://matyushkin.github.io/links/ Если понравился ΡΡ‚ΠΈΠ»ΡŒ излоТСния, упорядочСнный список ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΉ β€” https://github.com/matyushkin/lessons
На ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ управлСния Π΄Π°Π½Π½Ρ‹ΠΌΠΈ: csv-Ρ„Π°ΠΉΠ»Ρ‹, SQL-запросы ΠΊ простой Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° SQLite ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Python с SQLAlchemy. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Π΅Π±-прилоТСния Π½Π° Flask с использованиСм SQLAlchemy.
πŸπŸ—„οΈ Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python, SQLite ΠΈ SQLAlchemy

Π­Ρ‚Π° публикация – Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΉ с нСбольшими сокращСниями ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π”ΡƒΠ³Π° Π€Π°Ρ€Ρ€Π΅Π»Π»Π° Data Management With Python, SQLite, and SQLAlchemy. ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ пособия доступСн Π² GitHub-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ. ВсС ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΎΡ‚ΡΡ‹Π»Π°ΡŽΡ‚ ΠΊ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ.

***

ВсС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Ρ‚ΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Многим ΠΈΠ· Π½ΠΈΡ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ эти Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ впослСдствии ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ. Π’ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ Π±Π΅Π· нСобходимости использования сСрвСра Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…. Π‘ Ρ‚Π°ΠΊΠΈΠΌΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ срСдствами Python, SQLite ΠΈ SQLAlchemy.

Аналогичных Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ CSV, JSON, XML ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ кастомныС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠΌ Ρ‚Π°ΠΊΠΈΡ… тСкстовых Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰ являСтся Π»Π΅Π³ΠΊΠΈΠΉ для восприятия Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ… – ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ структура понятна с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ взгляда. НиТС ΠΌΡ‹ сравним Ρ‚Π°ΠΊΠΎΠΉ способ хранСния ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ рСляционных Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ языка SQL, Π° Ρ‚Π°ΠΊΠΆΠ΅ разбСрСмся, ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ ΠΎΠ±Ρ‰ΠΈΡ… Ρ‡Π΅Ρ€Ρ‚Π°Ρ… ΠΌΡ‹ рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ вопросы:

  • ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ плоскиС Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ SQLite для хранСния Π΄Π°Π½Π½Ρ‹Ρ…;
  • ΠΊΠ°ΠΊ SQL позволяСт ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ;
  • ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ SQLAlchemy для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Python.

Π’ практичСском ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ основной Π°ΠΊΡ†Π΅Π½Ρ‚ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ дСлаСтся Π½Π° SQLAlchemy.

🧾 ПлоскиС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

Под плоской Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… (плоской Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ) Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ», содСрТащий Π΄Π°Π½Π½Ρ‹Π΅ Π±Π΅Π· Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ ΠΈ ссылок Π½Π° внСшниС Ρ„Π°ΠΉΠ»Ρ‹. Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ ряд особСнностСй: Π² Ρ‚Π°ΠΊΠΈΡ… Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅Ρ‚ нСобходимости ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΡˆΠΈΡ€ΠΈΠ½Ρƒ ΠΏΠΎΠ»Π΅ΠΉ, Π° csv-Ρ„Π°ΠΉΠ»Ρ‹ (Π°Π½Π³Π». comma separated values) ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой строки простого тСкста, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… элСмСнты Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ запятыми. КаТдая строка тСкста прСдставляСт собой строку Π΄Π°Π½Π½Ρ‹Ρ…, Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² строкС, ΠΎΡ‚Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΎΡ‚ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… запятой соотвСтствуСт ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

/data/author_book_publisher.csv
        first_name,last_name,title,publisher
Isaac,Asimov,Foundation,Random House
Pearl,Buck,The Good Earth,Random House
Pearl,Buck,The Good Earth,Simon & Schuster
Tom,Clancy,The Hunt For Red October,Berkley
Tom,Clancy,Patriot Games,Simon & Schuster
Stephen,King,It,Random House
Stephen,King,It,Penguin Random House
Stephen,King,Dead Zone,Random House
Stephen,King,The Shining,Penguin Random House
John,Le Carre,"Tinker, Tailor, Solider, Spy: A George Smiley Novel",Berkley
Alex,Michaelides,The Silent Patient,Simon & Schuster
Carol,Shaben,Into The Abyss,Simon & Schuster

    

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкС прСдставлСнного ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° находится список ΠΏΠΎΠ»Π΅ΠΉ – ΠΈΠΌΠ΅Π½Π° столбцов Π΄Π°Π½Π½Ρ‹Ρ…. КаТдая ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка соотвСтствуСт ΠΎΠ΄Π½ΠΎΠΉ записи.

βž• ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° плоских Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…

НСбольшиС плоскиС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π»Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ тСкстового Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°, Π½Π΅ составляСт трудностСй Π½Π°ΠΉΡ‚ΠΈ нСсоотвСтствиС ΠΈΠ»ΠΈ ΠΈΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. МногиС прилоТСния ΡƒΠΌΠ΅ΡŽΡ‚ ΠΈΡ… ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π’ Excel ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ csv-Ρ„Π°ΠΉΠ» Π² ΡΠ»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ.

Π•Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎ прСимущСство плоских Ρ„Π°ΠΉΠ»ΠΎΠ² – ΠΎΠ½ΠΈ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹, Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ. ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ Π² любом языкС программирования Π΅ΡΡ‚ΡŒ инструмСнты ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с csv-Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. Python ΠΈΠΌΠ΅Π΅Ρ‚ встроСнный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ csv ΠΈ ΠΌΠΎΡ‰Π½ΡƒΡŽ ΡΡ‚ΠΎΡ€ΠΎΠ½Π½ΡŽΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ pandas.

🐼 Pandas
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста Π»ΡŽΠ±ΠΈΡ‚ Data Science ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ pandas. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: 10 Ρ‚Ρ€ΡŽΠΊΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Python Pandas.

βž– НСдостатки плоских Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° плоских Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ€ΠΊΠ½ΡƒΡ‚ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ увСличСния объСма ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Π€Π°ΠΉΠ»Ρ‹ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌΠΈ, Π½ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ поиск ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… записСй Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ трудности. И Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° – Ρ„Π°ΠΉΠ» разрастаСтся, ΠΈ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… рСсурсов.

Другая Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΡΡ‚ΡŒ, связанная с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ плоских Ρ„Π°ΠΉΠ»ΠΎΠ² – Π½ΡƒΠΆΠ½ΠΎ явно ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ, приходится ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ тСкст, ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ поля.

Π•Ρ‰Ρ‘ ΠΎΠ΄Π½Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ – люди, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Ρ„Π°ΠΉΠ»ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π½Π°Ρ‚ΡŒ ΠΎ структурах ΠΈ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡΡ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² этих Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚Ρ€Π°Π·ΠΈΠ»ΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π½Π΅Ρ€Π΅Π΄ΠΊΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ структуру Π΄Π°Π½Π½Ρ‹Ρ…, Π½ΠΎ ΠΈ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΠ΅ инструмСнты программирования.

πŸ“‡ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с плоской Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим описанный Π²Ρ‹ΡˆΠ΅ Ρ„Π°ΠΉΠ» author_book_publisher.csv, содСрТащий список Π°Π²Ρ‚ΠΎΡ€ΠΎΠ², ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΠΈ ΠΊΠ½ΠΈΠ³ ΠΈ ΠΈΠ·Π΄Π°Ρ‚Π΅Π»Π΅ΠΉ. Для простоты Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ всС Π°Π²Ρ‚ΠΎΡ€Ρ‹, ΠΊΠ½ΠΈΠ³ΠΈ ΠΈ ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹, ΠΈ всС ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΠΈΡˆΡƒΡ‚ΡΡ Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π±Π΅Π· соавторов.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ…
Для рСалистичности Π°Π²Ρ‚ΠΎΡ€Ρ‹ Π‘Ρ‚ΠΈΠ²Π΅Π½ Кинг ΠΈ Π’ΠΎΠΌ Клэнси ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π° – Π² Π΄Π°Π½Π½Ρ‹Ρ… прСдставлСны нСсколько ΠΊΠ½ΠΈΠ³. Π£ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² Π‘Ρ‚ΠΈΠ²Π΅Π½Π° Кинга ΠΈ ΠŸΠ΅Ρ€Π» Π‘Π°ΠΊ Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° ΠΈ Ρ‚Π° ΠΆΠ΅ ΠΊΠ½ΠΈΠ³Π°, опубликованная Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ·Π΄Π°Ρ‚Π΅Π»Π΅ΠΌ.

Рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main() ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, находящСйся Π² упомянутом Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ адрСсу examples/example_1/main.py.

examples/example_1/main.py
        def main():
    """Основная Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ"""
    # ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ рСсурсы для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
    with resources.path(
        "project.data", "author_book_publisher.csv"
    ) as filepath:
        data = get_data(filepath)

    # Π£Π·Π½Π°Π΅ΠΌ количСство ΠΊΠ½ΠΈΠ³, Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΈΠ·Π΄Π°Ρ‚Π΅Π»Π΅ΠΌ
    books_by_publisher = get_books_by_publisher(data, ascending=False)
    for publisher, total_books in books_by_publisher.items():
        print(f"Publisher: {publisher}, total books: {total_books}")
    print()

    # Π£Π·Π½Π°Π΅ΠΌ число Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΈΠ·Π΄Π°Ρ‚Π΅Π»Π΅ΠΉ
    authors_by_publisher = get_authors_by_publisher(data, ascending=False)
    for publisher, total_authors in authors_by_publisher.items():
        print(f"Publisher: {publisher}, total authors: {total_authors}")
    print()

    # Π’Ρ‹Π²ΠΎΠ΄ иСрархичСских Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ± Π°Π²Ρ‚ΠΎΡ€Π°Ρ…
    output_author_hierarchy(data)

    # Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π½ΠΎΠ²ΡƒΡŽ ΠΊΠ½ΠΈΠ³Ρƒ Π² структуру Π΄Π°Π½Π½Ρ‹Ρ…
    data = add_new_book(
        data,
        author_name="Stephen King",
        book_title="The Stand",
        publisher_name="Random House",
    )

    # Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² иСрархичСском Π²ΠΈΠ΄Π΅
    output_author_hierarchy(data)
    

ΠŸΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ csv-Ρ„Π°ΠΉΠ»Π° выводится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

        $ python main.py
Publisher: Simon & Schuster, total books: 4
Publisher: Random House, total books: 4
Publisher: Penguin Random House, total books: 2
Publisher: Berkley, total books: 2

Publisher: Simon & Schuster, total authors: 4
Publisher: Random House, total authors: 3
Publisher: Berkley, total authors: 2
Publisher: Penguin Random House, total authors: 1

Authors
β”œβ”€β”€ Alex Michaelides
β”‚   └── The Silent Patient
β”‚       └── Simon & Schuster
β”œβ”€β”€ Carol Shaben
β”‚   └── Into The Abyss
β”‚       └── Simon & Schuster
β”œβ”€β”€ Isaac Asimov
β”‚   └── Foundation
β”‚       └── Random House
β”œβ”€β”€ John Le Carre
β”‚   └── Tinker, Tailor, Solider, Spy: A George Smiley Novel
β”‚       └── Berkley
β”œβ”€β”€ Pearl Buck
β”‚   └── The Good Earth
β”‚       β”œβ”€β”€ Random House
β”‚       └── Simon & Schuster
β”œβ”€β”€ Stephen King
β”‚   β”œβ”€β”€ Dead Zone
β”‚   β”‚   └── Random House
β”‚   β”œβ”€β”€ It
β”‚   β”‚   β”œβ”€β”€ Penguin Random House
β”‚   β”‚   └── Random House
β”‚   └── The Shining
β”‚       └── Penguin Random House
└── Tom Clancy
    β”œβ”€β”€ Patriot Games
    β”‚   └── Simon & Schuster
    └── The Hunt For Red October
        └── Berkley
    

Для выполнСния основной части Ρ€Π°Π±ΠΎΡ‚Ρ‹ main() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ Π² Ρ„Π°ΠΉΠ»Π΅. Π‘Π°ΠΌΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈ дСмонстрируСт возмоТности Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ pandas.

ΠœΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Π»Π΅Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… SQLite ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ SQLAlchemy для манипуляции этими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

πŸ¦‹ ИспользованиС SQLite для хранСния Π΄Π°Π½Π½Ρ‹Ρ…

Как ΠΌΡ‹ упомянули Π²Ρ‹ΡˆΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠΈ, Π² Ρ„Π°ΠΉΠ»Π΅ author_book_publisher.csv Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Ρ‹. НапримСр, Ρ€ΠΎΠΌΠ°Π½ ΠŸΠ΅Ρ€Π» Π‘Π°ΠΊ The Good Earth ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈ Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… издатСля.

        Pearl,Buck,The Good Earth,Random House
Pearl,Buck,The Good Earth,Simon & Schuster
    

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹, Ссли Ρ„Π°ΠΉΠ» содСрТал большС связанных Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, свСдСния ΠΎΠ± Π°Π²Ρ‚ΠΎΡ€Π΅, Π΄Π°Ρ‚Ρƒ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, ISBN ΠΊΠ½ΠΈΠ³ΠΈ, адрСс ΠΈ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ свСдСния Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ элСмСнта: Π°Π²Ρ‚ΠΎΡ€Π°, ΠΊΠ½ΠΈΠ³ΠΈ, ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°. Π’Π°ΠΊΠΎΠ΅ построСниС Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎ, Π½ΠΎ ΠΈ услоТняСт ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ 1) измСнСния ΠΏΠΎΠ»Π΅ΠΉ, связанных с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΈ 2) добавлСния Π½ΠΎΠ²Ρ‹Ρ… свойств.

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΎΠ±ΡƒΡΠ»Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ использованиС Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ скрытыми Π² Π½ΠΈΡ… структурами – рСляционных Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…. Π’Π°ΠΆΠ½ΠΎΠΉ Ρ‚Π΅ΠΌΠΎΠΉ Π² этом ΠΏΠ»Π°Π½Π΅ являСтся нормализация Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… – ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ структуры ΠΊ Π²ΠΈΠ΄Ρƒ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΌΡƒ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ. Когда структура Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π½ΠΎΠ²Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ нормализация сводит ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ измСнСния ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ структуры.

SQLite являСтся систСмой управлСния рСляционными Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, доступной Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Python. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π΅ΠΉ Π½Π΅ трСбуСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ сСрвСр, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Ρ„Π°ΠΉΠ»Π° являСтся кросс-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ доступСн Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… SQLite.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
О Ρ€Π°Π±ΠΎΡ‚Π΅ с этой Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста Ρ‚Π°ΠΊΠΆΠ΅ писала Π² руководствС ΠΏΠΎ SQLite.

πŸ—οΈ Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ структуру Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

РСляционныС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ структурированныС Π΄Π°Π½Π½Ρ‹Π΅ Π² Π²ΠΈΠ΄Π΅ связанных Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ‚Π°Π±Π»ΠΈΡ†. Π’ качСствС основного способа взаимодСйствия с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ язык запросов SQL.

SQL – это Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ язык, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для создания, управлСния ΠΈ поиска Π΄Π°Π½Π½Ρ‹Ρ…, содСрТащихся Π² Π±Π°Π·Π΅. Π”Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ язык описываСт, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ, Π° Π½Π΅ Ρ‚ΠΎ, ΠΊΠ°ΠΊ это Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. ΠœΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² SQL ΠΏΠΎΠ·ΠΆΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ созданию Ρ‚Π°Π±Π»ΠΈΡ† Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
Если Π²Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с SQL ΠΈ для вас больший интСрСс прСдставляСт Ρ€Π°Π±ΠΎΡ‚Π° с SQLAlchemy, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·Π΄Π΅Π»Ρ‹, Π΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΎΠ±Ρ‰Π΅Π΅ прСдставлСниС ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с SQL.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ прСимущСствами SQL, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ провСсти Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Ρ„Π°ΠΉΠ»Π° author_book_publisher.csv. Для этого ΠΌΡ‹ пСрСнСсСм Π°Π²Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΠ½ΠΈΠ³ΠΈ ΠΈ ΠΈΠ·Π΄Π°Ρ‚Π΅Π»Π΅ΠΉ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

Π”Π°Π½Π½Ρ‹Π΅ Π² этом Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ хранятся Π² Π²ΠΈΠ΄Π΅ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Ρ… структур. Π”Π°Π½Π½Ρ‹Π΅, содСрТащиСся Π² полях Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, относятся ΠΊ Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠ°ΠΌ: тСкст, Ρ†Π΅Π»Ρ‹Π΅ числа, числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой ΠΈ Ρ‚. Π΄. Π­Ρ‚ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Π΅Ρ‚ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ csv-Ρ„Π°ΠΉΠ»ΠΎΠ², Π³Π΄Π΅ всС поля исходно ΡΠ²Π»ΡΡŽΡ‚ΡΡ тСкстовыми ΠΈ для распознавания Ρ‚ΠΈΠΏΠ° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ.

КаТдая запись Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ (Π°Π½Π³Π». primary key), ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ для присвоСния записи ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°. ΠŸΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° ΠΊΠ»ΡŽΡ‡ Π² словарС Python. Π”Π²ΠΈΠΆΠΎΠΊ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ сам Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ цСлочислСнный ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡, увСличивая Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΎΠ²ΠΎΠΉ записи. Если Π΄Π°Π½Π½Ρ‹Π΅, хранящиСся Π² ΠΏΠΎΠ»Π΅, ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ срСди всСх Π΄Ρ€ΡƒΠ³ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… Π² этом ΠΏΠΎΠ»Π΅, это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡. НапримСр, Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅, содСрТащСй Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ ΠΊΠ½ΠΈΠ³Π°Ρ…, Π² качСствС ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎ своСй ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π΅ ISBN.

🏒 Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ† Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

НиТС прСдставлСн ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² SQL ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΠ½ΠΈΠ³ΠΈ ΠΈ ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°:

        CREATE TABLE author (
    author_id INTEGER NOT NULL PRIMARY KEY,
    first_name VARCHAR,
    last_name VARCHAR
);

CREATE TABLE book (
    book_id INTEGER NOT NULL PRIMARY KEY,
    author_id INTEGER REFERENCES author,
    title VARCHAR
);

CREATE TABLE publisher (
    publisher_id INTEGER NOT NULL PRIMARY KEY,
    name VARCHAR
);
    

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ здСсь Π½Π΅Ρ‚ Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π½ΠΈ структур для ΠΈΡ… хранСния. ΠžΠΏΠΈΡΡ‹Π²Π°Π΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: созданиС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ. ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… опрСдСляСт, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ прилоТСния Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Python, выполняя SQL-запросы нСпосрСдствСнно ΠΈΠ· ΠΊΠΎΠ΄Π° Python. ИспользованиС чистого SQL – Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΡ‹ΠΉ способ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΈ Π² руководствС Как ΠΏΠΎΠ΄Ρ€ΡƒΠΆΠΈΡ‚ΡŒ Python ΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… SQL. Однако Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ основной Π°ΠΊΡ†Π΅Π½Ρ‚ сдСлан Π½Π° SQLAlchemy, ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ свСдСния ΠΎΠ± SQL Π΄Π°Π½Ρ‹ лишь Π·Π°Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС ΠΎΠ± SQL-запросах для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ знакомится с этой ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π°Π»Π΅Π΅ ΠΌΡ‹ сдСлали SQL-запросы, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π·Π½Π°ΠΊ *, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈ вывСсти всС Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ²:

        SELECT * FROM author;
    

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ инструмСнт ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки sqlite3 для взаимодСйствия с Ρ„Π°ΠΉΠ»ΠΎΠΌ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… author_book_publisher.db:

        sqlite3 author_book_publisher.db
    

НиТС ΠΏΠΎΠΊΠ°Π·Π°Π½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SQL ΠΈ Π΅Π΅ Π²Ρ‹Π²ΠΎΠ΄, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ слСдуСт ΠΊΠΎΠΌΠ°Π½Π΄Π° .q для Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

        sqlite> SELECT * FROM author;
1|Isaac|Asimov
2|Pearl|Buck
3|Tom|Clancy
4|Stephen|King
5|John|Le Carre
6|Alex|Michaelides
7|Carol|Shaben

sqlite> .q
    

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ csv-Ρ„Π°ΠΉΠ»Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΡ€ присутствуСт Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·.

πŸ•ΉοΈ ΠœΠ°Π½ΠΈΠΏΡƒΠ»ΡΡ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SQL

SQL прСдоставляСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ…. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° SQL для вставки Π½ΠΎΠ²ΠΎΠ³ΠΎ Π°Π²Ρ‚ΠΎΡ€Π° Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ author:

        INSERT INTO author
    (first_name, last_name)
VALUES ('Paul', 'Mendez');
    

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ INSERT вставляСт строковыС значСния Paul ΠΈ Mendez Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ столбцы first_name ΠΈ last_name Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ author.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ столбСц author_id Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ этот столбСц являСтся ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… сам Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ добавляСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ОбновлСниС записСй Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… – Ρ‚Π°ΠΊΠΆΠ΅ нСслоТный процСсс. НапримСр, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π‘Ρ‚ΠΈΠ²Π΅Π½ Кинг Ρ…ΠΎΡ‚Π΅Π», Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ Π·Π½Π°Π»ΠΈ ΠΏΠΎΠ΄ псСвдонимом Π ΠΈΡ‡Π°Ρ€Π΄ Π‘Π°Ρ…ΠΌΠ°Π½:

        UPDATE author
SET first_name = 'Richard', last_name = 'Bachman'
WHERE first_name = 'Stephen' AND last_name = 'King';
    

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ SQL Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ запись с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ условного ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° WHERE, Π° Π·Π°Ρ‚Π΅ΠΌ обновляСт поля first_name ΠΈ last_name свСТими значСниями. Π—Π½Π°ΠΊ равСнства (=) Π² SQL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈ для сравнСния, ΠΈ для присваивания.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° SQL для удалСния записи ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ²:

        DELETE FROM author
WHERE first_name = 'Paul'
AND last_name = 'Mendez';
    
Π‘ΡƒΠ΄ΡŒΡ‚Π΅ остороТны ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ записСй!
Блишком ΡˆΠΈΡ€ΠΎΠΊΠΎΠ΅ условиС ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡŽ большСго количСства записСй, Ρ‡Π΅ΠΌ Π²Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΈ. НапримСр, Ссли Π±Ρ‹ условиС Π±Ρ‹Π»ΠΎ основано Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° строкС first_name = 'Paul', Ρ‚ΠΎ Π±Ρ‹Π»ΠΈ Π±Ρ‹ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ всС Π°Π²Ρ‚ΠΎΡ€Ρ‹ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Paul.

🀝 Π‘Ρ‚Ρ€ΠΎΠΈΠΌ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ: Β«ΠΎΠ΄ΠΈΠ½ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ»

Π”Π°Π½Π½Ρ‹Π΅ Π² Ρ„Π°ΠΉΠ»Π΅ author_book_publisher.csv ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ связи ΠΏΡƒΡ‚Π΅ΠΌ дублирования Π΄Π°Π½Π½Ρ‹Ρ…. Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… SQLite Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° Ρ‚Ρ€ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ (author, book, and publisher) ΠΈ устанавливаСт ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ.

Бвязь Β«ΠΎΠ΄ΠΈΠ½ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ» ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° связь покупатСля с Π·Π°ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌΠΈ Ρ‚ΠΎΠ²Π°Ρ€Π°ΠΌΠΈ Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅. Π£ ΠΎΠ΄Π½ΠΎΠ³ΠΎ покупатСля ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°ΠΊΠ°Π·ΠΎΠ², Π½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π·Π°ΠΊΠ°Π· ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»ΡŽ. Π’ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… author_book_publisher.db связь Β«ΠΎΠ΄ΠΈΠ½ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ» прСдставлСна ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ ΠΊΠ½ΠΈΠ³. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ½ΠΈΠ³, Π½ΠΎ каТдая худоТСствСнная ΠΊΠ½ΠΈΠ³Π° написана ΠΎΠ΄Π½ΠΈΠΌ Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ (Π² Ρ€Π°ΠΌΠΊΠ°Ρ… рассматриваСмого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°).

Как Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ связь Β«ΠΎΠ΄ΠΈΠ½ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ» ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ? КаТдая Ρ‚Π°Π±Π»ΠΈΡ†Π° Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΠ»Π΅ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π°Π·Π²Π°Π½Π½ΠΎΠ΅ ΠΏΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ <имя Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹>_id.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‚Π°Π±Π»ΠΈΡ†Π° book содСрТит ΠΏΠΎΠ»Π΅ author_id, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ссылаСтся Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ author (см. Π²Ρ‹ΡˆΠ΅ SQL-запрос для создания Ρ‚Π°Π±Π»ΠΈΡ†). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠΎΠ»Π΅ author_id устанавливаСт связь Β«ΠΎΠ΄ΠΈΠ½ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ» ΠΌΠ΅ΠΆΠ΄Ρƒ Π°Π²Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΠΈ ΠΊΠ½ΠΈΠ³Π°ΠΌΠΈ, которая выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Бвязь ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ <code class="inline-code">author</code> ΠΈ <code class="inline-code">book</code>
Бвязь ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ author ΠΈ book

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π²Ρ‹ΡˆΠ΅ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° прСдставляСт собой ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡƒ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ сущностСй (ERD), ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ прилоТСния JetBrains DataGrip. Π”Π²Π° графичСских элСмСнта Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ связях:

  1. Π—Π½Π°Ρ‡ΠΊΠΈ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ (ΠΆΠ΅Π»Ρ‚Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚) ΠΈ внСшний (Π³ΠΎΠ»ΡƒΠ±ΠΎΠΉ Ρ†Π²Π΅Ρ‚) ΠΊΠ»ΡŽΡ‡ΠΈ.
  2. Π‘Ρ‚Ρ€Π΅Π»ΠΊΠ° ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° связь ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ Π½Π° основС внСшнСго ΠΊΠ»ΡŽΡ‡Π° author_id.

Π§Ρ‚ΠΎΠ±Ρ‹ вывСсти Π΄Π²Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ вмСстС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ SQL-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ JOIN:

        sqlite> SELECT
   ...> a.first_name || ' ' || a.last_name AS author_name,
   ...> b.title AS book_title
   ...> FROM author a
   ...> JOIN book b ON b.author_id = a.author_id
   ...> ORDER BY a.last_name ASC;
Isaac Asimov|Foundation
Pearl Buck|The Good Earth
Tom Clancy|The Hunt For Red October
Tom Clancy|Patriot Games
Stephen King|It
Stephen King|Dead Zone
Stephen King|The Shining
John Le Carre|Tinker, Tailor, Solider, Spy: A George Smiley Novel
Alex Michaelides|The Silent Patient
Carol Shaben|Into The Abyss
    

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ SQL-запрос собираСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· author ΠΈ book, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡƒΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½Π½ΡƒΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ связь. ΠšΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡ строк SQL позволяСт ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ author_name ΠΏΠΎΠ»Π½ΠΎΠ΅ имя Π°Π²Ρ‚ΠΎΡ€Π°. Π”Π°Π½Π½Ρ‹Π΅, собранныС запросом, ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² порядкС возрастания ΠΏΠΎ полю last_name.

Π‘ΠΎΠ·Π΄Π°Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ для Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ ΠΊΠ½ΠΈΠ³ ΠΈ установив ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ связь, ΠΌΡ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΠΈ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ± Π°Π²Ρ‚ΠΎΡ€Π΅ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС, Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ ΠΊΠ½ΠΈΠ³Π°Ρ… – Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ.

πŸŒ‰ ДобавляСм связи: Β«ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ»

Автор ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ издатСлями, Π° ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ – со ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ Π°Π²Ρ‚ΠΎΡ€Π°ΠΌΠΈ. Книга ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π° Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°Ρ…, Π° ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ мноТСство Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠ½ΠΈΠ³. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… author_book_publisher.db ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Β«ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ» сущСствуСт ΠΌΠ΅ΠΆΠ΄Ρƒ Π°Π²Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΠΈ издатСлями, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ издатСлями ΠΈ ΠΊΠ½ΠΈΠ³Π°ΠΌΠΈ.

Π’Π°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ связи ΡΠ²Π»ΡΡŽΡ‚ΡΡ двусторонним ΠΈ создаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ²ΡΡ‰ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Вакая Ρ‚Π°Π±Π»ΠΈΡ†Π° содСрТит ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π΄Π²Π° поля Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π΄Π²ΡƒΡ… связанных Ρ‚Π°Π±Π»ΠΈΡ†:

        CREATE TABLE author_publisher (
    author_id INTEGER REFERENCES author,
    publisher_id INTEGER REFERENCES publisher
);
    

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ создаСтся новая Ρ‚Π°Π±Π»ΠΈΡ†Π° author_publisher, которая ссылаСтся Π½Π° ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ‚Π°Π±Π»ΠΈΡ† author ΠΈ publisher. Π’ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Π° author_publisher устанавливаСт ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈ ΠΈΠ·Π΄Π°Ρ‚Π΅Π»Π΅ΠΌ. Аналогично создаСтся Ρ‚Π°Π±Π»ΠΈΡ†Π° book_publisher.

ΠžΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ всСми Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ
ΠžΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ всСми Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ связь устанавливаСтся ΠΌΠ΅ΠΆΠ΄Ρƒ двумя ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ, Π½Π΅Ρ‚ нСобходимости ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ для самой Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ связСй. ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ Π΄Π²ΡƒΡ… связанных ΠΊΠ»ΡŽΡ‡Π΅ΠΉ создаСт ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€.

ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° JOIN, Π½ΠΎ Π² случаС связи ΠΌΠ½ΠΎΠ³ΠΈΠ΅-ΠΊΠΎ-ΠΌΠ½ΠΎΠ³ΠΈΠΌ трСбуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π΄Π²Π°ΠΆΠ΄Ρ‹:

  1. БоСдиняя Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ author ΠΈ author_publisher
  2. БоСдиняя Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ author_publisher ΠΈ publisher

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ SQL-запроса, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅Π³ΠΎ список Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ ΠΈΠ·Π΄Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΡŽΡ‰ΠΈΡ… ΠΈΡ… ΠΊΠ½ΠΈΠ³ΠΈ:

        sqlite> SELECT
   ...> a.first_name || ' ' || a.last_name AS author_name,
   ...> p.name AS publisher_name
   ...> FROM author a
   ...> JOIN author_publisher ap ON ap.author_id = a.author_id
   ...> JOIN publisher p ON p.publisher_id = ap.publisher_id
   ...> ORDER BY a.last_name ASC;
Isaac Asimov|Random House
Pearl Buck|Random House
Pearl Buck|Simon & Schuster
Tom Clancy|Berkley
Tom Clancy|Simon & Schuster
Stephen King|Random House
Stephen King|Penguin Random House
John Le Carre|Berkley
Alex Michaelides|Simon & Schuster
Carol Shaben|Simon & Schuster
    

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ запроса, ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ возмоТности SQL:

        sqlite> SELECT
   ...> a.first_name || ' ' || a.last_name AS author_name,
   ...> COUNT(b.title) AS total_books
   ...> FROM author a
   ...> JOIN book b ON b.author_id = a.author_id
   ...> GROUP BY author_name
   ...> ORDER BY total_books DESC, a.last_name ASC;
Stephen King|3
Tom Clancy|2
Isaac Asimov|1
Pearl Buck|1
John Le Carre|1
Alex Michaelides|1
Carol Shaben|1
    

Π­Ρ‚ΠΎΡ‚ запрос Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ количСство написанных ΠΈΠΌΠΈ ΠΊΠ½ΠΈΠ³. Бписок сортируСтся сначала ΠΏΠΎ количСству ΠΊΠ½ΠΈΠ³ Π² порядкС убывания, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π°Π²Ρ‚ΠΎΡ€Π° Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌ порядкС.

Π’ΠΎ Π΅ΡΡ‚ΡŒ здСсь ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ SQL ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ для агрСгирования ΠΈ сортировки Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ вычислСний Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° основС встроСнных возмоТностСй систСм управлСния Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ происходит быстрСС, Ρ‡Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π΅Ρ… ΠΆΠ΅ вычислСний с Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΌΠΈ Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Python.

🧰 Π Π°Π±ΠΎΡ‚Π° с SQLAlchemy ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Python

SQLAlchemy – это ΠΌΠΎΡ‰Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Python-инструмСнтов для доступа ΠΊ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. Когда ΠΌΡ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠ΅ΠΌ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ языкС, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΌΡ‹ΡΠ»ΠΈΡ‚ΡŒ Π² катСгориях ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Но ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΈ рСляционной модСлями сущСствуСт ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·Ρ€Ρ‹Π². Π­Ρ‚ΠΎΡ‚ Π·Π°Π·ΠΎΡ€ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-рСляционноС ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (ORM), прСдоставляСмоС SQLAlchemy. ΠœΠ΅ΠΆΠ΄Ρƒ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ Python появляСтся модСль, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰Π°Ρ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Python ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, SQLAlchemy позволяСт ΠΌΡ‹ΡΠ»ΠΈΡ‚ΡŒ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΡ€ΠΈ этом сохраняя ΠΌΠΎΡ‰Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

МодСль. Для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ SQLAlchemy ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… создаСтся модСль – класс Python, унаслСдованный ΠΎΡ‚ класса SQLAlchemy Base , ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Python, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ запроса, ΠΈ самими Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ Ρ„Π°ΠΉΠ» models.py создаСт ΠΌΠΎΠ΄Π΅Π»ΠΈ для прСдставлСния Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… author_book_publisher.db:

models.py
        # ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ классы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для опрСдСлСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΌΠΎΠ΄Π΅Π»ΠΈ
from sqlalchemy import Column, Integer, String, ForeignKey, Table

# ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ для создания ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ
from sqlalchemy.orm import relationship, backref

# ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ядро Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…
from sqlalchemy.ext.declarative import declarative_base

# создаСм класс, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ
Base = declarative_base()

# создаСм модСль Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ связСй Ρ‚Π°Π±Π»ΠΈΡ† author ΠΈ publisher
author_publisher = Table(
    "author_publisher",
    Base.metadata,
    Column("author_id", Integer, ForeignKey("author.author_id")),
    Column("publisher_id", Integer, ForeignKey("publisher.publisher_id")),
)

# создаСм модСль Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ связСй Ρ‚Π°Π±Π»ΠΈΡ† book ΠΈ publisher
book_publisher = Table(
    "book_publisher",
    Base.metadata,
    Column("book_id", Integer, ForeignKey("book.book_id")),
    Column("publisher_id", Integer, ForeignKey("publisher.publisher_id")),
)

# опрСдСляСм модСльи классов для Π°Π²Ρ‚ΠΎΡ€Π°, ΠΊΠ½ΠΈΠ³ΠΈ ΠΈ ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°
class Author(Base):
    __tablename__ = "author"
    author_id = Column(Integer, primary_key=True)
    first_name = Column(String)
    last_name = Column(String)
    books = relationship("Book", backref=backref("author"))
    publishers = relationship(
        "Publisher", secondary=author_publisher, back_populates="authors"
    )

class Book(Base):
    __tablename__ = "book"
    book_id = Column(Integer, primary_key=True)
    author_id = Column(Integer, ForeignKey("author.author_id"))
    title = Column(String)
    publishers = relationship(
        "Publisher", secondary=book_publisher, back_populates="books"
    )

class Publisher(Base):
    __tablename__ = "publisher"
    publisher_id = Column(Integer, primary_key=True)
    name = Column(String)
    authors = relationship(
        "Author", secondary=author_publisher, back_populates="publishers"
    )
    books = relationship(
        "Book", secondary=book_publisher, back_populates="publishers"
    )
    

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π² ΠΊΠΎΠ΄Π΅ коммСнтариях ΠΌΠΎΠ΄Π΅Π»ΠΈ сопоставлСны пяти ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π²Ρ‹ΡˆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… author_book_publisher.db.

Класс Table слуТит для создания ΡΠ²ΡΠ·ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ для создания ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ ΠΌΠ½ΠΎΠ³ΠΈΠ΅-ΠΊΠΎ-ΠΌΠ½ΠΎΠ³ΠΈΠΌ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ – имя Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Π²Ρ‚ΠΎΡ€ΠΎΠΉ (Base.metadata) обСспСчиваСт связь ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ SQLAlchemy ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°ΠΌΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ экзСмплярами класса Column, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Ρ‚ΠΈΠΏΡƒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ соотвСтствиС Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ ΠΊΠ»ΡŽΡ‡Ρƒ.

Класс ForeignKey опрСдСляСт взаимосвязь ΠΌΠ΅ΠΆΠ΄Ρƒ двумя полями Column Π² Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ…. НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ author_publisher сообщаСт SQLAlchemy, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ author_publisher Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»Π΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ author_id, Ρ‚ΠΈΠΏ этого поля – Integer, ΠΈ ΠΎΠ½ являСтся внСшним ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, связанным с ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ author.

        Column("author_id", Integer, ForeignKey("author.author_id"))
    

Ѐункция relationship опрСдСляСт ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ΄ΠΈΠ½-ΠΊΠΎ-ΠΌΠ½ΠΎΠ³ΠΈΠΌ.

        books = relationship("Book", backref=backref("author"))
    

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ relationship – имя класса Book (Π½Π΅ ΠΏΡƒΡ‚Π°ΠΉΡ‚Π΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ book) – это класс, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ относится Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ books. Π­Ρ‚ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ сообщаСт SQLAlchemy, Ρ‡Ρ‚ΠΎ сущСствуСт связь ΠΌΠ΅ΠΆΠ΄Ρƒ классами Author ΠΈ Book. SQLAlchemy Π½Π°ΠΉΠ΄Π΅Ρ‚ связь Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса Book:

        author_id = Column(Integer, ForeignKey("author.author_id"))
    

SQLAlchemy распознаСт, Ρ‡Ρ‚ΠΎ это Ρ‚ΠΎΡ‡ΠΊΠ° соСдинСния ForeignKey ΠΌΠ΅ΠΆΠ΄Ρƒ двумя классами.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ backref создаСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ author для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ экзСмпляра Book. Π­Ρ‚ΠΎΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ссылаСтся Π½Π° Author, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ связан экзСмпляр Book.

НапримСр, Ссли Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Python, Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ запроса Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ экзСмпляр Book, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΊΠ½ΠΈΠ³Π΅:

        book = session.query(Book).filter_by(Book.title == "The Stand").one_or_none()
print(f"Authors name: {book.author.first_name} {book.author.last_name}")
    

НаличиС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° author Π² book связано с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ backref. ΠžΠ±Ρ€Π°Ρ‚Π½Π°Ρ ссылка ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½Π°, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, Π° всС, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ, – это Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ экзСмпляр.

Другая связь Ρƒ Author с классом Publisher:

        publishers = relationship(
    "Publisher", secondary=author_publisher, back_populates="authors"
)

# для сравнСния
books = relationship("Book", backref=backref("author"))

    

Как ΠΈ ΠΊΠ½ΠΈΠ³ΠΈ, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ publishers ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΡΠΎΠ²ΠΎΠΊΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·Π΄Π°Ρ‚Π΅Π»Π΅ΠΉ, связанных с Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, "Publisher", сообщаСт SQLAlchemy, Ρ‡Ρ‚ΠΎ это Π·Π° класс. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ secondary сообщаСт SQLAlchemy, Ρ‡Ρ‚ΠΎ связь с классом Publisher осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· Β«Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½ΡƒΡŽΒ» Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ – Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ author_publisher. Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ back_populate сообщаСт SQLAlchemy ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Π² классС Publisher, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ authors.

πŸ’¬ Запросы ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ запрос Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ SELECT * FROM author Π² SQLAlchemy ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

        results = session.query(Author).all()
    

Π—Π΄Π΅ΡΡŒ session – ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ SQLAlchemy, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для связи с SQLite Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Python. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ сообщаСм, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚ΠΈΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ запрос ΠΊ ΠΌΠΎΠ΄Π΅Π»ΠΈ Author ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ всС записи.

На этом этапС прСимущСства использования SQLAlchemy вмСсто простого SQL ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹, особСнно с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ нСобходимости создания ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ. Однако оказываСтся, Ρ‡Ρ‚ΠΎ вмСсто списка скалярных Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ список экзСмпляров ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Author с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π°ΠΌ столбцов.

ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΊΠ½ΠΈΠ³ ΠΈ ΠΈΠ·Π΄Π°Ρ‚Π΅Π»Π΅ΠΉ, поддСрТиваСмая SQLAlchemy, создаСт иСрархичСский список Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ написанных ΠΈΠΌΠΈ ΠΊΠ½ΠΈΠ³, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ·Π΄Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ эти ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈ. Π—Π° кулисами SQLAlchemy ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ SQL для выполнСния Π² систСмС управлСния Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… SQLite. И Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, SQLAlchemy ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ запросами SQL, Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Python.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SQLAlchemy ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ запрос агрСгирования, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Ρ€Π°Π½Π΅Π΅ для списка Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ количСства написанных ΠΊΠ½ΠΈΠ³, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

        author_book_totals = (
    session.query(
        Author.first_name,
        Author.last_name,
        func.count(Book.title).label("book_total")
    )
    .join(Book)
    .group_by(Author.last_name)
    .order_by(desc("book_total"))
    .all()
)
    

Запрос session.query Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ имя ΠΈ Ρ„Π°ΠΌΠΈΠ»ΠΈΡŽ Π°Π²Ρ‚ΠΎΡ€Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ количСство ΠΊΠ½ΠΈΠ³, написанных Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ. ΠΠ³Ρ€Π΅Π³ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ счСтчик Π² инструкции group_by ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ подсчСт ΠΏΠΎ Ρ„Π°ΠΌΠΈΠ»ΠΈΠΈ Π°Π²Ρ‚ΠΎΡ€Π°. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² порядкС убывания Π½Π° основС расчСтной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с псСвдонимом book_total.

πŸ‘¨β€πŸ’» ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ examples/example_2/main.py содСрТит Ρ‚Π΅ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ SQLAlchemy ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для взаимодСйствия с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… SQLite author_book_publisher.db. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ здСсь Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main():

        def main():
    """Main entry point of program"""
    # ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· SQLAlchemy
    with resources.path(
        "project.data", "author_book_publisher.db"
    ) as sqlite_filepath:
        engine = create_engine(f"sqlite:///{sqlite_filepath}")
    Session = sessionmaker()
    Session.configure(bind=engine)
    session = Session()

    # ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ число ΠΊΠ½ΠΈΠ³, ΠΈΠ·Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎΠΌ
    books_by_publisher = get_books_by_publishers(session, ascending=False)
    for row in books_by_publisher:
        print(f"Publisher: {row.name}, total books: {row.total_books}")
    print()

    # ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ число Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°
    authors_by_publisher = get_authors_by_publishers(session)
    for row in authors_by_publisher:
        print(f"Publisher: {row.name}, total authors: {row.total_authors}")
    print()

    # Π˜Π΅Ρ€Π°Ρ€Ρ…ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ…
    authors = get_authors(session)
    output_author_hierarchy(authors)

    # ДобавляСм Π½ΠΎΠ²ΡƒΡŽ ΠΊΠ½ΠΈΠ³Ρƒ
    add_new_book(
        session,
        author_name="Stephen King",
        book_title="The Stand",
        publisher_name="Random House",
    )

    # Π’Ρ‹Π²ΠΎΠ΄ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹Ρ… свСдСний
    authors = get_authors(session)
    output_author_hierarchy(authors)
    

Π’ сравнСнии с ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ вСсь ΠΊΠΎΠ΄ Π² Ρ„Π°ΠΉΠ»Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π° Π½Π΅ Ρ‚ΠΎ, ΠΊΠ°ΠΊ это Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. И Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ части нашСго рассказа Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ вмСсто использования SQL ΠΌΡ‹ примСняСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Python.

πŸ‘₯ ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ нСскольким ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ

К этому ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ, ΠΊΠ°ΠΊ для доступа ΠΊ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ pandas, SQLite ΠΈ SQLAlchemy. Одним ΠΈΠ· Ρ€Π΅ΡˆΠ°ΡŽΡ‰ΠΈΡ… Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ использованиСм плоского Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… являСтся объСм Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ количСство связСй ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ структурами Π΄Π°Π½Π½Ρ‹Ρ…. Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΊΡ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдуСт ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, – с ΠΊΠ°ΠΊΠΈΠΌ количСством ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΌΡ‹ дСлимся Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ вопрос критичности ΠΈΡ… рассинхронизации.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° обСспСчСния Сдинообразия Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° мноТСство ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΡΠ΅Ρ‚ΡŒ. ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· сСрвСрноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ цСлостности Π΄Π°Π½Π½Ρ‹Ρ…. Π’ этом случаС сСрвСр – СдинствСнноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π΅ доступ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ².

ПослСдний ΠΏΡ€ΠΈΠΌΠ΅Ρ€ – Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π½ΠΎΠ΅ Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс для ΠΎΠ±Ρ€Π°Π·Ρ†Π° сущСствСнно Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½ΠΎΠΉ ΡƒΡ‡Π΅Π±Π½ΠΎΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… SQLite Chinook, содСрТащСй ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΌΡƒΠ·Ρ‹ΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… исполнитСлях, Π°Π»ΡŒΠ±ΠΎΠΌΠ°Ρ…, Ρ‚Ρ€Π΅ΠΊΠ°Ρ…, ΠΆΠ°Π½Ρ€Π°Ρ… ΠΈ Ρ‚. ΠΏ. (11 связанных Ρ‚Π°Π±Π»ΠΈΡ†).

🌐 ИспользованиС Flask с SQLite и SQLAlchemy

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° examples/example_3/chinook_server.py создаСт ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Flask, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°. Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ:

  • Flask Blueprint – Ρ‡Π°ΡΡ‚ΡŒ Flask для дСлСгирования Π·Π°Π΄Π°Ρ‡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ модулям с Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ;
  • Flask SQLAlchemy – Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Flask, Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ Π² Π²Π΅Π±-прилоТСния ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ SQLAlchemy;
  • Flask_Bootstrap4 ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ Π½Π°Π±ΠΎΡ€ интСрфСйсных инструмСнтов Bootstrap, интСгрируя Π΅Π³ΠΎ с Π²Π΅Π±-прилоТСниями Flask;
  • Flask_WTF Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ Flask с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ WTForms, прСдоставляя вашим Π²Π΅Π±-прилоТСниям ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ создания ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²Π΅Π±-Ρ„ΠΎΡ€ΠΌ;
  • python_dotenv – ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Python, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ для чтСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… срСды ΠΈΠ· Ρ„Π°ΠΉΠ»Π° ΠΈ сохранСния ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ прилоТСния довольно большой, ΠΈ лишь нСкоторая Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊ руководству. По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° оставлСно Π² качСствС упраТнСния для читатСля. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ прСдставлСнный Π½ΠΈΠΆΠ΅ скринкаст, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ слСдуСт HTML-ΠΊΠΎΠ΄ шаблона домашнСй страницы ΠΈ Python-скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ динамичСски прСдоставляСт Π΄Π°Π½Π½Ρ‹Π΅.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² дСйствии: ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ мСню ΠΈ функциям
ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² дСйствии: ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ мСню ΠΈ функциям

HTML-шаблон Jinja2, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт домашнюю страницу прилоТСния:

        {% extends "base.html" %}

{% block content %}
<div class="container-fluid">
  <div class="m-4">
    <div class="card" style="width: 18rem;">
      <div class="card-header">Create New Artist</div>
      <div class="card-body">
        <form method="POST" action="{{url_for('artists_bp.artists')}}">
          {{ form.csrf_token }}
          {{ render_field(form.name, placeholder=form.name.label.text) }}
          <button type="submit" class="btn btn-primary">Create</button>
        </form>
      </div>
    </div>
    <table class="table table-striped table-bordered table-hover table-sm">
      <caption>List of Artists</caption>
      <thead>
        <tr>
          <th>Artist Name</th>
        </tr>
      </thead>
      <tbody>
        {% for artist in artists %}
        <tr>
          <td>
            <a href="{{url_for('albums_bp.albums', artist_id=artist.artist_id)}}">
              {{ artist.name }}
            </a>
          </td>
        </tr>
        {% endfor %}
      </tbody>
    </table>
  </div>
</div>
{% endblock %}
    

Π€Π°ΠΉΠ» Python, отвСтствСнный Π·Π° ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ страницы:

examples/example_3/app/artists/routes.py
        from flask import Blueprint, render_template, redirect, url_for
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import InputRequired, ValidationError
from app import db
from app.models import Artist

# НастраиваСм blueprint
artists_bp = Blueprint(
    "artists_bp", __name__, template_folder="templates", static_folder="static"
)

def does_artist_exist(form, field):
    artist = (
        db.session.query(Artist)
        .filter(Artist.name == field.data)
        .one_or_none()
    )
    if artist is not None:
        raise ValidationError("Artist already exists", field.data)

class CreateArtistForm(FlaskForm):
    name = StringField(
        label="Artist's Name", validators=[InputRequired(), does_artist_exist]
    )

@artists_bp.route("/")
@artists_bp.route("/artists", methods=["GET", "POST"])
def artists():
    form = CreateArtistForm()

    # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡ‹
    if form.validate_on_submit():
        # "Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ" Π½ΠΎΠ²ΠΎΠ³ΠΎ артиста
        artist = Artist(name=form.name.data)
        db.session.add(artist)
        db.session.commit()
        return redirect(url_for("artists_bp.artists"))

    artists = db.session.query(Artist).order_by(Artist.name).all()
    return render_template("artists.html", artists=artists, form=form,)
    
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ REST API сСрвСра
Π’Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Flask ΠΈΠ»ΠΈ Django ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания Π²Π΅Π±-сСрвСра, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ REST API. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ΄Π²ΠΎΠ΄ΠΊΠΈ Π΄Π°Π½Ρ‹ Π² ΡΡ‚Π°Ρ‚ΡŒΡΡ… Python REST APIs With Flask, Connexion, and SQLAlchemy ΠΈ Create a Super Basic REST API with Django Tastypie.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π Π°Π·ΡƒΠΌΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒΡΡ вопросом: являСтся Π»ΠΈ SQLite ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ Π² качСствС сСрвСрной части Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… для Π²Π΅Π±-прилоТСния. На Π²Π΅Π±-сайтС SQLite ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ SQLite – Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ Π²Ρ‹Π±ΠΎΡ€ для сайтов, ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… ΠΎΠΊΠΎΠ»ΠΎ 100 тыс. ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ Π² дСнь. Если Π½Π° вашСм сайт посСщСний большС, Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ вас стоит ΠΏΠΎΠ·Π΄Ρ€Π°Π²ΠΈΡ‚ΡŒ πŸŽ‰

Если Π²Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π²Π΅Π±-сайт с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SQLAlchemy, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ пСрСнСсти Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· SQLite Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΡƒΡŽ ​​как MySQL ΠΈΠ»ΠΈ PostgreSQL. ΠžΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… SQLAlchemy останутся ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌΠΈ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

ΠœΠ•Π ΠžΠŸΠ Π˜Π―Π’Π˜Π―

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

Π’ΠΠšΠΠΠ‘Π˜Π˜

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ вакансию
Java Team Lead
Москва, ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования
Senior Java Developer
Москва, ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования
Go-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ
ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•