{"id":314386,"date":"2020-12-06T03:00:43","date_gmt":"2020-12-06T03:00:43","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=314386"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=314386","title":{"rendered":"\u041d\u0435\u043c\u043d\u043e\u0433\u043e SQL \u0430\u043b\u0445\u0438\u043c\u0438\u0438"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\u041e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 SQLAlchemy \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0421\u0423\u0411\u0414 \u0438\u0437 Python \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0435\u0439. \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043e\u0431\u0437\u043e\u0440 \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c ORM \u0438 SQL \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432. \u0414\u0430\u043d\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u043a\u0443\u043d\u0443\u0442\u044c\u0441\u044f \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 SQLAlchemy, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 SQLAlchemy \u043d\u0430 \u043c\u043e\u0439 \u0441\u043a\u0440\u043e\u043c\u043d\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0442\u044f\u0436\u0435\u043b\u0430 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/hp\/9s\/wz\/hp9swz2dqq-oz9rrlho3wqstaze.jpeg\" alt=\"image\"><\/p>\n<p>  \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u0441\u0435\u0431\u0435: \u044f \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043f\u0440\u043e\u0445\u043e\u0436\u0443 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u043a\u0443\u0440\u0441\u0443 \u00abPython \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u00bb. \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0431\u044b\u043b \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0435 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0414\u0417, \u0430 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0441\u0430\u043c\u043e\u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f. \u041c\u043e\u0439 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0438\u0432\u043d\u044b\u043c, \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0447\u0435\u043c \u043f\u0440\u043e\u0448\u0443 \u043d\u0435 \u0441\u0442\u0435\u0441\u043d\u044f\u0442\u044c\u0441\u044f \u0438 \u0441\u0432\u043e\u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \u0415\u0441\u043b\u0438 \u044f \u0432\u0430\u0441 \u0435\u0449\u0435 \u043d\u0435 \u043d\u0430\u043f\u0443\u0433\u0430\u043b, \u043f\u0440\u043e\u0448\u0443 \u043f\u043e\u0434 \u043a\u0430\u0442 \ud83d\ude42<br \/>  <a name=\"habracut\"><\/a><br \/>  \u041c\u044b \u0441 \u0432\u0430\u043c\u0438 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0439 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435, \u0434\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f 3\u041d\u0424 (<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F_%D0%BD%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0\" rel=\"nofollow\">\u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u044b<\/a>). <br \/>  \u0418\u0437 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b:  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438<\/b>                         <\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/u0\/wv\/sk\/u0wvsk6b6jhbfn0vfduygn7ipe8.jpeg\" alt=\"image\">  <\/div>\n<\/p><\/div>\n<p>  \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u0411\u0414:  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u0445\u0435\u043c\u0430 \u0441\u0432\u044f\u0437\u0435\u0439 \u0411\u0414<\/b>                         <\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/kw\/re\/wb\/kwrewbe0dox6puuu1v0emxxwymu.jpeg\" alt=\"image\">  <\/div>\n<\/p><\/div>\n<p>  \u0414\u043b\u044f \u043d\u0435\u0442\u0435\u0440\u043f\u0435\u043b\u0438\u0432\u044b\u0445: \u043a\u043e\u0434, \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 <a href=\"https:\/\/github.com\/Yuribtr\/py-homeworks-db-6\" rel=\"nofollow\">\u044d\u0442\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>. \u0418\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f <a href=\"https:\/\/dbdiagram.io\/d\/5faeec7e3a78976d7b7bd7b5\" rel=\"nofollow\">\u0441\u0445\u0435\u043c\u0430 \u0411\u0414 \u0437\u0434\u0435\u0441\u044c<\/a>. \u0428\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430 \u043f\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044e ORM \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  \u0414\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u043e \u00ab\u0422\u0430\u0431\u043b\u0438\u0446\u0430\u00bb \u0432\u043c\u0435\u0441\u0442\u043e \u00ab\u041e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435\u00bb, \u0438 \u0441\u043b\u043e\u0432\u043e \u00ab\u041f\u043e\u043b\u0435\u00bb \u0432\u043c\u0435\u0441\u0442\u043e \u00ab\u0410\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u00bb. \u041f\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044e \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441 \u043c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0411\u0414, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0432 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0444\u043e\u0440\u043c\u0430\u0442 CSV) \u0438\u043c\u0435\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u044f (track, genre, musician, album, length, album_year, collection, collection_year). \u0421\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0442\u0430\u043a\u0438\u0435:<br \/>   \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0443\u0437\u044b\u043a\u0430\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0442\u044c \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0436\u0430\u043d\u0440\u0430\u0445, \u043a\u0430\u043a \u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u0436\u0430\u043d\u0440\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0443\u0437\u044b\u043a\u0430\u043d\u0442\u043e\u0432 (\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c).<br \/>   \u2014 \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0430\u043b\u044c\u0431\u043e\u043c\u0430 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0443\u0437\u044b\u043a\u0430\u043d\u0442\u043e\u0432 (\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c).<br \/>   \u2014 \u0442\u0440\u0435\u043a \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0430\u043b\u044c\u0431\u043e\u043c\u0443 (\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043e\u0434\u0438\u043d \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c)<br \/>   \u2014 \u0442\u0440\u0435\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432 \u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0431\u043e\u0440\u043d\u0438\u043a\u043e\u0432 (\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c)<br \/>   \u2014 \u0442\u0440\u0435\u043a \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0438 \u0432 \u043e\u0434\u043d\u0443 \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.<\/p>\n<p>  \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0447\u0442\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0436\u0430\u043d\u0440\u043e\u0432, \u0438\u043c\u0435\u043d\u0430 \u043c\u0443\u0437\u044b\u043a\u0430\u043d\u0442\u043e\u0432, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0430\u043b\u044c\u0431\u043e\u043c\u043e\u0432 \u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442\u0441\u044f. \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0435\u043a\u043e\u0432 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f. \u0412 \u0411\u0414 \u043c\u044b \u0437\u0430\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 8 \u0442\u0430\u0431\u043b\u0438\u0446:<br \/>   \u2014 genres (\u0436\u0430\u043d\u0440\u044b)<br \/>   \u2014 genres_musicians (\u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430)<br \/>   \u2014 musicians (\u043c\u0443\u0437\u044b\u043a\u0430\u043d\u0442\u044b)<br \/>   \u2014 albums_musicians (\u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430)<br \/>   \u2014 albums (\u0430\u043b\u044c\u0431\u043e\u043c\u044b)<br \/>   \u2014 tracks (\u0442\u0440\u0435\u043a\u0438)<br \/>   \u2014 collections_tracks (\u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430)<br \/>   \u2014 collections (\u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438)<br \/>  * \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u0430\u044f, \u0432\u0437\u044f\u0442\u0430 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0414\u0417, \u0432 \u043d\u0435\u0439 \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435\u0442 \u0441\u0432\u044f\u0437\u0438 \u0442\u0440\u0435\u043a\u043e\u0432 \u0441 \u043c\u0443\u0437\u044b\u043a\u0430\u043d\u0442\u043e\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0440\u0435\u043a\u0430 \u0441 \u0436\u0430\u043d\u0440\u043e\u043c. \u041d\u043e \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u043e \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 \u043c\u044b \u043e\u043f\u0443\u0441\u0442\u0438\u043c \u044d\u0442\u043e\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a.<\/p>\n<p>  \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u0434\u0432\u0435 \u0411\u0414 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c Postgres: \u00abTestSQL\u00bb \u0438 \u00abTestORM\u00bb, \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0438\u043c: \u043b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c test. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434!<\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/h2>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0411\u0414<\/b>                         <\/p>\n<div class=\"spoiler_text\">* \u043a\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 read_data \u0438 clear_db \u0435\u0441\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/Yuribtr\/py-homeworks-db-6\/blob\/master\/inc\/utils.py\" rel=\"nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>.  <\/p>\n<pre><code class=\"python\">DSN_SQL = 'postgresql:\/\/test:test@localhost:5432\/TestSQL'     DSN_ORM = 'postgresql:\/\/test:test@localhost:5432\/TestORM'     # \u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 CSV \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u044f.     DATA = read_data('data\/demo-data.csv')      print('Connecting to DB\\'s...')     # \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0441\u0435\u0441\u0441\u0438\u044f\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0411\u0414.     engine_orm = sa.create_engine(DSN_ORM)     Session_ORM = sessionmaker(bind=engine_orm)     session_orm = Session_ORM()      engine_sql = sa.create_engine(DSN_SQL)     Session_SQL = sessionmaker(bind=engine_sql)     session_sql = Session_SQL()      print('Clearing the bases...')     # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u0437 \u0411\u0414 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043b\u0438\u0432\u043a\u043e\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0443\u0447\u0435\u0431\u044b.     clear_db(sa, engine_sql)     clear_db(sa, engine_orm)<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0443\u0442\u0435\u043c \u0447\u0435\u0440\u0435\u0437 SQL<\/b>                         <\/p>\n<div class=\"spoiler_text\">* \u043a\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 read_query \u0435\u0441\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/Yuribtr\/py-homeworks-db-6\/blob\/master\/inc\/utils.py\" rel=\"nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>. \u0422\u0435\u043a\u0441\u0442\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/Yuribtr\/py-homeworks-db-6\/tree\/master\/queries\" rel=\"nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>.  <\/p>\n<pre><code class=\"python\">print('\\nPreparing data for SQL job...')     print('Creating empty tables...')     session_sql.execute(read_query('queries\/create-tables.sql'))     session_sql.commit()      print('\\nAdding musicians...')     query = read_query('queries\/insert-musicians.sql')     res = session_sql.execute(query.format(','.join({f&quot;('{x['musician']}')&quot; for x in DATA})))     print(f'Inserted {res.rowcount} musicians.')      print('\\nAdding genres...')     query = read_query('queries\/insert-genres.sql')     res = session_sql.execute(query.format(','.join({f&quot;('{x['genre']}')&quot; for x in DATA})))     print(f'Inserted {res.rowcount} genres.')      print('\\nLinking musicians with genres...')     # assume that musician + genre has to be unique     genres_musicians = {x['musician'] + x['genre']: [x['musician'], x['genre']] for x in DATA}     query = read_query('queries\/insert-genre-musician.sql')     # this query can't be run in batch, so execute one by one     res = 0     for key, value in genres_musicians.items():         res += session_sql.execute(query.format(value[1], value[0])).rowcount     print(f'Inserted {res} connections.')      print('\\nAdding albums...')     # assume that albums has to be unique     albums = {x['album']: x['album_year'] for x in DATA}     query = read_query('queries\/insert-albums.sql')     res = session_sql.execute(query.format(','.join({f&quot;('{x}', '{y}')&quot; for x, y in albums.items()})))     print(f'Inserted {res.rowcount} albums.')      print('\\nLinking musicians with albums...')     # assume that musicians + album has to be unique     albums_musicians = {x['musician'] + x['album']: [x['musician'], x['album']] for x in DATA}     query = read_query('queries\/insert-album-musician.sql')     # this query can't be run in batch, so execute one by one     res = 0     for key, values in albums_musicians.items():         res += session_sql.execute(query.format(values[1], values[0])).rowcount     print(f'Inserted {res} connections.')      print('\\nAdding tracks...')     query = read_query('queries\/insert-track.sql')     # this query can't be run in batch, so execute one by one     res = 0     for item in DATA:         res += session_sql.execute(query.format(item['track'], item['length'], item['album'])).rowcount     print(f'Inserted {res} tracks.')      print('\\nAdding collections...')     query = read_query('queries\/insert-collections.sql')     res = session_sql.execute(query.format(','.join({f&quot;('{x['collection']}', {x['collection_year']})&quot; for x in DATA if x['collection'] and x['collection_year']})))     print(f'Inserted {res.rowcount} collections.')      print('\\nLinking collections with tracks...')     query = read_query('queries\/insert-collection-track.sql')     # this query can't be run in batch, so execute one by one     res = 0     for item in DATA:         res += session_sql.execute(query.format(item['collection'], item['track'])).rowcount     print(f'Inserted {res} connections.')     session_sql.commit()<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041f\u043e \u0441\u0443\u0442\u0438 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0438 (\u0436\u0430\u043d\u0440\u044b, \u043c\u0443\u0437\u044b\u043a\u0430\u043d\u0442\u043e\u0432, \u0430\u043b\u044c\u0431\u043e\u043c\u044b, \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438), \u0430 \u0437\u0430\u0442\u0435\u043c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0441\u0442\u0440\u043e\u0438\u043c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u043e\u0434 \u0438 \u0432\u0438\u0434\u0438\u043c \u0447\u0442\u043e \u0411\u0414 \u0441\u043e\u0437\u0434\u0430\u043b\u0430\u0441\u044c. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c commit() \u0443 \u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u043d\u043e \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c ORM \u043f\u043e\u0434\u0445\u043e\u0434\u0430. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 ORM \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c 8 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 (\u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043d\u0430 \u043a\u0430\u0436\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443).  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u041a\u043e\u0434 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 <a href=\"https:\/\/github.com\/Yuribtr\/py-homeworks-db-6\/blob\/master\/inc\/db_classes.py\" rel=\"nofollow\">\u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/a>.  <\/p>\n<pre><code class=\"python\">Base = declarative_base()   class Genre(Base):     __tablename__ = 'genres'     id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)     name = sa.Column(sa.String(20), unique=True)     # \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u043a Musician \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 genres_musicians     musicians = relationship(&quot;Musician&quot;, secondary='genres_musicians')   class Musician(Base):     __tablename__ = 'musicians'     id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)     name = sa.Column(sa.String(50), unique=True)     # \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u043a Genre \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 genres_musicians     genres = relationship(&quot;Genre&quot;, secondary='genres_musicians')     # \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u043a Album \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 albums_musicians     albums = relationship(&quot;Album&quot;, secondary='albums_musicians')   class GenreMusician(Base):     __tablename__ = 'genres_musicians'     # \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u043a\u043b\u044e\u0447, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u043b\u0435\u0439     __table_args__ = (PrimaryKeyConstraint('genre_id', 'musician_id'),)     # \u0412 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u044f \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438     genre_id = sa.Column(sa.Integer, sa.ForeignKey('genres.id'))     musician_id = sa.Column(sa.Integer, sa.ForeignKey('musicians.id'))   class Album(Base):     __tablename__ = 'albums'     id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)     name = sa.Column(sa.String(50), unique=True)     year = sa.Column(sa.Integer)     # \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u043a Musician \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 albums_musicians     musicians = relationship(&quot;Musician&quot;, secondary='albums_musicians')   class AlbumMusician(Base):     __tablename__ = 'albums_musicians'     # \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u043a\u043b\u044e\u0447, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u043b\u0435\u0439     __table_args__ = (PrimaryKeyConstraint('album_id', 'musician_id'),)     # \u0412 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u044f \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438     album_id = sa.Column(sa.Integer, sa.ForeignKey('albums.id'))     musician_id = sa.Column(sa.Integer, sa.ForeignKey('musicians.id'))   class Track(Base):     __tablename__ = 'tracks'     id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)     name = sa.Column(sa.String(100))     length = sa.Column(sa.Integer)     # \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e \u043f\u043e\u043b\u044e album_id \u0438\u0434\u0435\u0442 \u0441\u0432\u044f\u0437\u044c \u043e\u0434\u0438\u043d \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0435\u0439 \u044d\u0442\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u043b\u044e\u0447     album_id = sa.Column(sa.Integer, ForeignKey('albums.id'))     # \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u043a Collection \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 collections_tracks     collections = relationship(&quot;Collection&quot;, secondary='collections_tracks')   class Collection(Base):     __tablename__ = 'collections'     id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)     name = sa.Column(sa.String(50))     year = sa.Column(sa.Integer)     # \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u043a Track \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 collections_tracks     tracks = relationship(&quot;Track&quot;, secondary='collections_tracks')   class CollectionTrack(Base):     __tablename__ = 'collections_tracks'     # \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u043a\u043b\u044e\u0447, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u043b\u0435\u0439     __table_args__ = (PrimaryKeyConstraint('collection_id', 'track_id'),)     # \u0412 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u044f \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438     collection_id = sa.Column(sa.Integer, sa.ForeignKey('collections.id'))     track_id = sa.Column(sa.Integer, sa.ForeignKey('tracks.id'))<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 Base \u0434\u043b\u044f \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u0442\u0438\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446 \u0438 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0435\u0433\u043e. \u0412\u0441\u044f \u043c\u0430\u0433\u0438\u044f \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 relationship \u0438 ForeignKey. \u0412 \u043a\u043e\u0434\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043a\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u043a\u043e\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c relationship \u0441 \u043e\u0431\u0435\u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d \u0441\u0432\u044f\u0437\u0438 \u00ab\u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c\u00bb.<\/p>\n<p>  \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c ORM \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0443\u0442\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0430:  <\/p>\n<pre><code class=\"python\">Base.metadata.create_all(engine_orm)<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>\u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0433\u0438\u044f, <b>\u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0432\u0441\u0435 \u043a\u043b\u0430\u0441\u0441\u044b<\/b>, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u043a\u043e\u0434\u0435 \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442 Base \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438. \u0421\u0445\u043e\u0434\u0443 \u044f \u043d\u0435 \u0443\u0432\u0438\u0434\u0435\u043b \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043a\u0430\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0435\u0439\u0447\u0430\u0441, \u0430 \u043a\u0430\u043a\u0438\u0435 \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0437\u0436\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0411\u0414). \u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0435\u0441\u0442\u044c, \u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435 \u0432\u0441\u0435 \u043a\u043b\u0430\u0441\u0441\u044b-\u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0438 Base \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u043c\u043e\u043c\u0435\u043d\u0442\u043d\u043e, \u0438\u043c\u0435\u0439\u0442\u0435 \u044d\u0442\u043e \u0432\u0432\u0438\u0434\u0443.<\/p><\/blockquote>\n<p>  \u041d\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 ORM \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 ORM<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">    print('\\nPreparing data for ORM job...')     for item in DATA:         # \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0436\u0430\u043d\u0440\u044b         genre = session_orm.query(Genre).filter_by(name=item['genre']).scalar()         if not genre:             genre = Genre(name=item['genre'])         session_orm.add(genre)          # \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u0443\u0437\u044b\u043a\u0430\u043d\u0442\u043e\u0432         musician = session_orm.query(Musician).filter_by(name=item['musician']).scalar()         if not musician:             musician = Musician(name=item['musician'])         musician.genres.append(genre)         session_orm.add(musician)          # \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0430\u043b\u044c\u0431\u043e\u043c\u044b         album = session_orm.query(Album).filter_by(name=item['album']).scalar()         if not album:             album = Album(name=item['album'], year=item['album_year'])         album.musicians.append(musician)         session_orm.add(album)          # \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0440\u0435\u043a\u0438         # \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u043a \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u043d\u043e \u0438 \u043f\u043e \u0430\u043b\u044c\u0431\u043e\u043c\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043c\u044f \u0442\u0440\u0435\u043a\u0430 \u043f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u043c\u043e\u0436\u0435\u0442         # \u0431\u044b\u0442\u044c \u043d\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e         track = session_orm.query(Track).join(Album).filter(and_(Track.name == item['track'],                                                                  Album.name == item['album'])).scalar()         if not track:             track = Track(name=item['track'], length=item['length'])         track.album_id = album.id         session_orm.add(track)          # \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0447\u0442\u043e \u0442\u0440\u0435\u043a \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0438 \u0432 \u043e\u0434\u043d\u0443 \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e         if item['collection']:             collection = session_orm.query(Collection).filter_by(name=item['collection']).scalar()             if not collection:                 collection = Collection(name=item['collection'], year=item['collection_year'])             collection.tracks.append(track)             session_orm.add(collection)         session_orm.commit()<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0448\u0442\u0443\u0447\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a (\u0436\u0430\u043d\u0440\u044b, \u043c\u0443\u0437\u044b\u043a\u0430\u043d\u0442\u044b, \u0430\u043b\u044c\u0431\u043e\u043c\u044b, \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438). \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 SQL \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0417\u0430\u0442\u043e \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u044f\u0432\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u043d\u0435 \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c, \u0437\u0430 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b SQLAlchemy.<\/p>\n<h2>\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0431\u0430\u0437\u0430\u043c<\/h2>\n<p>  \u041f\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044e \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c 15 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u0431\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 SQL \u0438 ORM. \u0412\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438:<br \/>   1. \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u0433\u043e\u0434 \u0432\u044b\u0445\u043e\u0434\u0430 \u0430\u043b\u044c\u0431\u043e\u043c\u043e\u0432, \u0432\u044b\u0448\u0435\u0434\u0448\u0438\u0445 \u0432 2018 \u0433\u043e\u0434\u0443;<br \/>   2. \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u043a\u0430;<br \/>   3. \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u043a\u043e\u0432, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 3,5 \u043c\u0438\u043d\u0443\u0442\u044b;<br \/>   4. \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0441\u0431\u043e\u0440\u043d\u0438\u043a\u043e\u0432, \u0432\u044b\u0448\u0435\u0434\u0448\u0438\u0445 \u0432 \u043f\u0435\u0440\u0438\u043e\u0434 \u0441 2018 \u043f\u043e 2020 \u0433\u043e\u0434 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e;<br \/>   5. \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438, \u0447\u044c\u0435 \u0438\u043c\u044f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 1 \u0441\u043b\u043e\u0432\u0430;<br \/>   6. \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0441\u043b\u043e\u0432\u043e \u00ab\u043c\u043e\u0439\u00bb\/\u00abmy\u00bb.<br \/>   7. \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0435\u0439 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0436\u0430\u043d\u0440\u0435;<br \/>   8. \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0440\u0435\u043a\u043e\u0432, \u0432\u043e\u0448\u0435\u0434\u0448\u0438\u0445 \u0432 \u0430\u043b\u044c\u0431\u043e\u043c\u044b 2019-2020 \u0433\u043e\u0434\u043e\u0432;<br \/>   9. \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0442\u0440\u0435\u043a\u043e\u0432 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0430\u043b\u044c\u0431\u043e\u043c\u0443;<br \/>   10. \u0432\u0441\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0430\u043b\u044c\u0431\u043e\u043c\u044b \u0432 2020 \u0433\u043e\u0434\u0443;<br \/>   11. \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0441\u0431\u043e\u0440\u043d\u0438\u043a\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c;<br \/>   12. \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0430\u043b\u044c\u0431\u043e\u043c\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 1 \u0436\u0430\u043d\u0440\u0430;<br \/>   13. \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0432\u0445\u043e\u0434\u044f\u0442 \u0432 \u0441\u0431\u043e\u0440\u043d\u0438\u043a\u0438;<br \/>   14. \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f(-\u0435\u0439), \u043d\u0430\u043f\u0438\u0441\u0430\u0432\u0448\u0435\u0433\u043e \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043f\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0435\u043a (\u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0430\u043a\u0438\u0445 \u0442\u0440\u0435\u043a\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e);<br \/>   15. \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0430\u043b\u044c\u0431\u043e\u043c\u043e\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0440\u0435\u043a\u043e\u0432.<br \/>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u0432\u044b\u0448\u0435\u0438\u0437\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044e\u0442 \u043a\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0442\u0430\u043a \u0438 \u0441 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>  \u041d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438\u0437 15 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0434\u0432\u0443\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f SQL \u0438 ORM). \u0412 \u043a\u043e\u0434\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u0434\u0443\u0442 \u043f\u0430\u0440\u0430\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043d\u0430 \u0432\u044b\u0432\u043e\u0434\u0435 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c.   <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u0438\u0445 \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">    print('\\n1. All albums from 2018:')     query = read_query('queries\/select-album-by-year.sql').format(2018)     print(f'############################\\n{query}\\n############################')     print('----SQL way---')     res = session_sql.execute(query)     print(*res, sep='\\n')     print('----ORM way----')     for item in session_orm.query(Album).filter_by(year=2018):         print(item.name)      print('\\n2. Longest track:')     query = read_query('queries\/select-longest-track.sql')     print(f'############################\\n{query}\\n############################')     print('----SQL way---')     res = session_sql.execute(query)     print(*res, sep='\\n')     print('----ORM way----')     for item in session_orm.query(Track).order_by(Track.length.desc()).slice(0, 1):         print(f'{item.name}, {item.length}')      print('\\n3. Tracks with length not less 3.5min:')     query = read_query('queries\/select-tracks-over-length.sql').format(310)     print(f'############################\\n{query}\\n############################')     print('----SQL way---')     res = session_sql.execute(query)     print(*res, sep='\\n')     print('----ORM way----')     for item in session_orm.query(Track).filter(310 &lt;= Track.length).order_by(Track.length.desc()):         print(f'{item.name}, {item.length}')      print('\\n4. Collections between 2018 and 2020 years (inclusive):')     query = read_query('queries\/select-collections-by-year.sql').format(2018, 2020)     print(f'############################\\n{query}\\n############################')     print('----SQL way---')     res = session_sql.execute(query)     print(*res, sep='\\n')     print('----ORM way----')     for item in session_orm.query(Collection).filter(2018 &lt;= Collection.year,                                                      Collection.year &lt;= 2020):         print(item.name)      print('\\n5. Musicians with name that contains not more 1 word:')     query = read_query('queries\/select-musicians-by-name.sql')     print(f'############################\\n{query}\\n############################')     print('----SQL way---')     res = session_sql.execute(query)     print(*res, sep='\\n')     print('----ORM way----')     for item in session_orm.query(Musician).filter(Musician.name.notlike('%% %%')):         print(item.name)      print('\\n6. Tracks that contains word &quot;me&quot; in name:')     query = read_query('queries\/select-tracks-by-name.sql').format('me')     print(f'############################\\n{query}\\n############################')     print('----SQL way---')     res = session_sql.execute(query)     print(*res, sep='\\n')     print('----ORM way----')     for item in session_orm.query(Track).filter(Track.name.like('%%me%%')):         print(item.name)      print('Ok, let\\'s start serious work')      print('\\n7. How many musicians plays in each genres:')     query = read_query('queries\/count-musicians-by-genres.sql')     print(f'############################\\n{query}\\n############################')     print('----SQL way---')     res = session_sql.execute(query)     print(*res, sep='\\n')     print('----ORM way----')     for item in session_orm.query(Genre).join(Genre.musicians).order_by(func.count(Musician.id).desc()).group_by(             Genre.id):         print(f'{item.name}, {len(item.musicians)}')      print('\\n8. How many tracks in all albums 2019-2020:')     query = read_query('queries\/count-tracks-in-albums-by-year.sql').format(2019, 2020)     print(f'############################\\n{query}\\n############################')     print('----SQL way---')     res = session_sql.execute(query)     print(*res, sep='\\n')     print('----ORM way----')     for item in session_orm.query(Track, Album).join(Album).filter(2019 &lt;= Album.year, Album.year &lt;= 2020):         print(f'{item[0].name}, {item[1].year}')      print('\\n9. Average track length in each album:')     query = read_query('queries\/count-average-tracks-by-album.sql')     print(f'############################\\n{query}\\n############################')     print('----SQL way---')     res = session_sql.execute(query)     print(*res, sep='\\n')     print('----ORM way----')     for item in session_orm.query(Album, func.avg(Track.length)).join(Track).order_by(func.avg(Track.length)).group_by(             Album.id):         print(f'{item[0].name}, {item[1]}')      print('\\n10. All musicians that have no albums in 2020:')     query = read_query('queries\/select-musicians-by-album-year.sql').format(2020)     print(f'############################\\n{query}\\n############################')     print('----SQL way---')     res = session_sql.execute(query)     print(*res, sep='\\n')     print('----ORM way----')     for item in session_orm.query(Musician).join(Musician.albums).filter(Album.year != 2020).order_by(             Musician.name.asc()):         print(f'{item.name}')      print('\\n11. All collections with musician Steve:')     query = read_query('queries\/select-collection-by-musician.sql').format('Steve')     print(f'############################\\n{query}\\n############################')     print('----SQL way---')     res = session_sql.execute(query)     print(*res, sep='\\n')     print('----ORM way----')     for item in session_orm.query(Collection).join(Collection.tracks).join(Album).join(Album.musicians).filter(             Musician.name == 'Steve').order_by(Collection.name):         print(f'{item.name}')      print('\\n12. Albums with musicians that play in more than 1 genre:')     query = read_query('queries\/select-albums-by-genres.sql').format(1)     print(f'############################\\n{query}\\n############################')     print('----SQL way---')     res = session_sql.execute(query)     print(*res, sep='\\n')     print('----ORM way----')     for item in session_orm.query(Album).join(Album.musicians).join(Musician.genres).having(func.count(distinct(             Genre.name)) &gt; 1).group_by(Album.id).order_by(Album.name):         print(f'{item.name}')      print('\\n13. Tracks that not included in any collections:')     query = read_query('queries\/select-absence-tracks-in-collections.sql')     print(f'############################\\n{query}\\n############################')     print('----SQL way---')     res = session_sql.execute(query)     print(*res, sep='\\n')     print('----ORM way----')     # Important! Despite the warning, following expression does not work: &quot;Collection.id is None&quot;     for item in session_orm.query(Track).outerjoin(Track.collections).filter(Collection.id == None):         print(f'{item.name}')      print('\\n14. Musicians with shortest track length:')     query = read_query('queries\/select-musicians-min-track-length.sql')     print(f'############################\\n{query}\\n############################')     print('----SQL way---')     res = session_sql.execute(query)     print(*res, sep='\\n')     print('----ORM way----')     subquery = session_orm.query(func.min(Track.length))     for item in session_orm.query(Musician, Track.length).join(Musician.albums).join(Track).group_by(             Musician.id, Track.length).having(Track.length == subquery).order_by(Musician.name):         print(f'{item[0].name}, {item[1]}')      print('\\n15. Albums with minimum number of tracks:')     query = read_query('queries\/select-albums-with-minimum-tracks.sql')     print(f'############################\\n{query}\\n############################')     print('----SQL way---')     res = session_sql.execute(query)     print(*res, sep='\\n')     print('----ORM way----')     subquery1 = session_orm.query(func.count(Track.id)).group_by(Track.album_id).order_by(func.count(Track.id)).limit(1)     subquery2 = session_orm.query(Track.album_id).group_by(Track.album_id).having(func.count(Track.id) == subquery1)     for item in session_orm.query(Album).join(Track).filter(Track.album_id.in_(subquery2)).order_by(Album.name):         print(f'{item.name}')<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u043e\u043c\u0443 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0447\u0442\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430, \u044f \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u044e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u00ab\u0441\u044b\u0440\u043e\u0439\u00bb SQL \u0438 \u0435\u0433\u043e \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u0432 ORM \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438, \u043f\u043e\u0435\u0445\u0430\u043b\u0438!<\/p>\n<h2>\u0428\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430 \u043f\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044e SQL \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 ORM \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/h2>\n<p>  1. \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u0433\u043e\u0434 \u0432\u044b\u0445\u043e\u0434\u0430 \u0430\u043b\u044c\u0431\u043e\u043c\u043e\u0432, \u0432\u044b\u0448\u0435\u0434\u0448\u0438\u0445 \u0432 2018 \u0433\u043e\u0434\u0443:<br \/>  SQL  <\/p>\n<pre><code class=\"sql\">select name from albums where year=2018<\/code><\/pre>\n<p>  ORM  <\/p>\n<pre><code class=\"python\">session_orm.query(Album).filter_by(year=2018)<\/code><\/pre>\n<p>  2. \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u043a\u0430:<br \/>  SQL  <\/p>\n<pre><code class=\"sql\">select name, length from tracks order by length DESC limit 1<\/code><\/pre>\n<p>  ORM  <\/p>\n<pre><code class=\"python\">session_orm.query(Track).order_by(Track.length.desc()).slice(0, 1)<\/code><\/pre>\n<p>  3. \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u043a\u043e\u0432, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 3,5 \u043c\u0438\u043d\u0443\u0442\u044b:<br \/>  SQL  <\/p>\n<pre><code class=\"sql\">select name, length from tracks where length &gt;= 310 order by length DESC<\/code><\/pre>\n<p>  ORM  <\/p>\n<pre><code class=\"python\">session_orm.query(Track).filter(310 &lt;= Track.length).order_by(Track.length.desc())<\/code><\/pre>\n<p>  4. \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0441\u0431\u043e\u0440\u043d\u0438\u043a\u043e\u0432, \u0432\u044b\u0448\u0435\u0434\u0448\u0438\u0445 \u0432 \u043f\u0435\u0440\u0438\u043e\u0434 \u0441 2018 \u043f\u043e 2020 \u0433\u043e\u0434 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e:<br \/>  SQL  <\/p>\n<pre><code class=\"sql\">select name from collections where (year &gt;= 2018) and (year &lt;= 2020)<\/code><\/pre>\n<p>  ORM  <\/p>\n<pre><code class=\"python\">session_orm.query(Collection).filter(2018 &lt;= Collection.year, Collection.year &lt;= 2020)<\/code><\/pre>\n<p>  <i>* \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u0436\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c filter, \u0430 \u043d\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c filter_by.<\/i><\/p>\n<p>  5. \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438, \u0447\u044c\u0435 \u0438\u043c\u044f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 1 \u0441\u043b\u043e\u0432\u0430:<br \/>  SQL  <\/p>\n<pre><code class=\"sql\">select name from musicians where not name like '%% %%'<\/code><\/pre>\n<p>  ORM  <\/p>\n<pre><code class=\"python\">session_orm.query(Musician).filter(Musician.name.notlike('%% %%'))<\/code><\/pre>\n<p>  6. \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0441\u043b\u043e\u0432\u043e \u00ab\u043c\u043e\u0439\u00bb\/\u00abmy\u00bb:<br \/>  SQL  <\/p>\n<pre><code class=\"sql\">select name from tracks where name like '%%me%%'<\/code><\/pre>\n<p>  ORM  <\/p>\n<pre><code class=\"python\">session_orm.query(Track).filter(Track.name.like('%%me%%'))<\/code><\/pre>\n<p>  7. \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0435\u0439 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0436\u0430\u043d\u0440\u0435:<br \/>  SQL  <\/p>\n<pre><code class=\"sql\">select g.name, count(m.name) from genres as g left join genres_musicians as gm on g.id = gm.genre_id left join musicians as m on gm.musician_id = m.id group by g.name order by count(m.name) DESC<\/code><\/pre>\n<p>  ORM  <\/p>\n<pre><code class=\"python\">session_orm.query(Genre).join(Genre.musicians).order_by(func.count(Musician.id).desc()).group_by(Genre.id)<\/code><\/pre>\n<p>  8. \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0440\u0435\u043a\u043e\u0432, \u0432\u043e\u0448\u0435\u0434\u0448\u0438\u0445 \u0432 \u0430\u043b\u044c\u0431\u043e\u043c\u044b 2019-2020 \u0433\u043e\u0434\u043e\u0432:<br \/>  SQL  <\/p>\n<pre><code class=\"sql\">select t.name, a.year from albums as a left join tracks as t on t.album_id = a.id where (a.year &gt;= 2019) and (a.year &lt;= 2020)<\/code><\/pre>\n<p>  ORM  <\/p>\n<pre><code class=\"python\">session_orm.query(Track, Album).join(Album).filter(2019 &lt;= Album.year, Album.year &lt;= 2020)<\/code><\/pre>\n<p>  9. \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0442\u0440\u0435\u043a\u043e\u0432 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0430\u043b\u044c\u0431\u043e\u043c\u0443:<br \/>  SQL  <\/p>\n<pre><code class=\"sql\">select a.name, AVG(t.length) from albums as a left join tracks as t on t.album_id = a.id group by a.name order by AVG(t.length)<\/code><\/pre>\n<p>  ORM  <\/p>\n<pre><code class=\"python\">session_orm.query(Album, func.avg(Track.length)).join(Track).order_by(func.avg(Track.length)).group_by(Album.id)<\/code><\/pre>\n<p>  10. \u0432\u0441\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0430\u043b\u044c\u0431\u043e\u043c\u044b \u0432 2020 \u0433\u043e\u0434\u0443:<br \/>  SQL  <\/p>\n<pre><code class=\"sql\">select distinct m.name from musicians as m left join albums_musicians as am on m.id = am.musician_id left join albums as a on a.id = am.album_id where not a.year = 2020 order by m.name<\/code><\/pre>\n<p>  ORM  <\/p>\n<pre><code class=\"python\">session_orm.query(Musician).join(Musician.albums).filter(Album.year != 2020).order_by(Musician.name.asc())<\/code><\/pre>\n<p>  11. \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0441\u0431\u043e\u0440\u043d\u0438\u043a\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c (Steve):<br \/>  SQL  <\/p>\n<pre><code class=\"sql\">select distinct c.name from collections as c left join collections_tracks as ct on c.id = ct.collection_id left join tracks as t on t.id = ct.track_id left join albums as a on a.id = t.album_id left join albums_musicians as am on am.album_id = a.id left join musicians as m on m.id = am.musician_id where m.name like '%%Steve%%' order by c.name<\/code><\/pre>\n<p>  ORM  <\/p>\n<pre><code class=\"python\">session_orm.query(Collection).join(Collection.tracks).join(Album).join(Album.musicians).filter(Musician.name == 'Steve').order_by(Collection.name)<\/code><\/pre>\n<p>  12. \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0430\u043b\u044c\u0431\u043e\u043c\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 1 \u0436\u0430\u043d\u0440\u0430:<br \/>  SQL  <\/p>\n<pre><code class=\"sql\">select a.name from albums as a left join albums_musicians as am on a.id = am.album_id left join musicians as m on m.id = am.musician_id left join genres_musicians as gm on m.id = gm.musician_id left join genres as g on g.id = gm.genre_id group by a.name having count(distinct g.name) &gt; 1 order by a.name<\/code><\/pre>\n<p>  ORM  <\/p>\n<pre><code class=\"python\">session_orm.query(Album).join(Album.musicians).join(Musician.genres).having(func.count(distinct(Genre.name)) &gt; 1).group_by(Album.id).order_by(Album.name)<\/code><\/pre>\n<p>  13. \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0432\u0445\u043e\u0434\u044f\u0442 \u0432 \u0441\u0431\u043e\u0440\u043d\u0438\u043a\u0438:<br \/>  SQL  <\/p>\n<pre><code class=\"sql\">select t.name from tracks as t left join collections_tracks as ct on t.id = ct.track_id where ct.track_id is null<\/code><\/pre>\n<p>  ORM  <\/p>\n<pre><code class=\"python\">session_orm.query(Track).outerjoin(Track.collections).filter(Collection.id == None)<\/code><\/pre>\n<p>  <i>* \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0447\u0442\u043e \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u0432 PyCharm \u043d\u0430\u0434\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438, \u0435\u0441\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 IDE (\u00abCollection.id <b>is<\/b> None\u00bb) \u0442\u043e \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.<\/i><\/p>\n<p>  14. \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f(-\u0435\u0439), \u043d\u0430\u043f\u0438\u0441\u0430\u0432\u0448\u0435\u0433\u043e \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043f\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0435\u043a (\u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0430\u043a\u0438\u0445 \u0442\u0440\u0435\u043a\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e):<br \/>  SQL  <\/p>\n<pre><code class=\"sql\">select m.name, t.length from tracks as t left join albums as a on a.id = t.album_id left join albums_musicians as am on am.album_id = a.id left join musicians as m on m.id = am.musician_id group by m.name, t.length having t.length = (select min(length) from tracks) order by m.name<\/code><\/pre>\n<p>  ORM  <\/p>\n<pre><code class=\"python\">subquery = session_orm.query(func.min(Track.length)) session_orm.query(Musician, Track.length).join(Musician.albums).join(Track).group_by(Musician.id, Track.length).having(Track.length == subquery).order_by(Musician.name)<\/code><\/pre>\n<p>  15. \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0430\u043b\u044c\u0431\u043e\u043c\u043e\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0440\u0435\u043a\u043e\u0432:<br \/>  SQL  <\/p>\n<pre><code class=\"sql\">select distinct a.name from albums as a left join tracks as t on t.album_id = a.id where t.album_id in (     select album_id     from tracks     group by album_id     having count(id) = (         select count(id)         from tracks         group by album_id         order by count         limit 1     ) ) order by a.name<\/code><\/pre>\n<p>  ORM  <\/p>\n<pre><code class=\"python\">subquery1 = session_orm.query(func.count(Track.id)).group_by(Track.album_id).order_by(func.count(Track.id)).limit(1) subquery2 = session_orm.query(Track.album_id).group_by(Track.album_id).having(func.count(Track.id) == subquery1) session_orm.query(Album).join(Track).filter(Track.album_id.in_(subquery2)).order_by(Album.name)<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u0432\u044b\u0448\u0435\u0438\u0437\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044e\u0442 \u043a\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0442\u0430\u043a \u0438 \u0441 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0412\u0441\u0435 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 SQLAlchemy \u043a\u0430\u043a \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 SQL \u0442\u0430\u043a \u0438 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 ORM. \u0420\u0430\u0437\u043d\u043e\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u043b\u044e\u0431\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b.<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/531472\/\"> https:\/\/habr.com\/ru\/post\/531472\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\u041e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 SQLAlchemy \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0421\u0423\u0411\u0414 \u0438\u0437 Python \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0435\u0439. \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043e\u0431\u0437\u043e\u0440 \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c ORM \u0438 SQL \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432. \u0414\u0430\u043d\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u043a\u0443\u043d\u0443\u0442\u044c\u0441\u044f \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 SQLAlchemy, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 SQLAlchemy \u043d\u0430 \u043c\u043e\u0439 \u0441\u043a\u0440\u043e\u043c\u043d\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0442\u044f\u0436\u0435\u043b\u0430 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/hp\/9s\/wz\/hp9swz2dqq-oz9rrlho3wqstaze.jpeg\" alt=\"image\"><\/p>\n<p>  \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u0441\u0435\u0431\u0435: \u044f \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043f\u0440\u043e\u0445\u043e\u0436\u0443 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u043a\u0443\u0440\u0441\u0443 \u00abPython \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u00bb. \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0431\u044b\u043b \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0435 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0414\u0417, \u0430 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0441\u0430\u043c\u043e\u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f. \u041c\u043e\u0439 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0438\u0432\u043d\u044b\u043c, \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0447\u0435\u043c \u043f\u0440\u043e\u0448\u0443 \u043d\u0435 \u0441\u0442\u0435\u0441\u043d\u044f\u0442\u044c\u0441\u044f \u0438 \u0441\u0432\u043e\u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \u0415\u0441\u043b\u0438 \u044f \u0432\u0430\u0441 \u0435\u0449\u0435 \u043d\u0435 \u043d\u0430\u043f\u0443\u0433\u0430\u043b, \u043f\u0440\u043e\u0448\u0443 \u043f\u043e\u0434 \u043a\u0430\u0442 \ud83d\ude42  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-314386","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/314386","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=314386"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/314386\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=314386"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=314386"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=314386"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}