🐍🐬 Python ΠΈ MySQL: практичСскоС Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅

362 ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ

Рассмотрим Π½Π° практичСском ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΊΠ°ΠΊ ΠΈΠ· ΠΊΠΎΠ΄Π° Python Π΄Π΅Π»Π°Ρ‚ΡŒ SQL-запросы ΠΊ MySQL-сСрвСру: CREATE, SELECT, UPDATE, JOIN ΠΈ Ρ‚. Π΄.

Рассмотрим Π½Π° практичСском ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΊΠ°ΠΊ ΠΈΠ· ΠΊΠΎΠ΄Π° Python Π΄Π΅Π»Π°Ρ‚ΡŒ SQL-запросы ΠΊ MySQL-сСрвСру: CREATE, SELECT, UPDATE, JOIN ΠΈ Ρ‚. Π΄.

ΠŸΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡ прСдставляСт собой Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сокращСнный ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π§Π°ΠΉΡ‚Π°Π½ΡŒΠΈ Π‘Π°Π²Π΅Π΄ΠΆΠΈ Python and MySQL Database: A Practical Introduction. ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Ρ‚Π°ΠΊΠΆΠ΅ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π² Π²ΠΈΠ΄Π΅ Π±Π»ΠΎΠΊΠ½ΠΎΡ‚Π° Jupyter.

***

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Ρ‚ΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ взаимодСйствуСт с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ языки программирования (Python Π½Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅), ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ инструмСнты хранСния источников Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ доступа ΠΊ Π½ΠΈΠΌ. MySQL β€” ΠΎΠ΄Π½Π° ΠΈΠ· самых популярных систСм управлСния Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (Π‘Π£Π‘Π”). Π’ ΠΏΠΎΠ·Π°ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ Π³ΠΎΠ΄Ρƒ ΠΎΠ½Π° заняла Π²Ρ‚ΠΎΡ€ΠΎΠ΅ мСсто послС Π‘Π£Π‘Π” Oracle Π² Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³Π΅ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ….

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, описанныС Π² этом руководствС, Π²Ρ‹ смоТСтС эффСктивно ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… MySQL Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Python. Π’ Ρ…ΠΎΠ΄Π΅ руководства ΠΌΡ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… MySQL для систСмы Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³Π° Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ² ΠΈ ΡƒΠ·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ Π·Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈΠ· Π½Π΅Π΅ Π΄Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python-ΠΊΠΎΠ΄Π°.

К ΠΊΠΎΠ½Ρ†Ρƒ этого ΡƒΡ€ΠΎΠΊΠ° Π²Ρ‹ смоТСтС:

  • ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… MySQL
  • Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ запрос ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… для получСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…
  • ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈ доступС ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΎΡ‚Π΄Π°Ρ‡Ρƒ ΠΎΡ‚ этого руководства, ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ практичСскиС знания ΠΎ Ρ‚Π°ΠΊΠΈΡ… концСпциях Python, ΠΊΠ°ΠΊ Ρ†ΠΈΠΊΠ» for, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Π’Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ прСдставлСния ΠΎ SQL-запросах, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ SELECT, DROP, CREATE ΠΈ JOIN.

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ MySQL с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ SQL-Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

SQL (Structured Query Language) β€” язык структурированных запросов. SQL являСтся ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ языком программирования для управлСния рСляционными Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ ΡΠ»Ρ‹ΡˆΠ°Π»ΠΈ ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π‘Π£Π‘Π” Π½Π° основС SQL: MySQL, PostgreSQL, SQLite ΠΈ SQL Server. ВсС эти Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ стандартам SQL, Π½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π² дСталях.

Π’ силу открытости исходного ΠΊΠΎΠ΄Π° MySQL быстро стал Π»ΠΈΠ΄Π΅Ρ€ΠΎΠΌ Ρ€Ρ‹Π½ΠΊΠ° срСди SQL-Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ. Π’ настоящСС врСмя MySQL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ всСми ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΌΠΈ тСхничСскими Ρ„ΠΈΡ€ΠΌΠ°ΠΌΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Google, LinkedIn, Uber, Netflix, Twitter ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅.

Помимо ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ со стороны open source-сообщСства, Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ успСха MySQL:

  1. ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π° установки. MySQL Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π‘Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Π»Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ. MySQL доступСн для основных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Windows, macOS, Linux ΠΈ Solaris.
  2. Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ. MySQL ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π΅ΠΏΡƒΡ‚Π°Ρ†ΠΈΡŽ быстрого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…. Π•Ρ‰Π΅ эта Π‘Π£Π‘Π” Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ.
  3. ΠŸΡ€Π°Π²Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ. MySQL позволяСт ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΡƒΡ€ΠΎΠ²Π½ΠΈ бСзопасности ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ, Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ ΡƒΡ‡Π΅Ρ‚Π½Ρ‹ΠΌ записям ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²Π°ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ выглядит сущСствСнно ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ Ρƒ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Π‘Π£Π‘Π”, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ PostgreSQL, Π³Π΄Π΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ сноровки.

MySQL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ синтаксис, ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ Π½Π° стандартный SQL, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΆΠ½Ρ‹Π΅ отличия, описанныС Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Установка MySQL Server ΠΈ MySQL Connector

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с этим руководством, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ: MySQL Server ΠΈ MySQL Connector. MySQL Server прСдоставит рСсурсы, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. ПослС запуска сСрвСра Π²Ρ‹ смоТСтС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ своС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Python с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ MySQL Connector/Python.

Установка MySQL Server

ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ докумСнтация описываСт Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹Π΅ способы Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ установки MySQL Server. Π•ΡΡ‚ΡŒ инструкции для всСх популярных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Windows, macOS, Solaris, Linux ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅.

Для Windows Π»ΡƒΡ‡ΡˆΠ΅ всСго Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ установщик MySQL ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Π΅ΠΌΡƒ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ процСссС. ДиспСтчСр установки Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ бСзопасности сСрвСра MySQL. На страницС ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Ρ… записСй Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ввСсти ΠΏΠ°Ρ€ΠΎΠ»ΡŒ для root-записи ΠΈ ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ привилСгиями.

Настройка ΡƒΡ‡Π΅Ρ‚Π½ΠΎΠΉ записи MySQL
Настройка ΡƒΡ‡Π΅Ρ‚Π½ΠΎΠΉ записи MySQL

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ установщиков ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ инструмСнты, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, MySQL Workbench. Удобная Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° установкС Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС β€” Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ MySQL с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Docker.

Установка MySQL Connector/Python

Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… β€” ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с Π‘Π£Π‘Π”. Π’Π°ΠΊΠΈΠ΅ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. Π‘Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ интСрфСйс, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ всС Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… Python, описан Π² PEP 249. Π”Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… Python, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ sqlite3 для SQLite, psycopg для PostgreSQL ΠΈ MySQL Connector/Python для MySQL, ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ этим ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ.

Для установки Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° (ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Π°) Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² pip:

pip install mysql-connector-python

pip установит ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π°ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ срСду. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ срСду.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ установки, запустив Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ Python ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

import mysql.connector

Если инструкция ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° выполняСтся Π±Π΅Π· ошибок, Π·Π½Π°Ρ‡ΠΈΡ‚ mysql.connector ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ установлСн ΠΈ Π³ΠΎΡ‚ΠΎΠ² ΠΊ использованию.

УстановлСниС соСдинСния с сСрвСром MySQL

MySQL ― это сСрвСрная систСма управлСния Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Один сСрвСр ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ нСсколько Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…. Π§Ρ‚ΠΎΠ±Ρ‹ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ соСдинСниС с сСрвСром. Π Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Python, которая взаимодСйствуСт с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° основС MySQL, Π² ΠΎΠ±Ρ‰ΠΈΡ… Ρ‡Π΅Ρ€Ρ‚Π°Ρ… выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  1. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ ΠΊ сСрвСру MySQL.
  2. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… (ΠΏΡ€ΠΈ нСобходимости).
  3. БоСдиняСмся с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ….
  4. ВыполняСм SQL-запрос, собираСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.
  5. Π‘ΠΎΠΎΠ±Ρ‰Π°Π΅ΠΌ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Ссли Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ внСсСны измСнСния.
  6. Π—Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ соСдинСниСм с сСрвСром MySQL.

Каким Π±Ρ‹ Π½ΠΈ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ шаг ― ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ собой ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ ΠΊ сСрвСру MySQL ΠΈΠ· Python

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ соСдинСниС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ connect() ΠΈΠ· модуля mysql.connector. Π­Ρ‚Π° функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ host, user ΠΈ password, Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ MySQLConnection. Π£Ρ‡Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Π²ΠΎΠ΄Π° ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ:

from getpass import getpass
from mysql.connector import connect, Error

try:
with connect(
host="localhost",
user=input("Имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ: "),
password=getpass("ΠŸΠ°Ρ€ΠΎΠ»ΡŒ: "),
) as connection:
print(connection)
except Error as e:
print(e)

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ MySQLConnection хранится Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ connection, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для доступа ΠΊ сСрвСру MySQL. НСсколько Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ²:

  • ВсС соСдинСния с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΠΉΡ‚Π΅Π² Π±Π»ΠΎΠΊΠΈ try ... except. Π’Π°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.
  • НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ Π·Π°ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ соСдинСниС послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ доступа ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. ΠΠ΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ соСдинСния приводят ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌ ошибкам ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ. Π’ ΠΊΠΎΠ΄Π΅ для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ диспСтчСр контСкста (with ... as ...).
  • Никогда Π½Π΅ слСдуСт Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ (имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ) Π² строковом Π²ΠΈΠ΄Π΅ Π² скрипт Python. Π­Ρ‚ΠΎ плохая ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° для развСртывания, которая прСдставляСт ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΡƒΡŽ ΡƒΠ³Ρ€ΠΎΠ·Ρƒ бСзопасности. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ для Π²Ρ…ΠΎΠ΄Π° ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ встроСнный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ getpass, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ. Π₯отя это Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ ТСсткоС ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅, Π±ΠΎΠ»Π΅Π΅ бСзопасныС способы хранСния ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, использованиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… срСды.

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ установили соСдинСниС ΠΌΠ΅ΠΆΠ΄Ρƒ нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ ΠΈ сСрвСром MySQL. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈΠ±ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ.

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΈΠΌΠ΅Π½Π΅ΠΌ online_movie_rating, Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ SQL:

CREATE DATABASE online_movie_rating;

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

MySQL обязываСт ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ с запятой (;) Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Однако MySQL Connector/Python автоматичСски добавляСт Ρ‚ΠΎΡ‡ΠΊΡƒ с запятой Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ запроса.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ SQL-запрос, Π½Π°ΠΌ понадобится курсор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ абстрагируСт процСсс доступа ΠΊ записям Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. MySQL Connector/Python прСдоставляСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ класс MySQLCursor, экзСмпляр ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ называСтся курсором.

ΠŸΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ наш запрос ΠΎ создании Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… online_movie_rating:

try:
with connect(
host="localhost",
user=input("Имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ: "),
password=getpass("ΠŸΠ°Ρ€ΠΎΠ»ΡŒ: "),
) as connection:
create_db_query = "CREATE DATABASE online_movie_rating" with connection.cursor() as cursor:
cursor.execute(create_db_query)
except Error as e:
print(e)

Запрос CREATE DATABASE сохраняСтся Π² Π²ΠΈΠ΄Π΅ строки Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ create_db_query, Π° Π·Π°Ρ‚Π΅ΠΌ пСрСдаСтся Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² cursor.execute().

Если Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… с Ρ‚Π°ΠΊΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΡƒΠΆΠ΅ сущСствуСт Π½Π° сСрвСрС, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ сообщСниС ΠΎΠ± ошибкС. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ MySQLConnection, Ρ‡Ρ‚ΠΎ ΠΈ Ρ€Π°Π½Π΅Π΅, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ запрос SHOW DATABASES, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ всС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, хранящиСся Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…:

try:
with connect(
host="localhost",
user=input("Π’Π²Π΅Π΄ΠΈΡ‚Π΅ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ: "),
password=getpass("Π’Π²Π΅Π΄ΠΈΡ‚Π΅ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ: "),
) as connection:
show_db_query = "SHOW DATABASES" with connection.cursor() as cursor:
cursor.execute(show_db_query)
for db in cursor:
print(db)
except Error as e:
print(e)

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ: root
Π’Π²Π΅Π΄ΠΈΡ‚Π΅ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ: Β·Β·Β·Β·Β·Β·Β·Β·
('information_schema',)
('mysql',)
('online_movie_rating',)
('performance_schema',)
('sys',)

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π° всСх Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, находящихся Π½Π° нашСм сСрвСрС MySQL. Команда SHOW DATABASES Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π²Π΅Π»Π° Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ автоматичСски ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ сСрвСром MySQL ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ доступ ΠΊ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹ΠΌ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ настройкам сСрвСра.

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ создали Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ online_movie_rating. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΊ Π½Π΅ΠΉ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ, просто дополняСм Π²Ρ‹Π·ΠΎΠ² connect() ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ database:

try:
with connect(
host="localhost",
user=input("Имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ: "),
password=getpass("ΠŸΠ°Ρ€ΠΎΠ»ΡŒ: "),
database="online_movie_rating",
) as connection:
print(connection)
except Error as e:
print(e)

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ запросы: CREATE TABLE, DROP ΠΈ ALTER.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ схСмы Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

НачнСм с создания схСмы Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… для Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΎΠ²ΠΎΠΉ систСмы Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ². Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ‚Π°Π±Π»ΠΈΡ†:

1. movies ― общая информация ΠΎ Ρ„ΠΈΠ»ΡŒΠΌΠ°Ρ…:

  • id
  • title
  • release year
  • genre
  • collection_in_mi

2. reviewers ― информация ΠΎ Π»ΡŽΠ΄ΡΡ…, ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π²ΡˆΠΈΡ… ΠΎΡ†Π΅Π½ΠΊΠΈ Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ²:

  1. id
  2. first_name
  3. last_name

3. ratings ― информация ΠΎΠ± ΠΎΡ†Π΅Π½ΠΊΠ°Ρ… Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ² Ρ€Π΅Ρ†Π΅Π½Π·Π΅Π½Ρ‚Π°ΠΌΠΈ:

  1. movie_id (foreign key)
  2. reviewer_id (foreign key)
  3. rating

Π­Ρ‚ΠΈΡ… Ρ‚Ρ€Π΅Ρ… Ρ‚Π°Π±Π»ΠΈΡ† достаточно для Ρ†Π΅Π»Π΅ΠΉ Π΄Π°Π½Π½ΠΎΠ³ΠΎ руководства.

Π‘Ρ…Π΅ΠΌΠ° систСмы Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³Π° Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ²
Π‘Ρ…Π΅ΠΌΠ° систСмы Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³Π° Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ²

Π’Π°Π±Π»ΠΈΡ†Ρ‹ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… связаны Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ: movies ΠΈ reviewers Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Β«ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ»: ΠΎΠ΄ΠΈΠ½ Ρ„ΠΈΠ»ΡŒΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ просмотрСн нСсколькими Ρ€Π΅Ρ†Π΅Π½Π·Π΅Π½Ρ‚Π°ΠΌΠΈ, Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π΅Ρ†Π΅Π½Π·Π΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Ρ†Π΅Π½Π·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСсколько Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ². Π’Π°Π±Π»ΠΈΡ†Π° ratings соСдиняСт Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ² с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ Ρ€Π΅Ρ†Π΅Π½Π·Π΅Π½Ρ‚ΠΎΠ².

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ† с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° CREATE TABLE

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π² MySQL, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ CREATE TABLE. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ запрос MySQL создаст Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ movies нашСй Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… online_movie_rating:

CREATE TABLE movies(
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100),
release_year YEAR(4),
genre VARCHAR(100),
collection_in_mil INT );

Если Π²Ρ‹ Ρ€Π°Π½ΡŒΡˆΠ΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Π»ΠΈΡΡŒ с SQL, Π²Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ понятСн смысл ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ запроса. Π£ Π΄ΠΈΠ°Π»Π΅ΠΊΡ‚Π° MySQL Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‡Π΅Ρ€Ρ‚Ρ‹. НапримСр, MySQL ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ Π²Ρ‹Π±ΠΎΡ€ Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ YEAR, INT, BIGINT ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, MySQL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово AUTO_INCREMENT, ΠΊΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ столбца Π΄ΠΎΠ»ΠΆΠ½ΠΎ автоматичСски ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ вставкС Π½ΠΎΠ²Ρ‹Ρ… записСй.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ запрос Π² cursor.execute():

create_movies_table_query = """
CREATE TABLE movies(
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100),
release_year YEAR(4),
genre VARCHAR(100),
collection_in_mil INT
)
"""
with connection.cursor() as cursor:
cursor.execute(create_movies_table_query)
connection.commit()

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ connection.commit(). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€ MySQL Π½Π΅ выполняСт Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ„ΠΈΠΊΡΠ°Ρ†ΠΈΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. Π’ MySQL ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, упомянутыС Π² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, происходят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ COMMIT. Π§Ρ‚ΠΎΠ±Ρ‹ внСсти измСнСния Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, всСгда Π²Ρ‹Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ послС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ.

ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ для Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ reviewers:

create_reviewers_table_query = """
CREATE TABLE reviewers (
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(100),
last_name VARCHAR(100)
)
"""
with connection.cursor() as cursor:
cursor.execute(create_reviewers_table_query)
connection.commit()

НаконСц, создадим Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ratings:

create_ratings_table_query = """
CREATE TABLE ratings (
movie_id INT,
reviewer_id INT,
rating DECIMAL(2,1),
FOREIGN KEY(movie_id) REFERENCES movies(id),
FOREIGN KEY(reviewer_id) REFERENCES reviewers(id),
PRIMARY KEY(movie_id, reviewer_id)
)
"""
with connection.cursor() as cursor:
cursor.execute(create_ratings_table_query)
connection.commit()

РСализация ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ внСшнСго ΠΊΠ»ΡŽΡ‡Π° Π² MySQL Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ отличаСтся ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ограничСния Π² сравнСнии со стандартным SQL. Π’ MySQL ΠΈ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ, ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ внСшнСго ΠΊΠ»ΡŽΡ‡Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ хранСния ― Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ систСма управлСния Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для выполнСния SQL-ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. MySQL ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π΄Π²Π° Π²ΠΈΠ΄Π° Ρ‚Π°ΠΊΠΈΡ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ²:

  1. Π’Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ хранСния бСзопасны для Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡ‚ΠΊΠ°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ простых ΠΊΠΎΠΌΠ°Π½Π΄, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ rollback. К этой ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ относятся ΠΌΠ½ΠΎΠ³ΠΈΠ΅ популярныС Π΄Π²ΠΈΠΆΠΊΠΈ MySQL, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ InnoDB ΠΈ NDB.
  2. НСтранзакционныС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ хранСния для ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², зафиксированных Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠΏΠΈΡ€Π°ΡŽΡ‚ΡΡ Π½Π° Ρ€ΡƒΡ‡Π½ΠΎΠΉ ΠΊΠΎΠ΄. Π­Ρ‚ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ MyISAM ΠΈ MEMORY.

InnoDB ― самый популярный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ хранСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Боблюдая ограничСния внСшнСго ΠΊΠ»ΡŽΡ‡Π°, ΠΎΠ½ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ любая CRUD-опСрация с внСшним ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ провСряСтся Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ нСсогласованности ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π° ratings ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ столбцы movie_id ΠΈ reviewer_id, ΠΊΠ°ΠΊ Π΄Π²Π° Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΊΠ»ΡŽΡ‡Π°, Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… вмСстС Π² качСствС ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°. Π­Ρ‚Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ€Π΅Ρ†Π΅Π½Π·Π΅Π½Ρ‚ Π½Π΅ смоТСт Π΄Π²Π°ΠΆΠ΄Ρ‹ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ„ΠΈΠ»ΡŒΠΌ.

Один ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ курсор ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ. Π’ этом случаС всС обращСния станут ΠΎΠ΄Π½ΠΎΠΉ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠ΅ΠΉ. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ всС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ CREATE TABLE ΠΎΠ΄Π½ΠΈΠΌ курсором, Π° Π·Π°Ρ‚Π΅ΠΌ Π·Π°Ρ€Π°Π· Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ:

with connection.cursor() as cursor:
cursor.execute(create_movies_table_query)
cursor.execute(create_reviewers_table_query)
cursor.execute(create_ratings_table_query)
connection.commit()

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ схСмы Ρ‚Π°Π±Π»ΠΈΡ† с использованиСм ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° DESCRIBE

ΠœΡ‹ создали Ρ‚Ρ€ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ схСму, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ DESCRIBE.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, Ρ‡Ρ‚ΠΎ Ρƒ вас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ MySQLConnection Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ connection, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ cursor.fetchall(). Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ всС строки ΠΈΠ· послСднСго Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°:

show_table_query = "DESCRIBE movies" with connection.cursor() as cursor:
cursor.execute(show_table_query)
# Fetch rows from last executed query result = cursor.fetchall()
for row in result:
print(row)

('id', 'int(11)', 'NO', 'PRI', None, 'auto_increment')
('title', 'varchar(100)', 'YES', '', None, '')
('release_year', 'year(4)', 'YES', '', None, '')
('genre', 'varchar(100)', 'YES', '', None, '')
('collection_in_mil', 'int(11)', 'YES', '', None, '')

ПослС выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ столбцах Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ movies. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ столбца выводится информация, ΠΎ Ρ‚ΠΈΠΏΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…, являСтся Π»ΠΈ столбСц ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ΠΈ Ρ‚. Π΄.

ИзмСнСниС схСмы Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ALTER

Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ† с ΠΈΠΌΠ΅Π½Π΅ΠΌ collection_in_mil Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ movies содСрТит кассовыС сборы Ρ„ΠΈΠ»ΡŒΠΌΠ° Π² ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π°Ρ… Π΄ΠΎΠ»Π»Π°Ρ€ΠΎΠ². ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ MySQL, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° collection_in_mil с INT Π½Π° DECIMAL:

ALTER TABLE movies MODIFY COLUMN collection_in_mil DECIMAL(4,1);

DECIMAL(4,1) ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° дСсятичноС число, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ максимум 4 Ρ†ΠΈΡ„Ρ€Ρ‹, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… 1 соотвСтствуСт разряду дСсятых, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 120.1, 3.4, 38.0 ΠΈ Ρ‚. Π΄.

alter_table_query = """
ALTER TABLE movies
MODIFY COLUMN collection_in_mil DECIMAL(4,1)
""" show_table_query = "DESCRIBE movies" with connection.cursor() as cursor:
cursor.execute(alter_table_query)
cursor.execute(show_table_query)
# ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ строки ΠΈΠ· послСднСго Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠ³ΠΎ запроса result = cursor.fetchall()
print("Π‘Ρ…Π΅ΠΌΠ° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ movie послС внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ:")
for row in result:
print(row)

Π‘Ρ…Π΅ΠΌΠ° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ movie послС внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ:
('id', 'int(11)', 'NO', 'PRI', None, 'auto_increment')
('title', 'varchar(100)', 'YES', '', None, '')
('release_year', 'year(4)', 'YES', '', None, '')
('genre', 'varchar(100)', 'YES', '', None, '')
('collection_in_mil', 'decimal(4,1)', 'YES', '', None, '')

Как ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ collection_in_mil смСнил Ρ‚ΠΈΠΏ Π½Π° DECIMAL(4,1). ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ Π΄Π²Π°ΠΆΠ΄Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ cursor.execute(), Π½ΠΎ cursor.fetchall() Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ строки Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· послСднСго Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠ³ΠΎ запроса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ являСтся show_table_query.

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ† с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° DROP

Для удалСния Ρ‚Π°Π±Π»ΠΈΡ† слуТит ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ DROP TABLE. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ― Π½Π΅ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌΡ‹ΠΉ процСсс. Если Π²Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ снова Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ запрос CREATE TABLE для Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ratings:

drop_table_query = "DROP TABLE ratings" with connection.cursor() as cursor:
cursor.execute(drop_table_query)

Вставка записСй Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

Π—Π°ΠΏΠΎΠ»Π½ΠΈΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим Π΄Π²Π° способа вставки записСй с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ MySQL Connector Π² ΠΊΠΎΠ΄Π΅ Python.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, .execute(), Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° количСство записСй Π½Π΅Π²Π΅Π»ΠΈΠΊΠΎ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ, .executemany() Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… сцСнариСв.

Вставка записСй с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ .execute()

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ cursor.execute(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ примСняли Π΄ΠΎ сих ΠΏΠΎΡ€. ПишСм запрос INSERT INTO ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π² cursor.execute():

insert_movies_query = """
INSERT INTO movies (title, release_year, genre, collection_in_mil)
VALUES
("Forrest Gump", 1994, "Drama", 330.2),
("3 Idiots", 2009, "Drama", 2.4),
("Eternal Sunshine of the Spotless Mind", 2004, "Drama", 34.5),
("Good Will Hunting", 1997, "Drama", 138.1),
("Skyfall", 2012, "Action", 304.6),
("Gladiator", 2000, "Action", 188.7),
("Black", 2005, "Drama", 3.0),
("Titanic", 1997, "Romance", 659.2),
("The Shawshank Redemption", 1994, "Drama",28.4),
("Udaan", 2010, "Drama", 1.5),
("Home Alone", 1990, "Comedy", 286.9),
("Casablanca", 1942, "Romance", 1.0),
("Avengers: Endgame", 2019, "Action", 858.8),
("Night of the Living Dead", 1968, "Horror", 2.5),
("The Godfather", 1972, "Crime", 135.6),
("Haider", 2014, "Action", 4.2),
("Inception", 2010, "Adventure", 293.7),
("Evil", 2003, "Horror", 1.3),
("Toy Story 4", 2019, "Animation", 434.9),
("Air Force One", 1997, "Drama", 138.1),
("The Dark Knight", 2008, "Action",535.4),
("Bhaag Milkha Bhaag", 2013, "Sport", 4.1),
("The Lion King", 1994, "Animation", 423.6),
("Pulp Fiction", 1994, "Crime", 108.8),
("Kai Po Che", 2013, "Sport", 6.0),
("Beasts of No Nation", 2015, "War", 1.4),
("Andadhun", 2018, "Thriller", 2.9),
("The Silence of the Lambs", 1991, "Crime", 68.2),
("Deadpool", 2016, "Action", 363.6),
("Drishyam", 2015, "Mystery", 3.0)
""" with connection.cursor() as cursor:
cursor.execute(insert_movies_query)
connection.commit()

Π’Π°Π±Π»ΠΈΡ†Π° movies Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π° Ρ‚Ρ€ΠΈΠ΄Ρ†Π°Ρ‚ΡŒΡŽ записями. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ΄ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ connection.commit(). НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ .commit() послС выполнСния Π»ΡŽΠ±Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅.

Вставка записСй с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ .executemany()

ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ годится, ΠΊΠΎΠ³Π΄Π° количСство записСй ΠΌΠ°Π»ΠΎ, ΠΈ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ· ΠΊΠΎΠ΄Π°. Но ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ хранятся Π² Ρ„Π°ΠΉΠ»Π΅ ΠΈΠ»ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠΌ сцСнариСм. Π’ΠΎΡ‚ Π³Π΄Π΅ пригодится .executemany(). ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

  1. Запрос, содСрТащий Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΠΈ для записСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ.
  2. Бписок записСй для вставки.

ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ для заполнСния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ reviewers:

insert_reviewers_query = """
INSERT INTO reviewers
(first_name, last_name)
VALUES ( %s, %s )
""" reviewers_records = [
("Chaitanya", "Baweja"),
("Mary", "Cooper"),
("John", "Wayne"),
("Thomas", "Stoneman"),
("Penny", "Hofstadter"),
("Mitchell", "Marsh"),
("Wyatt", "Skaggs"),
("Andre", "Veiga"),
("Sheldon", "Cooper"),
("Kimbra", "Masters"),
("Kat", "Dennings"),
("Bruce", "Wayne"),
("Domingo", "Cortes"),
("Rajesh", "Koothrappali"),
("Ben", "Glocker"),
("Mahinder", "Dhoni"),
("Akbar", "Khan"),
("Howard", "Wolowitz"),
("Pinkie", "Petit"),
("Gurkaran", "Singh"),
("Amy", "Farah Fowler"),
("Marlon", "Crafford"),
]
with connection.cursor() as cursor:
cursor.executemany(insert_reviewers_query,
reviewers_records)
connection.commit()

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ %s Π² качСствС Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π΅ΠΉ для Π΄Π²ΡƒΡ… строк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² insert_reviewers_query. Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ ΠΊΠ°ΠΊ спСцификаторы Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ мСсто для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π²Π½ΡƒΡ‚Ρ€ΠΈ строки.

Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ratings:

insert_ratings_query = """
INSERT INTO ratings
(rating, movie_id, reviewer_id)
VALUES ( %s, %s, %s)
""" ratings_records = [
(6.4, 17, 5), (5.6, 19, 1), (6.3, 22, 14), (5.1, 21, 17),
(5.0, 5, 5), (6.5, 21, 5), (8.5, 30, 13), (9.7, 6, 4),
(8.5, 24, 12), (9.9, 14, 9), (8.7, 26, 14), (9.9, 6, 10),
(5.1, 30, 6), (5.4, 18, 16), (6.2, 6, 20), (7.3, 21, 19),
(8.1, 17, 18), (5.0, 7, 2), (9.8, 23, 3), (8.0, 22, 9),
(8.5, 11, 13), (5.0, 5, 11), (5.7, 8, 2), (7.6, 25, 19),
(5.2, 18, 15), (9.7, 13, 3), (5.8, 18, 8), (5.8, 30, 15),
(8.4, 21, 18), (6.2, 23, 16), (7.0, 10, 18), (9.5, 30, 20),
(8.9, 3, 19), (6.4, 12, 2), (7.8, 12, 22), (9.9, 15, 13),
(7.5, 20, 17), (9.0, 25, 6), (8.5, 23, 2), (5.3, 30, 17),
(6.4, 5, 10), (8.1, 5, 21), (5.7, 22, 1), (6.3, 28, 4),
(9.8, 13, 1)
]
with connection.cursor() as cursor:
cursor.executemany(insert_ratings_query, ratings_records)
connection.commit()

Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС Ρ‚Ρ€ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг ― Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, ΠΊΠ°ΠΊ с этой Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ.

Π§Ρ‚Π΅Π½ΠΈΠ΅ записСй ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

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

Π§Ρ‚Π΅Π½ΠΈΠ΅ записСй с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° SELECT

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ записи, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π² cursor.execute() запрос SELECT ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ cursor.fetchall():

select_movies_query = "SELECT * FROM movies LIMIT 5" with connection.cursor() as cursor:
cursor.execute(select_movies_query)
result = cursor.fetchall()
for row in result:
print(row)

(1, 'Forrest Gump', 1994, 'Drama', Decimal('330.2'))
(2, '3 Idiots', 2009, 'Drama', Decimal('2.4'))
(3, 'Eternal Sunshine of the Spotless Mind', 2004, 'Drama', Decimal('34.5'))
(4, 'Good Will Hunting', 1997, 'Drama', Decimal('138.1'))
(5, 'Skyfall', 2012, 'Action', Decimal('304.6'))

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ result содСрТит записи, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ .fetchall(). Π­Ρ‚ΠΎ список ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ записи Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ запросС ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово LIMIT, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ количСство строк, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Ρ… ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° SELECT. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ LIMIT для Ρ€Π°Π·Π±ΠΈΠ²ΠΊΠΈ Π²Ρ‹Π΄Π°Ρ‡ΠΈ Π½Π° страницы ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… объСмов Π΄Π°Π½Π½Ρ‹Ρ….

Π’ MySQL ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ LIMIT ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΄Π²Π° Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… числовых Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°:

SELECT * FROM movies LIMIT 2,5;

ΠŸΡ€ΠΈ использовании Π΄Π²ΡƒΡ… числовых Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ смСщСниС, Ρ€Π°Π²Π½ΠΎΠ΅ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 2, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ количСство Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… строк Π΄ΠΎ 5. Π’ΠΎ Π΅ΡΡ‚ΡŒ запрос ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²Π΅Ρ€Π½Π΅Ρ‚ строки с 3 ΠΏΠΎ 7.

select_movies_query = "SELECT title, release_year FROM movies LIMIT 2, 5" with connection.cursor() as cursor:
cursor.execute(select_movies_query)
for row in cursor.fetchall():
print(row)

('Eternal Sunshine of the Spotless Mind', 2004)
('Good Will Hunting', 1997)
('Skyfall', 2012)
('Gladiator', 2000)
('Black', 2005)

Π€ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ WHERE

Записи Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ WHERE. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС Ρ„ΠΈΠ»ΡŒΠΌΡ‹ с кассовыми сборами ΡΠ²Ρ‹ΡˆΠ΅ 300 ΠΌΠ»Π½ Π΄ΠΎΠ»Π»Π°Ρ€ΠΎΠ², Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ запрос:

select_movies_query = """
SELECT title, collection_in_mil
FROM movies
WHERE collection_in_mil > 300
ORDER BY collection_in_mil DESC
""" with connection.cursor() as cursor:
cursor.execute(select_movies_query)
for movie in cursor.fetchall():
print(movie)

('Avengers: Endgame', Decimal('858.8'))
('Titanic', Decimal('659.2'))
('The Dark Knight', Decimal('535.4'))
('Toy Story 4', Decimal('434.9'))
('The Lion King', Decimal('423.6'))
('Deadpool', Decimal('363.6'))
('Forrest Gump', Decimal('330.2'))
('Skyfall', Decimal('304.6'))

БловосочСтаниС ORDER BY Π² запросС позволяСт ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сборы ΠΎΡ‚ самого высокого Π΄ΠΎ самого Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ.

MySQL прСдоставляСт мноТСство ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ форматирования строк, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ CONCAT для объСдинСния строк. НапримСр, названия Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ отобраТаСтся вмСстС с Π³ΠΎΠ΄ΠΎΠΌ выпуска. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ названия пяти самых ΠΏΡ€ΠΈΠ±Ρ‹Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ² вмСстС с Π΄Π°Ρ‚Π°ΠΌΠΈ ΠΈΡ… Π²Ρ‹Ρ…ΠΎΠ΄Π° Π² ΠΏΡ€ΠΎΠΊΠ°Ρ‚:

select_movies_query = """
SELECT CONCAT(title, " (", release_year, ")"),
collection_in_mil
FROM movies
ORDER BY collection_in_mil DESC
LIMIT 5
""" with connection.cursor() as cursor:
cursor.execute(select_movies_query)
for movie in cursor.fetchall():
print(movie)

('Avengers: Endgame (2019)', Decimal('858.8'))
('Titanic (1997)', Decimal('659.2'))
('The Dark Knight (2008)', Decimal('535.4'))
('Toy Story 4 (2019)', Decimal('434.9'))
('The Lion King (1994)', Decimal('423.6'))

Если Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ LIMIT ΠΈ Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ всС записи, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ курсора .fetchone() ΠΈ .fetchmany():

  • .fetchone() ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°, Π»ΠΈΠ±ΠΎ None, Ссли доступных строк большС Π½Π΅Ρ‚.
  • .fetchmany() ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€ строк ΠΈΠ· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π² Π²ΠΈΠ΄Π΅ списка ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ. Для этого Π΅ΠΌΡƒ пСрСдаСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π½Ρ‹ΠΉ 1. Если доступных строк большС Π½Π΅Ρ‚, ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ пустой список.

Π‘Π½ΠΎΠ²Π° ΠΈΠ·Π²Π»Π΅Ρ‡Π΅ΠΌ названия пяти самых кассовых Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ² с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π³ΠΎΠ΄Π° выпуска, Π½ΠΎ Π½Π° этот Ρ€Π°Π· ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ .fetchmany():

select_movies_query = """
SELECT CONCAT(title, " (", release_year, ")"),
collection_in_mil
FROM movies
ORDER BY collection_in_mil DESC
""" with connection.cursor() as cursor:
cursor.execute(select_movies_query)
for movie in cursor.fetchmany(size=5):
print(movie)
cursor.fetchall()

('Avengers: Endgame (2019)', Decimal('858.8'))
('Titanic (1997)', Decimal('659.2'))
('The Dark Knight (2008)', Decimal('535.4'))
('Toy Story 4 (2019)', Decimal('434.9'))
('The Lion King (1994)', Decimal('423.6'))

Π’Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² cursor.fetchall(). ΠœΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ это, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ всС ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Ρ‹ .fetchmany().

ΠŸΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π»ΡŽΠ±Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ соСдинСнии Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ всС Π½Π΅ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС вызываСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ InternalError.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ‚Π°Π±Π»ΠΈΡ† с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° JOIN

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ названия пяти Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ² с самым высоким Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΎΠΌ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ запрос:

select_movies_query = """
SELECT title, AVG(rating) as average_rating
FROM ratings
INNER JOIN movies
ON movies.id = ratings.movie_id
GROUP BY movie_id
ORDER BY average_rating DESC
LIMIT 5
""" with connection.cursor() as cursor:
cursor.execute(select_movies_query)
for movie in cursor.fetchall():
print(movie)

('Night of the Living Dead', Decimal('9.90000'))
('The Godfather', Decimal('9.90000'))
('Avengers: Endgame', Decimal('9.75000'))
('Eternal Sunshine of the Spotless Mind', Decimal('8.90000'))
('Beasts of No Nation', Decimal('8.70000'))

Найти имя Ρ€Π΅Ρ†Π΅Π½Π·Π΅Π½Ρ‚Π°, давшСго наибольшСС количСство ΠΎΡ†Π΅Π½ΠΎΠΊ, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊ:

select_movies_query = """
SELECT CONCAT(first_name, " ", last_name), COUNT(*) as num
FROM reviewers
INNER JOIN ratings
ON reviewers.id = ratings.reviewer_id
GROUP BY reviewer_id
ORDER BY num DESC
LIMIT 1
""" with connection.cursor() as cursor:
cursor.execute(select_movies_query)
for movie in cursor.fetchall():
print(movie)

('Mary Cooper', 4)

Как Π²ΠΈΠ΄ΠΈΠΌ, большС всСго Ρ€Π΅Ρ†Π΅Π½Π·ΠΈΠΉ написала Mary Cooper.

НС ΠΈΠΌΠ΅Π΅Ρ‚ значСния, насколько слоТСн запрос ― Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС ΠΎΠ½ обрабатываСтся сСрвСром MySQL. ΠŸΡ€ΠΎΡ†Π΅ΡΡ выполнСния запроса всСгда остаСтся ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌ: ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ запрос Π² cursor.execute(), ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ .fetchall().

ОбновлСниС ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ записСй ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ ΠΈ ΡƒΠ΄Π°Π»ΠΈΠΌ Ρ‡Π°ΡΡ‚ΡŒ записСй. НСобходимыС строки ΠΌΡ‹ Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова WHERE.

Команда UPDATE

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Ρ†Π΅Π½Π·Π΅Π½Ρ‚ Amy Farah Fowler Π²Ρ‹ΡˆΠ»Π° Π·Π°ΠΌΡƒΠΆ Π·Π° Sheldon Cooper. Она смСнила Ρ„Π°ΠΌΠΈΠ»ΠΈΡŽ Π½Π° Cooper, ΠΈ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…. Для обновлСния записСй Π² MySQL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ UPDATE:

update_query = """
UPDATE
reviewers
SET
last_name = "Cooper"
WHERE
first_name = "Amy"
""" with connection.cursor() as cursor:
cursor.execute(update_query)
connection.commit()

Код ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ запрос Π½Π° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π² cursor.execute(), Π° .commit() вносит Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ измСнСния Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ reviewers.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π΄Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Ρ†Π΅Π½Π·Π΅Π½Ρ‚Π°ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΡ†Π΅Π½ΠΊΠΈ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π½Π°Ρ‚ΡŒ movie_id, reviewer_id ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ rating. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° SQL:

UPDATE
ratings
SET
rating = 5.0 WHERE
movie_id = 18 AND reviewer_id = 15;

SELECT *
FROM ratings
WHERE
movie_id = 18 AND reviewer_id = 15;

Π£ΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ запросы сначала ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π²Π΅Π΄ΡƒΡ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ. НапишСм скрипт Π½Π° Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ†Π΅Π½ΠΊΠΈ:

modify_ratings.pyfrom getpass import getpass
from mysql.connector import connect, Error

movie_id = input("Enter movie id: ")
reviewer_id = input("Enter reviewer id: ")
new_rating = input("Enter new rating: ")
update_query = """
UPDATE
ratings
SET
rating = "%s"
WHERE
movie_id = "%s" AND reviewer_id = "%s";

SELECT *
FROM ratings
WHERE
movie_id = "%s" AND reviewer_id = "%s"
""" % (
new_rating,
movie_id,
reviewer_id,
movie_id,
reviewer_id,
)

try:
with connect(
host="localhost",
user=input("Enter username: "),
password=getpass("Enter password: "),
database="online_movie_rating",
) as connection:
with connection.cursor() as cursor:
for result in cursor.execute(update_query, multi=True):
if result.with_rows:
print(result.fetchall())
connection.commit()
except Error as e:
print(e)

Enter movie id: 18 Enter reviewer id: 15 Enter new rating: 5 Enter username: root
Enter password: Β·Β·Β·Β·Β·Β·Β·Β·

[(18, 15, Decimal('5.0'))]

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ нСсколько запросов ΠΎΠ΄Π½ΠΎΠΌΡƒ курсору, ΠΌΡ‹ присваиваСм Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ multi Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True. Π’ этом случаС cursor.execute() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π² ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ соотвСтствуСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ курсора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΡƒΡŽ Π² запросС. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ запускаСт Π½Π° этом ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ Ρ†ΠΈΠΊΠ» for, вызывая .fetchall() для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° курсора.

Если для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ Π±Ρ‹Π» ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ Π½Π°Π±ΠΎΡ€ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², Ρ‚ΠΎ .fetchall() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этой ошибки, Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ свойство cursor.with_rows, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, создавала Π»ΠΈ строки послСдняя выполнСнная опСрация.

Π₯отя этот ΠΊΠΎΠ΄ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΠΎΡΡ‚Π°Π²Π»Π΅Π½Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ, инструкция WHERE Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅ являСтся Π·Π°ΠΌΠ°Π½Ρ‡ΠΈΠ²ΠΎΠΉ Ρ†Π΅Π»ΡŒΡŽ для Ρ…Π°ΠΊΠ΅Ρ€ΠΎΠ². Она уязвима для Π°Ρ‚Π°ΠΊΠΈ с использованиСм SQL-ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°ΠΌ ΠΏΠΎΠ²Ρ€Π΅Π΄ΠΈΡ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π½Π΅ ΠΏΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ.

НапримСр, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ отправляСт movie_id = 18, reviewer_id = 15 ΠΈ rating = 5.0 Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

$ python modify_ratings.py
Enter movie id: 18 Enter reviewer id: 15 Enter new rating: 5.0 Enter username: <user_name>
Enter password:
[(18, 15, Decimal('5.0'))]

ΠžΡ†Π΅Π½ΠΊΠ° для movie_id = 18 ΠΈ reviewer_id = 15 измСнилась Π½Π° 5.0. Но Ссли Π±Ρ‹ Π²Ρ‹ Π±Ρ‹Π»ΠΈ Ρ…Π°ΠΊΠ΅Ρ€ΠΎΠΌ, Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π½Π° Π²Ρ…ΠΎΠ΄ ΡΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

$ python modify_ratings.py
Enter movie id: 18 Enter reviewer id: 15"; UPDATE reviewers SET last_name = "A
Enter new rating: 5.0 Enter username: <user_name>
Enter password:
[(18, 15, Decimal('5.0'))]

И снова Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ Π±Ρ‹Π» ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Π½Π° 5.0. Π§Ρ‚ΠΎ измСнилось?

Π₯Π°ΠΊΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΠ» запрос Π½Π° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…. Запрос Π½Π° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ last_name всСх записСй Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Ρ€Π΅Ρ†Π΅Π½Π·Π΅Π½Ρ‚ΠΎΠ² "A":

>>> select_query = """
... SELECT first_name, last_name
... FROM reviewers
... """ >>> with connection.cursor() as cursor:
... cursor.execute(select_query)
... for reviewer in cursor.fetchall():
... print(reviewer)
...
('Chaitanya', 'A')
('Mary', 'A')
('John', 'A')
('Thomas', 'A')
('Penny', 'A')
('Mitchell', 'A')
('Wyatt', 'A')
('Andre', 'A')
('Sheldon', 'A')
('Kimbra', 'A')
('Kat', 'A')
('Bruce', 'A')
('Domingo', 'A')
('Rajesh', 'A')
('Ben', 'A')
('Mahinder', 'A')
('Akbar', 'A')
('Howard', 'A')
('Pinkie', 'A')
('Gurkaran', 'A')
('Amy', 'A')
('Marlon', 'A')

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ first_name ΠΈ last_name для всСх записСй Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰ΠΈΡ…. Атака с использованиСм SQL-ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ²Ρ€Π΅Π΄ΠΈΠ»Π° эту Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² last_name всСх записСй Π½Π° Β«AΒ».

Π•ΡΡ‚ΡŒ быстроС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для прСдотвращСния Ρ‚Π°ΠΊΠΈΡ… Π°Ρ‚Π°ΠΊ. НС добавляйтС значСния запроса, прСдоставлСнныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π² строку запроса. Π›ΡƒΡ‡ΡˆΠ΅ ΠΎΠ±Π½ΠΎΠ»ΡΡ‚ΡŒ сцСнарий с ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ запроса Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² .execute():

modify_ratings.pyfrom getpass import getpass
from mysql.connector import connect, Error

movie_id = input("Enter movie id: ")
reviewer_id = input("Enter reviewer id: ")
new_rating = input("Enter new rating: ")
update_query = """
UPDATE
ratings
SET
rating = %s
WHERE
movie_id = %s AND reviewer_id = %s;

SELECT *
FROM ratings
WHERE
movie_id = %s AND reviewer_id = %s
""" val_tuple = (
new_rating,
movie_id,
reviewer_id,
movie_id,
reviewer_id,
)

try:
with connect(
host="localhost",
user=input("Enter username: "),
password=getpass("Enter password: "),
database="online_movie_rating",
) as connection:
with connection.cursor() as cursor:
for result in cursor.execute(update_query, val_tuple, multi=True):
if result.with_rows:
print(result.fetchall())
connection.commit()
except Error as e:
print(e)

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ плСйсхолдСры %s большС Π½Π΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² строковыС ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ. cursor.execute() провСряСт, Ρ‡Ρ‚ΠΎ значСния Π² ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΌ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…. Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ попытаСтся ввСсти ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹Π΅ символы, ΠΊΠΎΠ΄ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅:

$ python modify_ratings.py
Enter movie id: 18 Enter reviewer id: 15"; UPDATE reviewers SET last_name = "A
Enter new rating: 5.0 Enter username: <user_name>
Enter password:
1292 (22007): Truncated incorrect DOUBLE value: '15";
UPDATE reviewers SET last_name = "A'

Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всСгда, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚Π΅ Π² запрос ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²Π²ΠΎΠ΄. НС ΠΏΠΎΠ»Π΅Π½ΠΈΡ‚Π΅ΡΡŒ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ способы прСдотвращСния Π°Ρ‚Π°ΠΊ с использованиСм SQL-ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΉ.

УдалСниС записСй: команда DELETE

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° удалСния записСй ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° ΠΈΡ… ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ DELETE являСтся Π½Π΅ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ, ΠΌΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ сначала Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ запрос SELECT с Ρ‚Π΅ΠΌ ΠΆΠ΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ удаляСтС Π½ΡƒΠΆΠ½Ρ‹Π΅ записи. НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всС ΠΎΡ†Π΅Π½ΠΊΠΈ Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ², Π΄Π°Π½Π½Ρ‹Π΅ reviewer_id = 2, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ сначала Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ запрос SELECT:

select_movies_query = """
SELECT reviewer_id, movie_id FROM ratings
WHERE reviewer_id = 2
""" with connection.cursor() as cursor:
cursor.execute(select_movies_query)
for movie in cursor.fetchall():
print(movie)

(2, 7)
(2, 8)
(2, 12)
(2, 23)

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠ°Ρ€Ρ‹ reviewer_id ΠΈ movie_id для записСй Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΎΡ†Π΅Π½ΠΎΠΊ, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… reviewer_id = 2. УбСдившись, Ρ‡Ρ‚ΠΎ это Ρ‚Π΅ записи, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ запрос DELETE с Ρ‚Π΅ΠΌ ΠΆΠ΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠΌ:

delete_query = "DELETE FROM ratings WHERE reviewer_id = 2" with connection.cursor() as cursor:
cursor.execute(delete_query)
connection.commit()

Π”Ρ€ΡƒΠ³ΠΈΠ΅ способы соСдинСния Python ΠΈ MySQL

Π’ этом руководствС ΠΌΡ‹ познакомились с MySQL Connector/Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹ΠΌ срСдством взаимодСйствия с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… MySQL ΠΈΠ· прилоТСния Python. Π’ΠΎΡ‚ Π΅Ρ‰Π΅ ΠΏΠ°Ρ€Π° популярных ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ²:

  • mysqlclient ― Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, которая являСтся ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚ΠΎΠΌ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ дополняСтся Π½ΠΎΠ²Ρ‹ΠΌΠΈ функциями. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ядро Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ написано Π½Π° C, ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Ρ‡Π΅ΠΌ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€ Π½Π° чистом Python. Π‘ΠΎΠ»ΡŒΡˆΠΎΠΉ нСдостаток состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ mysqlclient довольно слоТно Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ, особСнно Π² Windows.
  • MySQLdb ― ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎ сих ΠΏΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² коммСрчСских прилоТСниях. Написано Π½Π° C ΠΈ быстрСС MySQL Connector/Python, Π½ΠΎ доступно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Python 2.

Π­Ρ‚ΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚, ΠΊΠ°ΠΊ интСрфСйсы ΠΌΠ΅ΠΆΠ΄Ρƒ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ ΠΈ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… MySQL. ЀактичСски Π²Ρ‹ просто отправляСтС Ρ‡Π΅Ρ€Π΅Π· Π½ΠΈΡ… свои SQL-запросы. Но ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для управлСния Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π½Π΅ SQL-запросы, Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡƒ.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-рСляционноС ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (ORM) β€” ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ язык. ORM-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° инкапсулируСт ΠΊΠΎΠ΄, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ для управлСния Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, освобоТдая Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΎΡ‚ нСобходимости ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ SQL-запросы. Π’ΠΎΡ‚ самыС популярныС ORM-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для связки Python ΠΈ SQL:

  • SQLAlchemy ― это ORM, которая ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ взаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ Python ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… SQL. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Π΄Π²ΠΈΠΆΠΊΠΈ для Ρ€Π°Π·Π½Ρ‹Ρ… Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ MySQL, PostgreSQL, SQLite ΠΈ Ρ‚. Π΄. Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ наш Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π» ΠΏΠΎ SQLAlchemy.
  • peewee ― лСгкая ΠΈ быстрая ORM-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° с простой настройкой, Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° вашС взаимодСйствиС с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ограничиваСтся ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… записСй. Если Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ записи ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… MySQL Π² csv-Ρ„Π°ΠΉΠ», Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠΈΠΉ Π²Ρ‹Π±ΠΎΡ€ ― peewee.
  • Django ORM ― ΠΎΠ΄Π½Π° ΠΈΠ· самых ΠΌΠΎΡ‰Π½Ρ‹Ρ… ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Π²Π΅Π±-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Django, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ простым ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… SQLite, PostgreSQL ΠΈ MySQL. МногиС прилоТСния Π½Π° основС Django ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Django ORM для модСлирования Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… запросов, ΠΎΠ΄Π½Π°ΠΊΠΎ для Π±ΠΎΠ»Π΅Π΅ слоТных Π·Π°Π΄Π°Ρ‡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ SQLAlchemy.

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

Π’ этом руководствС ΠΌΡ‹ познакомились с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ MySQL Connector/Python для ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… MySQL Π² вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Python. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ тСстовый ΠΎΠ±Ρ€Π°Π·Π΅Ρ† Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… MySQL ΠΈ повзаимодСйствовали с Π½Π΅ΠΉ нСпосрСдствСнно ΠΈΠ· Python-ΠΊΠΎΠ΄Π°. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Python ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ ΠΈ для Π΄Ρ€ΡƒΠ³ΠΈΡ… Π‘Π£Π‘Π”, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ MongoDB ΠΈ PostgreSQL. Π‘ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π΄Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Π΅Ρ‰Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΏΠΎ Python ΠΈ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π²Π°ΠΌ Π±Ρ‹Π»ΠΈ Π±Ρ‹ интСрСсны.

Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π½Π° ΠΊΠ°Π½Π°Π»Π°Ρ… Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста» ΠΈ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° data scientist’а».

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

Автор: Leo Matyushkin