Skip to content

Instantly share code, notes, and snippets.

@C1eriC
Created October 7, 2019 05:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save C1eriC/1f171e0d4886a03615f99f88f7eddaf5 to your computer and use it in GitHub Desktop.
Save C1eriC/1f171e0d4886a03615f99f88f7eddaf5 to your computer and use it in GitHub Desktop.
<!DOCTYPE html>
<html lang="ru" data-vue-meta="lang">
<head data-vue-meta="">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,user-scalable=0,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title data-vue-meta="true">Крадущийся тигр, затаившийся SQLAlchemy. Основы / Комментарии / Хабр</title>
<meta name="habr-version" content="2.5.20">
<meta name="csrf-token" content="LtsFKmQo-4w5m7NrVWeUNvqHkbUmL2ni39Gw">
<meta data-vue-meta="true" name="apple-mobile-web-app-status-bar-style" content="#77a2b6"><meta data-vue-meta="true" name="application-name" content="habr"><meta data-vue-meta="true" name="msapplication-TileColor" content="#77a2b6"><meta data-vue-meta="true" name="theme-color" content="#77a2b6"><meta data-vue-meta="true" name="google-play-app" content="app-id=ru.habrahabr"><meta data-vue-meta="true" property="al:android:app_name" content="Habrahabr"><meta data-vue-meta="true" property="al:android:package" content="ru.habrahabr"><meta data-vue-meta="true" property="fb:app_id" content="444736788986613"><meta data-vue-meta="true" property="fb:pages" content="472597926099084"><meta data-vue-meta="true" name="twitter:card" content="summary_large_image"><meta data-vue-meta="true" name="twitter:site" content="@habrahabr"><meta data-vue-meta="true" property="og:locale" content><meta data-vue-meta="true" property="og:type" content="article"><meta data-vue-meta="true" property="al:android:url" content="habrahabr:/undefined"><meta data-vue-meta="true" property="og:url" content="https://habr.com/ru/post/470285/"><meta data-vue-meta="true" itemprop="name" content="Крадущийся тигр, затаившийся SQLAlchemy. Основы"><meta data-vue-meta="true" property="og:title" content="Крадущийся тигр, затаившийся SQLAlchemy. Основы"><meta data-vue-meta="true" name="twitter:title" content="Крадущийся тигр, затаившийся SQLAlchemy. Основы"><meta data-vue-meta="true" name="description" content="Доброго дня. Сегодня хочу рассказать про ORM SQLAlchemy. Поговорим о том, что это, про его возможности и гибкость, а также рассмотрим случаи, которые не всегда..."><meta data-vue-meta="true" itemprop="description" content="Доброго дня. Сегодня хочу рассказать про ORM SQLAlchemy. Поговорим о том, что это, про его возможности и гибкость, а также рассмотрим случаи, которые не всегда..."><meta data-vue-meta="true" property="og:description" content="Доброго дня. Сегодня хочу рассказать про ORM SQLAlchemy. Поговорим о том, что это, про его возможности и гибкость, а также рассмотрим случаи, которые не всегда..."><meta data-vue-meta="true" name="twitter:description" content="Доброго дня. Сегодня хочу рассказать про ORM SQLAlchemy. Поговорим о том, что это, про его возможности и гибкость, а также рассмотрим случаи, которые не всегда..."><meta data-vue-meta="true" itemprop="image" content="/img/habr.png?v=1"><meta data-vue-meta="true" property="og:image" content="/img/habr.png?v=1"><meta data-vue-meta="true" name="twitter:image" content="/img/habr.png?v=1">
<link href="https://fonts.googleapis.com/css?family=Fira+Sans:500&amp;subset=cyrillic" rel="stylesheet">
<link data-vue-meta="true" rel="shortcut icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png"><link data-vue-meta="true" rel="shortcut icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png"><link data-vue-meta="true" rel="apple-touch-icon" type="image/png" sizes="180x180" href="/img/favicons/apple-touch-icon.png"><link data-vue-meta="true" rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)" href="/img/splashes/iphone5_splash.png"><link data-vue-meta="true" rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2)" href="/img/splashes/iphone6_splash.png"><link data-vue-meta="true" rel="apple-touch-startup-image" media="(device-width: 621px) and (device-height: 1104px) and (-webkit-device-pixel-ratio: 3)" href="/img/splashes/iphoneplus_splash.png"><link data-vue-meta="true" rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3)" href="/img/splashes/iphonex_splash.png"><link data-vue-meta="true" rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2)" href="/img/splashes/iphonexr_splash.png"><link data-vue-meta="true" rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3)" href="/img/splashes/iphonexsmax_splash.png"><link data-vue-meta="true" rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2)" href="/img/splashes/ipad_splash.png"><link data-vue-meta="true" rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2)" href="/img/splashes/ipadpro1_splash.png"><link data-vue-meta="true" rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2)" href="/img/splashes/ipadpro3_splash.png"><link data-vue-meta="true" rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2)" href="/img/splashes/ipadpro2_splash.png"><link data-vue-meta="true" rel="mask-icon" color="#77a2b6" href="/img/favicons/safari-pinned-tab.svg"><link data-vue-meta="true" crossorigin="use-credentials" href="/manifest.webmanifest" rel="manifest"><link data-vue-meta="true" href="https://habr.com/ru/post/470285/" rel="canonical" data-vmid="canonical"><link data-vue-meta="true" rel="image_src" href="/img/habr.png">
<script data-vue-meta="true" src="/js/ads.js" onload="window['zhY4i4nJ9K'] = true" data-vmid="checkad"></script>
<script src="//www.googletagservices.com/tag/js/gpt.js" async></script>
<style>
.grecaptcha-badge {
visibility: hidden;
}
</style>
<link rel="preload" href="/css/vendors.6362ef2d.css" as="style"><link rel="preload" href="/js/vendors.983b12ad.js" as="script"><link rel="preload" href="/css/app.9aeeaa75.css" as="style"><link rel="preload" href="/js/app.a99c6101.js" as="script"><link rel="prefetch" href="/css/chunk-2bb78559.5d479b5b.css"><link rel="prefetch" href="/css/chunk-90d5e190.ddbbe8a5.css"><link rel="prefetch" href="/css/feedback.6f78b178.css"><link rel="prefetch" href="/css/gallery.83b62403.css"><link rel="prefetch" href="/css/search.1ed3a8d5.css"><link rel="prefetch" href="/css/topic.410b9918.css"><link rel="prefetch" href="/js/ads.js"><link rel="prefetch" href="/js/chunk-2bb78559.5c504855.js"><link rel="prefetch" href="/js/chunk-90d5e190.295e3cd9.js"><link rel="prefetch" href="/js/feedback.23554fc6.js"><link rel="prefetch" href="/js/gallery.d2d25c86.js"><link rel="prefetch" href="/js/hljs.f11899d4.js"><link rel="prefetch" href="/js/photoswipe.35c689c8.js"><link rel="prefetch" href="/js/pikaday.62da341d.js"><link rel="prefetch" href="/js/search.6e03fd00.js"><link rel="prefetch" href="/js/topic.1b149f75.js"><link rel="prefetch" href="/precache-manifest.302d70e8d93f5b20e5cf1b129ee6aaa2.js"><link rel="prefetch" href="/service-worker.js"><link rel="stylesheet" href="/css/vendors.6362ef2d.css"><link rel="stylesheet" href="/css/app.9aeeaa75.css"></head>
<body>
<div id="app" data-server-rendered="true"><div class="tm-layout__wrapper tm-fira-loaded"><div></div> <div></div> <header class="tm-header"><div class="tm-header__container"><span class="tm-svg-icon__wrapper tm-header__burger"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><use xlink:href="/img/megazord-v7.svg#header-burger"></use></svg></span> <span class="tm-header__logo-wrap"><a href="/ru/" class="tm-svg-icon__wrapper tm-header__logo"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><use xlink:href="/img/megazord-v7.svg#logo-habrcom"></use></svg></a> <span class="tm-header__beta-sign" style="display:none;">β</span></span> <div class="tm-header__user tm-header__user_logged-in"><div class="tm-entity-image"><img src="https://habrastorage.org/getpro/habr/avatars/d01/fe1/46a/d01fe146a28e3996dcf06dde41059a90.jpg" class="tm-entity-image__pic"></div></div></div></header> <!----> <!----> <div class="tm-layout"><div class="tm-page-progress-bar"></div> <div id="adbanner460648" class="tm-ad-banner"></div> <!----> <!----> <!----> <main class="tm-layout__container"><div class="tm-page tm-page_narrow"><!----> <div style="display:;"><div class="tm-article-hubs"><div class="tm-article-hubs__hub"><a href="/ru/hub/python/" class="tm-article-hubs__link">Python</a></div><div class="tm-article-hubs__hub"><a href="/ru/hub/postgresql/" class="tm-article-hubs__link">PostgreSQL</a></div><div class="tm-article-hubs__hub"><a href="/ru/hub/sql/" class="tm-article-hubs__link">SQL</a></div></div> <article class="tm-article tm-page-article-comments__content tm-article_preview"><!----> <div class="tm-user-meta"><a href="/ru/users/NapoleonIT/posts/" class="tm-user-info"><div class="tm-user-info__userpic"><div class="tm-entity-image"><img src="https://habrastorage.org/r/w32/getpro/habr/avatars/5a2/462/845/5a2462845b5b5599bb8a75992e25eaa6.png" class="tm-entity-image__pic"></div></div> <span class="tm-user-info__username">NapoleonIT</span></a> <span title="2019-10-06, 10:39" class="tm-user-meta__date"><span>вчера в 10:39</span></span></div> <!----> <h2 class="tm-article-title tm-article-title_preview tm-article-title_preview"><a href="/ru/post/470285/" class="tm-article-title__link router-link-active">Крадущийся тигр, затаившийся SQLAlchemy. Основы</a></h2> <!----> <div></div> <!----> <div class="tm-article__counters"><div class="tm-article__sticked-counters-wrapper" style="display:none;"><div class="tm-data-icons tm-article__sticked-counters"><div class="tm-article-rating tm-article-icons__item"><div class="tm-votes-lever tm-article-rating__votes-switcher tm-votes-lever_medium"><span class="tm-svg-icon__wrapper tm-votes-icon tm-votes-lever__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><use xlink:href="/img/megazord-v7.svg#counter-vote"></use></svg></span> <span class="tm-votes-score tm-votes-lever__score tm-votes-score_positive">+5 </span> <span class="tm-svg-icon__wrapper tm-votes-icon tm-votes-lever__icon tm-votes-lever__icon_down"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><use xlink:href="/img/megazord-v7.svg#counter-vote"></use></svg></span></div></div> <!----> <!----> <span class="tm-icon-text tm-icon-text-button tm-data-icons__item"><span class="tm-icon-text__icon"><svg height="16" width="16" class="tm-svg-img tm-data-icons__icon tm-data-icons__icon_bookmarks"><use xlink:href="/img/megazord-v7.svg#counter-bookmarks"></use></svg></span> <span class="tm-icon-text__text"><span class="tm-data-icons__counter tm-data-icons__counter_bookmarks">58</span></span></span> <!----></div></div> <div class="tm-data-icons"><!----> <div class="tm-votes-meter tm-votes-meter_small"><span class="tm-svg-icon__wrapper tm-votes-icon tm-votes-meter__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><use xlink:href="/img/megazord-v7.svg#counter-rating"></use></svg></span> <span class="tm-votes-score tm-votes-meter__score tm-votes-score_positive">+5 </span></div> <span class="tm-icon-text tm-data-icons__item"><span class="tm-icon-text__icon"><span class="tm-data-icons__icon tm-data-icons__icon_views"></span><svg height="16" width="16" class="tm-svg-img tm-data-icons__icon tm-data-icons__icon_views"><use xlink:href="/img/megazord-v7.svg#counter-views"></use></svg></span> <span class="tm-icon-text__text"><span class="tm-data-icons__counter tm-data-icons__counter_views">2,7k </span></span></span> <span class="tm-icon-text tm-icon-text-button tm-data-icons__item"><span class="tm-icon-text__icon"><svg height="16" width="16" class="tm-svg-img tm-data-icons__icon tm-data-icons__icon_bookmarks"><use xlink:href="/img/megazord-v7.svg#counter-bookmarks"></use></svg></span> <span class="tm-icon-text__text"><span class="tm-data-icons__counter tm-data-icons__counter_bookmarks">58</span></span></span> <!----></div></div></article> <div id="adbanner460649" class="tm-ad-banner tm-page-article-comments__top-banner"></div> <div class="tm-page-article-comments__wrapper"><div class="tm-page-article-comments__title">
Комментарии
<span class="tm-page-article-comments__comments-count">
5
</span></div> <div class="tm-page-article-comments__inner"><section><!----> <div class="tm-comments-list__comment-wrapper"><div class="tm-comments-list__comment"><section><div class="tm-comment__collapsed" style="padding-left:0px;display:none;"><div class="tm-comment__circle-block"><div class="tm-comment__circle"></div></div> <div class="tm-comment__collapsed-text"><span>Раскрыть ветку (0)</span></div> <div class="tm-comment__collapsed-line"></div></div> <article class="tm-comment" style="opacity:1;padding-left:0px;display:;"><a name="comment_20718557"></a> <div></div> <header class="tm-comment__header"><div class="tm-comment-score tm-comment-head__score">
0
</div> <div class="tm-comment-head__inner"><a href="/ru/users/Andy_U/" class="tm-user-info tm-comment-head__user"><div class="tm-user-info__userpic"><div class="tm-entity-image"><svg height="16" width="16" color="blue" type="user" class="tm-svg-img tm-image-placeholder tm-image-placeholder_blue"><use xlink:href="/img/megazord-v7.svg#placeholder-user"></use></svg></div></div> <span class="tm-user-info__username">Andy_U</span></a> <time class="tm-comment-datetime tm-comment-head__datetime"><a href="#comment_20718557" class="tm-comment-datetime__link"><span>06.10.2019 в 13:39</span></a></time></div></header> <section><div></div> <div></div> <div class="tm-comment-body__content"><div xmlns="http://www.w3.org/1999/xhtml">Один я не знал, что так можно?<br/>
<br/>
<pre><code class="python"> def __repr__(self):
return "&lt;{0.__class__.__name__}(id={0.id!r})>".format(self)</code></pre></div></div></section> <footer class="tm-user-comments-footer tm-comment__footer"><!----> <div class="tm-comment__footer-item tm-comment-button"><span>Ответить</span></div> <div class="tm-comment__footer-item"><div class="tm-comment-button tm-comment_transparent"><svg height="16" width="16" class="tm-svg-img tm-comment-button-bookmarks__icon"><use xlink:href="/img/megazord-v7.svg#counter-vote"></use></svg> <svg height="16" width="16" class="tm-svg-img tm-comment-button-bookmarks__icon tm-comment-button-bookmarks_down"><use xlink:href="/img/megazord-v7.svg#counter-vote"></use></svg></div> <!----></div> <button class="tm-comment-button tm-comment__footer-item tm-comment_transparent"><svg height="16" width="16" class="tm-svg-img tm-comment-button-bookmarks__icon"><use xlink:href="/img/megazord-v7.svg#counter-bookmarks"></use></svg></button> <!----> <!----></footer></article></section></div> <!----> <!----> <!----></div><div class="tm-comments-list__comment-wrapper"><div class="tm-comments-list__comment"><section><div class="tm-comment__collapsed" style="padding-left:20px;display:none;"><div class="tm-comment__circle-block"><div class="tm-comment__circle"></div></div> <div class="tm-comment__collapsed-text"><span>Раскрыть ветку (0)</span></div> <div class="tm-comment__collapsed-line"></div></div> <article class="tm-comment" style="opacity:1;padding-left:20px;display:;"><a name="comment_20718791"></a> <div class="tm-comment__breadcrumbs" style="width:20px;"><div class="tm-comment__circle"></div></div> <header class="tm-comment__header"><div class="tm-comment-score tm-comment-head__score">
0
</div> <div class="tm-comment-head__inner"><a href="/ru/users/onegreyonewhite/" class="tm-user-info tm-comment-head__user"><div class="tm-user-info__userpic"><div class="tm-entity-image"><img src="//habrastorage.org/r/w32/getpro/habr/avatars/fa9/942/f93/fa9942f936a90d8c8e53832682f0290e.png" class="tm-entity-image__pic"></div></div> <span class="tm-user-info__username">onegreyonewhite</span></a> <time class="tm-comment-datetime tm-comment-head__datetime"><a href="#comment_20718791" class="tm-comment-datetime__link"><span>06.10.2019 в 15:17</span></a></time></div></header> <section><div></div> <div></div> <div class="tm-comment-body__content"><div xmlns="http://www.w3.org/1999/xhtml"><p>Судя по всему да.<br/>
Вообще можно даже значение словаря получить по ключу (пишите так же квадратные скобки, но значение ключа без кавычек) или значение массива по индексу.</p></div></div></section> <footer class="tm-user-comments-footer tm-comment__footer"><!----> <div class="tm-comment__footer-item tm-comment-button"><span>Ответить</span></div> <div class="tm-comment__footer-item"><div class="tm-comment-button tm-comment_transparent"><svg height="16" width="16" class="tm-svg-img tm-comment-button-bookmarks__icon"><use xlink:href="/img/megazord-v7.svg#counter-vote"></use></svg> <svg height="16" width="16" class="tm-svg-img tm-comment-button-bookmarks__icon tm-comment-button-bookmarks_down"><use xlink:href="/img/megazord-v7.svg#counter-vote"></use></svg></div> <!----></div> <button class="tm-comment-button tm-comment__footer-item tm-comment_transparent"><svg height="16" width="16" class="tm-svg-img tm-comment-button-bookmarks__icon"><use xlink:href="/img/megazord-v7.svg#counter-bookmarks"></use></svg></button> <!----> <!----></footer></article></section></div> <!----> <!----> <!----></div><div class="tm-comments-list__comment-wrapper"><div class="tm-comments-list__comment"><section><div class="tm-comment__collapsed" style="padding-left:40px;display:none;"><div class="tm-comment__circle-block"><div class="tm-comment__circle"></div></div> <div class="tm-comment__collapsed-text"><span>Раскрыть ветку (0)</span></div> <div class="tm-comment__collapsed-line"></div></div> <article class="tm-comment" style="opacity:1;padding-left:40px;display:;"><a name="comment_20719147"></a> <div class="tm-comment__breadcrumbs" style="width:40px;"><div class="tm-comment__circle"></div></div> <header class="tm-comment__header"><div class="tm-comment-score tm-comment-head__score">
0
</div> <div class="tm-comment-head__inner"><a href="/ru/users/Andy_U/" class="tm-user-info tm-comment-head__user"><div class="tm-user-info__userpic"><div class="tm-entity-image"><svg height="16" width="16" color="blue" type="user" class="tm-svg-img tm-image-placeholder tm-image-placeholder_blue"><use xlink:href="/img/megazord-v7.svg#placeholder-user"></use></svg></div></div> <span class="tm-user-info__username">Andy_U</span></a> <time class="tm-comment-datetime tm-comment-head__datetime"><a href="#comment_20719147" class="tm-comment-datetime__link"><span>06.10.2019 в 18:21</span></a></time></div></header> <section><div></div> <div></div> <div class="tm-comment-body__content"><div xmlns="http://www.w3.org/1999/xhtml">Я, честно говоря, не очень внимательно документацию читал, но не помню там описания такого трюка. Ну и вообще, это какая-то дверь в ад, типа eval и exec:<br/>
<br/>
<pre><code class="python">class Tst:
def __init__(self):
self._a = 1
@property
def a(self):
print('hahaha')
return self._a
if __name__ == '__main__':
tst = Tst()
print('{0.a}'.format(tst))
</code></pre></div></div></section> <footer class="tm-user-comments-footer tm-comment__footer"><!----> <div class="tm-comment__footer-item tm-comment-button"><span>Ответить</span></div> <div class="tm-comment__footer-item"><div class="tm-comment-button tm-comment_transparent"><svg height="16" width="16" class="tm-svg-img tm-comment-button-bookmarks__icon"><use xlink:href="/img/megazord-v7.svg#counter-vote"></use></svg> <svg height="16" width="16" class="tm-svg-img tm-comment-button-bookmarks__icon tm-comment-button-bookmarks_down"><use xlink:href="/img/megazord-v7.svg#counter-vote"></use></svg></div> <!----></div> <button class="tm-comment-button tm-comment__footer-item tm-comment_transparent"><svg height="16" width="16" class="tm-svg-img tm-comment-button-bookmarks__icon"><use xlink:href="/img/megazord-v7.svg#counter-bookmarks"></use></svg></button> <!----> <!----></footer></article></section></div> <!----> <!----> <!----></div><div class="tm-comments-list__comment-wrapper"><div class="tm-comments-list__comment"><section><div class="tm-comment__collapsed" style="padding-left:60px;display:none;"><div class="tm-comment__circle-block"><div class="tm-comment__circle"></div></div> <div class="tm-comment__collapsed-text"><span>Раскрыть ветку (0)</span></div> <div class="tm-comment__collapsed-line"></div></div> <article class="tm-comment" style="opacity:1;padding-left:60px;display:;"><a name="comment_20720189"></a> <div class="tm-comment__breadcrumbs" style="width:60px;"><div class="tm-comment__circle"></div></div> <header class="tm-comment__header"><div class="tm-comment-score tm-comment-head__score">
0
</div> <div class="tm-comment-head__inner"><a href="/ru/users/onegreyonewhite/" class="tm-user-info tm-comment-head__user"><div class="tm-user-info__userpic"><div class="tm-entity-image"><img src="//habrastorage.org/r/w32/getpro/habr/avatars/fa9/942/f93/fa9942f936a90d8c8e53832682f0290e.png" class="tm-entity-image__pic"></div></div> <span class="tm-user-info__username">onegreyonewhite</span></a> <time class="tm-comment-datetime tm-comment-head__datetime"><a href="#comment_20720189" class="tm-comment-datetime__link"><span>07.10.2019 в 03:21</span></a></time></div></header> <section><div></div> <div></div> <div class="tm-comment-body__content"><div xmlns="http://www.w3.org/1999/xhtml"><p>Как по мне, дверью в ад являются f-strings (Python>=3.6), которые упомянули ниже.<br/>
Там напрямую функции легко можно вызвать.<br/>
Поэтому форматирование нужно использовать обдуманно и не форматировать строки извне, а только те, которым вы доверяете (т.е. находящимся внутри кода).</p></div></div></section> <footer class="tm-user-comments-footer tm-comment__footer"><!----> <div class="tm-comment__footer-item tm-comment-button"><span>Ответить</span></div> <div class="tm-comment__footer-item"><div class="tm-comment-button tm-comment_transparent"><svg height="16" width="16" class="tm-svg-img tm-comment-button-bookmarks__icon"><use xlink:href="/img/megazord-v7.svg#counter-vote"></use></svg> <svg height="16" width="16" class="tm-svg-img tm-comment-button-bookmarks__icon tm-comment-button-bookmarks_down"><use xlink:href="/img/megazord-v7.svg#counter-vote"></use></svg></div> <!----></div> <button class="tm-comment-button tm-comment__footer-item tm-comment_transparent"><svg height="16" width="16" class="tm-svg-img tm-comment-button-bookmarks__icon"><use xlink:href="/img/megazord-v7.svg#counter-bookmarks"></use></svg></button> <!----> <!----></footer></article></section></div> <!----> <!----> <!----></div><div class="tm-comments-list__comment-wrapper"><div class="tm-comments-list__comment"><section><div class="tm-comment__collapsed" style="padding-left:20px;display:none;"><div class="tm-comment__circle-block"><div class="tm-comment__circle"></div></div> <div class="tm-comment__collapsed-text"><span>Раскрыть ветку (0)</span></div> <div class="tm-comment__collapsed-line"></div></div> <article class="tm-comment" style="opacity:1;padding-left:20px;display:;"><a name="comment_20719013"></a> <div class="tm-comment__breadcrumbs" style="width:20px;"><div class="tm-comment__circle"></div></div> <header class="tm-comment__header"><div class="tm-comment-score tm-comment-head__score tm-comment-score_positive">
+1
</div> <div class="tm-comment-head__inner"><a href="/ru/users/Tihon_V/" class="tm-user-info tm-comment-head__user"><div class="tm-user-info__userpic"><div class="tm-entity-image"><img src="//habrastorage.org/r/w32/getpro/habr/avatars/246/b53/a61/246b53a61e696f4bd9b14e73095f2e6d.png" class="tm-entity-image__pic"></div></div> <span class="tm-user-info__username">Tihon_V</span></a> <time class="tm-comment-datetime tm-comment-head__datetime"><a href="#comment_20719013" class="tm-comment-datetime__link"><span>06.10.2019 в 17:02</span></a></time></div></header> <section><div></div> <div></div> <div class="tm-comment-body__content"><div xmlns="http://www.w3.org/1999/xhtml">Как по мне — f-strings тут к месту<br/>
<pre><code class="python">def __repr__(self):
return f"&lt;{type(self).__name__}(id={self.id})>"
</code></pre></div></div></section> <footer class="tm-user-comments-footer tm-comment__footer"><!----> <div class="tm-comment__footer-item tm-comment-button"><span>Ответить</span></div> <div class="tm-comment__footer-item"><div class="tm-comment-button tm-comment_transparent"><svg height="16" width="16" class="tm-svg-img tm-comment-button-bookmarks__icon"><use xlink:href="/img/megazord-v7.svg#counter-vote"></use></svg> <svg height="16" width="16" class="tm-svg-img tm-comment-button-bookmarks__icon tm-comment-button-bookmarks_down"><use xlink:href="/img/megazord-v7.svg#counter-vote"></use></svg></div> <!----></div> <button class="tm-comment-button tm-comment__footer-item tm-comment_transparent"><svg height="16" width="16" class="tm-svg-img tm-comment-button-bookmarks__icon"><use xlink:href="/img/megazord-v7.svg#counter-bookmarks"></use></svg></button> <!----> <!----></footer></article></section></div> <!----> <!----> <!----></div></section> <div class="tm-comment-navigation tm-comment-navigation__block tm-comment-navigation__has-new_reverse"><span class="tm-svg-icon__wrapper tm-comment-navigation__refresh"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><use xlink:href="/img/megazord-v7.svg#refresher-comments"></use></svg></span> <div class="tm-comment-navigation__wrapper" style="display:none;"><span class="tm-svg-icon__wrapper tm-comment-navigation__button tm-comment-navigation__button_up"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><use xlink:href="/img/megazord-v7.svg#refresher-up"></use></svg></span> <div class="tm-comment-navigation__counter">
0
</div> <span class="tm-svg-icon__wrapper tm-comment-navigation__button tm-comment-navigation__button_down"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><use xlink:href="/img/megazord-v7.svg#refresher-up"></use></svg></span></div></div></div></div> <div class="tm-article-comments-form"><!----> <form class="tm-comment-form"><div class="tm-comment-form__title"><span>Написать комментарий</span></div> <!----> <textarea cols="30" rows="5" class="tm-comment-form__input"></textarea> <div class="tm-comment-form__controls"><button disabled="disabled" class="tm-comment-form-controls__button tm-comment-form-controls__button_preview"><span>Предпросмотр</span></button> <button disabled="disabled" class="tm-comment-form-controls__button tm-comment-form-controls__button_send"><span>Отправить</span></button></div></form></div></div></div></main> <!----></div> <div class="tm-footer"><div class="tm-footer__container"><div class="tm-footer__title"><a href="/" class="tm-svg-icon__wrapper tm-footer__title-link"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><use xlink:href="/img/megazord-v7.svg#logo-habrcom"></use></svg></a></div> <div class="tm-footer__social"><a href="https://www.facebook.com/habrahabr.ru" target="_blank" class="tm-svg-icon__wrapper tm-social-icons__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><use xlink:href="/img/megazord-v7.svg#social-logo-facebook"></use></svg></a><a href="https://twitter.com/habr_com" target="_blank" class="tm-svg-icon__wrapper tm-social-icons__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><use xlink:href="/img/megazord-v7.svg#social-logo-twitter"></use></svg></a><a href="https://vk.com/habr" target="_blank" class="tm-svg-icon__wrapper tm-social-icons__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><use xlink:href="/img/megazord-v7.svg#social-logo-vkontakte"></use></svg></a><a href="https://telegram.me/habr_com" target="_blank" class="tm-svg-icon__wrapper tm-social-icons__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><use xlink:href="/img/megazord-v7.svg#social-logo-telegram"></use></svg></a><a href="https://www.youtube.com/channel/UCd_sTwKqVrweTt4oAKY5y4w" target="_blank" class="tm-svg-icon__wrapper tm-social-icons__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><use xlink:href="/img/megazord-v7.svg#social-logo-youtube"></use></svg></a><a href="https://zen.yandex.ru/habr" target="_blank" class="tm-svg-icon__wrapper tm-social-icons__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><use xlink:href="/img/megazord-v7.svg#social-logo-zen"></use></svg></a></div> <div class="tm-footer__link"><svg height="16" width="16" class="tm-svg-img tm-footer__icon"><use xlink:href="/img/megazord-v7.svg#lang"></use></svg> <span>Настройка языка</span></div> <a href="https://habr.com/ru/post/470285/comments/?mobile=no" class="tm-footer__link"><span>Полная версия</span></a> <div></div> <div class="tm-footer-copyright"><span class="tm-copyright"><span class="tm-copyright__years">© 2006–2019 </span> <span class="tm-copyright__name">«<a href="https://tmtm.ru" target="_blank" class="tm-copyright__link">TM</a>»</span></span></div></div></div></div></div><script>window.__INITIAL_STATE__={"adblock":{"hasAcceptableAdsFilter":false,"hasAdblock":false},"articlesList":{"articlesList":{"470285":{"author":{"alias":"NapoleonIT","id":"1937959","image":"https:\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002F5a2\u002F462\u002F845\u002F5a2462845b5b5599bb8a75992e25eaa6.png","isSubscribed":false,"route":{"name":"articles_list_by_user","params":{"login":"NapoleonIT","hl":"ru"}},"shortInfo":"IT-компания","title":"Napoleon IT","karmaScore":7,"type":{"isReadAndComment":false,"isReadOnly":false},"username":"NapoleonIT","counters":{"posts":"3","comments":"0","followed":"0","followers":"2","favorites":"1"},"fl":null,"hl":null,"badges":[{"id":"1","title":"Захабренный","alias":"habred","description":"Пользователь с кармой \u003E0","url":null,"is_disabled":false,"is_removable":false}],"contactsLinks":[],"followersCount":2,"ratingScore":4,"registrationDate":"2019-01-17T07:43:32.000Z","invitationDate":"","gender":"0","votes":{"isEnabled":true,"voteState":0},"fullname":"Napoleon IT","imageSrc":"https:\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002F5a2\u002F462\u002F845\u002F5a2462845b5b5599bb8a75992e25eaa6.png","paymentsMethods":[],"login":"NapoleonIT"},"companyAlias":0,"canComment":true,"commentsCount":5,"commentsRoute":{"name":"article_comments","params":{"id":"470285","companyName":""}},"commentsUnreadCount":0,"contentHTML":"&#x3C;div xmlns=&#x22;http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml&#x22;&#x3E;&#x3C;p&#x3E;&#x3C;img src=&#x22;\u002Fimg\u002Fpx.gif&#x22; data-src=&#x22;https:\u002F\u002Fhabrastorage.org\u002Fwebt\u002F3o\u002Fji\u002Fei\u002F3ojiei46dcl8pihke7rjjojlgn4.jpeg&#x22;\u002F&#x3E;&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x414;&#x43E;&#x431;&#x440;&#x43E;&#x433;&#x43E; &#x434;&#x43D;&#x44F;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x421;&#x435;&#x433;&#x43E;&#x434;&#x43D;&#x44F; &#x445;&#x43E;&#x447;&#x443; &#x440;&#x430;&#x441;&#x441;&#x43A;&#x430;&#x437;&#x430;&#x442;&#x44C; &#x43F;&#x440;&#x43E; ORM SQLAlchemy. &#x41F;&#x43E;&#x433;&#x43E;&#x432;&#x43E;&#x440;&#x438;&#x43C; &#x43E; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x43E;, &#x43F;&#x440;&#x43E; &#x435;&#x433;&#x43E; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x438; &#x433;&#x438;&#x431;&#x43A;&#x43E;&#x441;&#x442;&#x44C;, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x440;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x438;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43D;&#x435; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x43D;&#x43E; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x44B;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x414;&#x430;&#x43D;&#x43D;&#x430;&#x44F; ORM &#x438;&#x43C;&#x435;&#x435;&#x442; &#x43F;&#x43E;&#x440;&#x43E;&#x433; &#x432;&#x445;&#x43E;&#x436;&#x434;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x44B;&#x448;&#x435; &#x441;&#x440;&#x435;&#x434;&#x43D;&#x435;&#x433;&#x43E;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x44F; &#x43F;&#x43E;&#x43F;&#x44B;&#x442;&#x430;&#x44E;&#x441;&#x44C; &#x43E;&#x431;&#x44A;&#x44F;&#x441;&#x43D;&#x438;&#x442;&#x44C; &#x432;&#x441;&#x451; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x44B;&#x43C; &#x44F;&#x437;&#x44B;&#x43A;&#x43E;&#x43C; &#x438; &#x441; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430;&#x43C;&#x438;. &#x421;&#x442;&#x430;&#x442;&#x44C;&#x44F; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43F;&#x43E;&#x43B;&#x435;&#x437;&#x43D;&#x430; &#x442;&#x435;&#x43C;, &#x43A;&#x442;&#x43E; &#x443;&#x436;&#x435; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x441; sqlalchemy &#x438; &#x445;&#x43E;&#x447;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x43A;&#x430;&#x447;&#x430;&#x442;&#x44C; &#x441;&#x432;&#x43E;&#x438; &#x43D;&#x430;&#x432;&#x44B;&#x43A;&#x438; &#x438;&#x43B;&#x438; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x437;&#x43D;&#x430;&#x43A;&#x43E;&#x43C;&#x438;&#x442;&#x441;&#x44F; &#x441; &#x44D;&#x442;&#x43E;&#x439; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x43E;&#x439;.&#x3C;\u002Fp&#x3E;&#x3C;a name=&#x22;habracut&#x22;&#x3E;&#x3C;\u002Fa&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C;&#x44B;&#x439; &#x44F;&#x437;&#x44B;&#x43A; &#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x43C;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x2014; python 3.6.&#x3C;br\u002F&#x3E;\r\n&#x411;&#x414; &#x2014; PostgreSQL.&#x3C;br\u002F&#x3E;\r\n&#x421;&#x441;&#x44B;&#x43B;&#x43A;&#x430; &#x43D;&#x430; &#x3C;a href=&#x22;https:\u002F\u002Fgithub.com\u002Fsandix90\u002Fsqlalchemy_basics&#x22;&#x3E;github&#x3C;\u002Fa&#x3E;&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x418;&#x442;&#x430;&#x43A;, &#x447;&#x442;&#x43E; &#x442;&#x430;&#x43A;&#x43E;&#x435; ORM? &#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;ORM (Object-Relational Mapping) &#x2014; &#x44D;&#x442;&#x43E; &#x442;&#x435;&#x445;&#x43D;&#x43E;&#x43B;&#x43E;&#x433;&#x438;&#x44F;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x441;&#x43E;&#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;, &#x442;&#x438;&#x43F;&#x44B; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x43D;&#x435;&#x441;&#x43E;&#x432;&#x43C;&#x435;&#x441;&#x442;&#x438;&#x43C;&#x44B;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;: &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x430; &#x431;&#x430;&#x437;&#x44B; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x438; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; &#x44F;&#x437;&#x44B;&#x43A;&#x430; &#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x43C;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F;. &#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x418;&#x43D;&#x44B;&#x43C;&#x438; &#x441;&#x43B;&#x43E;&#x432;&#x430;&#x43C;&#x438;, &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x449;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43A; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x430;&#x43C; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x43E;&#x432; &#x434;&#x43B;&#x44F; &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x43C;&#x438; &#x432; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x430;&#x445; &#x411;&#x414;. &#x422;&#x430;&#x43A;&#x436;&#x435; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x432;&#x430;&#x442;&#x44C;, &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x44F;&#x442;&#x44C;, &#x443;&#x434;&#x430;&#x43B;&#x44F;&#x442;&#x44C;, &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x438;, &#x441;&#x430;&#x43C;&#x43E;&#x435; &#x433;&#x43B;&#x430;&#x432;&#x43D;&#x43E;&#x435;, &#x43D;&#x430;&#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x44B; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x43E;&#x432;, &#x441;&#x43E;&#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x441; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x430;&#x43C;&#x438; &#x411;&#x414;, &#x447;&#x442;&#x43E; &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E; &#x441;&#x43E;&#x43A;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; &#x43D;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x43E;&#x434;&#x43E;&#x432;&#x43E;&#x439; &#x431;&#x430;&#x437;&#x44B;. &#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x427;&#x442;&#x43E;&#x431;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x438; SQLAlchemy, &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x44C; &#x43F;&#x440;&#x438;&#x43D;&#x446;&#x438;&#x43F; &#x435;&#x433;&#x43E; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x420;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430;&#x43C;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x442; Django-ORM, &#x43F;&#x440;&#x438;&#x434;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x44C; &#x43E;&#x431;&#x440;&#x430;&#x437; &#x43C;&#x44B;&#x448;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; ORM &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432;. &#x41D;&#x430; &#x43C;&#x43E;&#x439; &#x432;&#x437;&#x433;&#x43B;&#x44F;&#x434;, SQLAlchemy &#x2014; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x43E;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x43C;&#x43E;&#x43D;&#x441;&#x442;&#x440;, &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44F;&#x43C;&#x438; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x433;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x438; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F;, &#x43D;&#x43E; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x43D;&#x438;&#x43C;&#x430;&#x442;&#x44C;, &#x447;&#x442;&#x43E; ORM &#x43D;&#x435; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x438;&#x434;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;. &#x41F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43E;&#x431;&#x441;&#x443;&#x434;&#x438;&#x43C; &#x43C;&#x43E;&#x43C;&#x435;&#x43D;&#x442;&#x44B;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x44D;&#x442;&#x43E;&#x439; &#x442;&#x435;&#x445;&#x43D;&#x43E;&#x43B;&#x43E;&#x433;&#x438;&#x438; &#x446;&#x435;&#x43B;&#x435;&#x441;&#x43E;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x43D;&#x43E;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x412; SQLAlchemy &#x435;&#x441;&#x442;&#x44C; &#x43F;&#x43E;&#x43D;&#x44F;&#x442;&#x438;&#x435; &#x434;&#x435;&#x43A;&#x43B;&#x430;&#x440;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x445; &#x438; &#x43D;&#x435;&#x434;&#x435;&#x43A;&#x43B;&#x430;&#x440;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x445; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x439; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x435;&#x439;. &#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x41D;&#x435;&#x434;&#x435;&#x43A;&#x43B;&#x430;&#x440;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x44B;&#x435; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x43E;&#x434;&#x440;&#x430;&#x437;&#x443;&#x43C;&#x435;&#x432;&#x430;&#x44E;&#x442; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; mapper(), &#x43E;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x44E;&#x449;&#x435;&#x433;&#x43E; &#x441;&#x43E;&#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x430;&#x436;&#x434;&#x43E;&#x439; &#x43A;&#x43E;&#x43B;&#x43E;&#x43D;&#x43A;&#x438; &#x411;&#x414; &#x438; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x43E;&#x43C; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;. &#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x412; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x439; &#x441;&#x442;&#x430;&#x442;&#x44C;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x435;&#x43A;&#x43B;&#x430;&#x440;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x435; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x435;&#x439;. &#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x41F;&#x43E;&#x434;&#x440;&#x43E;&#x431;&#x43D;&#x435;&#x435; &#x3C;a href=&#x22;https:\u002F\u002Fdocs.sqlalchemy.org\u002Fen\u002F13\u002Form\u002Fextensions\u002Fdeclarative\u002Fapi.html#sqlalchemy.ext.declarative.declarative_base&#x22;&#x3E;&#x437;&#x434;&#x435;&#x441;&#x44C;&#x3C;\u002Fa&#x3E;&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;h3 id=&#x22;struktura-bd&#x22;&#x3E;&#x421;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x443;&#x440;&#x430; &#x411;&#x414;&#x3C;\u002Fh3&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x414;&#x43B;&#x44F; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x439; &#x43A;&#x43E;&#x43D;&#x441;&#x438;&#x441;&#x442;&#x435;&#x43D;&#x442;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x434;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x434;&#x438;&#x43C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x435; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x44B;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x411;&#x430;&#x437;&#x43E;&#x432;&#x430;&#x44F; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x44C; &#x441;&#x43B;&#x443;&#x436;&#x438;&#x442; &#x434;&#x43B;&#x44F; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x431;&#x430;&#x437;&#x43E;&#x432;&#x44B;&#x445; &#x43A;&#x43E;&#x43B;&#x43E;&#x43D;&#x43E;&#x43A; &#x432; &#x411;&#x414;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;plaintext&#x22;&#x3E;class BaseModel(Base):\n __abstract__ = True\n\n id = Column(Integer, nullable=False, unique=True, primary_key=True, autoincrement=True)\n created_at = Column(TIMESTAMP, nullable=False)\n updated_at = Column(TIMESTAMP, nullable=False)\n\n def __repr__(self):\n return &#x22;&#x26;lt;{0.__class__.__name__}(id={0.id!r})&#x3E;&#x22;.format(self)&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;Employee &#x2014; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x430;, &#x43E;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x44E;&#x449;&#x430;&#x44F; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x43D;&#x438;&#x43A;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x432; &#x43E;&#x444;&#x438;&#x441;&#x435;&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;plaintext&#x22;&#x3E;class Employee(BaseModel):\n __tablename__ = &#x27;employees&#x27;\n\n first_name = Column(VARCHAR(255), nullable=False)\n last_name = Column(VARCHAR(255), nullable=False)\n phone = Column(VARCHAR(255), unique=True, nullable=True)\n description = Column(VARCHAR(255), nullable=True)&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;EmployeeWithSkills &#x2014; &#x43D;&#x435; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x430;. &#x41A;&#x43B;&#x430;&#x441;&#x441; &#x43D;&#x430;&#x441;&#x43B;&#x435;&#x434;&#x443;&#x435;&#x43C;&#x44B;&#x439; &#x43E;&#x442; Employee. &#x41E;&#x442;&#x43B;&#x438;&#x447;&#x43D;&#x430;&#x44F; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x438;&#x442;&#x44C; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x443; &#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43A;&#x43B;&#x430;&#x441;&#x441;, &#x431;&#x443;&#x434;&#x442;&#x43E; &#x44D;&#x442;&#x43E; &#x43E;&#x442;&#x434;&#x435;&#x43B;&#x44C;&#x43D;&#x430;&#x44F; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x430;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;plaintext&#x22;&#x3E;class EmployeeWithSkills(Employee):\n skills = relation(Skill, secondary=EmployeesSkills.__tablename__, lazy=&#x27;joined&#x27;)&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;Department &#x2014; &#x43E;&#x442;&#x434;&#x435;&#x43B;, &#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x44D;&#x442;&#x43E;&#x442; &#x441;&#x43E;&#x442;&#x440;&#x443;&#x434;&#x43D;&#x438;&#x43A;. &#x427;&#x435;&#x43B;&#x43E;&#x432;&#x435;&#x43A; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x442;&#x44C; &#x432; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x438;&#x445; &#x43E;&#x442;&#x434;&#x435;&#x43B;&#x430;&#x445;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;plaintext&#x22;&#x3E;class Department(BaseModel):\n __tablename__ = &#x27;departments&#x27;\n\n name = Column(VARCHAR(255), nullable=False)\n description = Column(VARCHAR(255), nullable=False)&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x422;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x430; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x438;&#x439; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x43D;&#x438;&#x43A;&#x430; &#x438; &#x43F;&#x43E;&#x434;&#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x439;, &#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x43E;&#x43D; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x438;&#x442;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;plaintext&#x22;&#x3E;class EmployeeDepartments(BaseModel):\n __tablename__ = &#x27;employee_departments&#x27;\n\n employee_id = Column(Integer, ForeignKey(&#x27;employees.id&#x27;, ondelete=&#x27;CASCADE&#x27;), nullable=False, index=True)\n department_id = Column(Integer, ForeignKey(&#x27;departments.id&#x27;, ondelete=&#x27;CASCADE&#x27;), nullable=False, index=True)&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x422;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x430; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x438;&#x439; &#x441;&#x43E;&#x442;&#x440;&#x443;&#x434;&#x43D;&#x438;&#x43A;&#x43E;&#x432; &#x438; &#x438;&#x445; &#x443;&#x43C;&#x435;&#x43D;&#x438;&#x439;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;plaintext&#x22;&#x3E;class EmployeesSkills(BaseModel):\n__tablename__ = &#x27;employees_skills&#x27;\n\nemployee_id = Column(ForeignKey(&#x27;employee.id&#x27;, ondelete=&#x27;CASCADE&#x27;), nullable=False, index=True)\nskill_id = Column(ForeignKey(&#x27;skills.id&#x27;, ondelete=&#x27;CASCADE&#x27;), nullable=False, index=True)&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x43C;&#x438;&#x433;&#x440;&#x430;&#x446;&#x438;&#x438; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x43F;&#x430;&#x43A;&#x435;&#x442;&#x430; alembic, &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x44E;&#x449;&#x435;&#x433;&#x43E; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x438;&#x445; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;. &#x412; &#x440;&#x430;&#x43C;&#x43A;&#x430;&#x445; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x443;&#x440;&#x43E;&#x43A;&#x430; &#x430;&#x432;&#x442;&#x43E;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x43C;&#x438;&#x433;&#x440;&#x430;&#x446;&#x438;&#x439; &#x432;&#x43F;&#x43E;&#x43B;&#x43D;&#x435; &#x434;&#x43E;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x43C;&#x430;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x412; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x435;&#x439; &#x43C;&#x438;&#x433;&#x440;&#x430;&#x446;&#x438;&#x438; &#x43F;&#x440;&#x438;&#x441;&#x443;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x442; &#x442;&#x435;&#x441;&#x442;&#x43E;&#x432;&#x44B;&#x435; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43D;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x442; &#x431;&#x430;&#x437;&#x443;.&#x3C;br\u002F&#x3E;\r\n&#x41A;&#x430;&#x43A; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x44C; alembic &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C; &#x3C;a href=&#x22;https:\u002F\u002Falembic.sqlalchemy.org\u002Fen\u002Flatest\u002F&#x22;&#x3E;&#x437;&#x434;&#x435;&#x441;&#x44C;&#x3C;\u002Fa&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x412;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x43C; &#x437;&#x430;&#x432;&#x435;&#x442;&#x43D;&#x44B;&#x435; alembic upgrade head, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x44C; &#x43C;&#x438;&#x433;&#x440;&#x430;&#x446;&#x438;&#x44E;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;h3 id=&#x22;zaprosy-i-relations&#x22;&#x3E;&#x417;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x44B; &#x438; relations&#x3C;\u002Fh3&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x414;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x435;&#x43C; &#x43F;&#x435;&#x440;&#x432;&#x44B;&#x439; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x438; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x43C; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x44E; &#x43E; &#x441;&#x43E;&#x442;&#x440;&#x443;&#x434;&#x43D;&#x438;&#x43A;&#x435; &#x43F;&#x43E; &#x435;&#x433;&#x43E; id.&#x3C;br\u002F&#x3E;\r\n&#x417;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x431;&#x443;&#x434;&#x435;&#x442; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x435;&#x442;&#x44C; &#x442;&#x430;&#x43A;:&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;lesson1:&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;plaintext&#x22;&#x3E;employee = session.query(Employee).filter(Employee.id == eid).one()\n\noutput:\n ID: 2, Tony Stark&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x3C;code&#x3E;.one()&#x3C;\u002Fcode&#x3E; &#x432; &#x43A;&#x43E;&#x43D;&#x446;&#x435; &#x43E;&#x431;&#x43E;&#x437;&#x43D;&#x430;&#x447;&#x430;&#x435;&#x442;, &#x447;&#x442;&#x43E; &#x43C;&#x44B; &#x43D;&#x430;&#x43C;&#x435;&#x440;&#x435;&#x43D;&#x44B; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43E;&#x434;&#x43D;&#x443; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x44C;. &#x415;&#x441;&#x43B;&#x438; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x435;&#x439; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E;, &#x432;&#x43E;&#x437;&#x43D;&#x438;&#x43A;&#x43D;&#x435;&#x442; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x435;&#x435; &#x438;&#x441;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x435;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x415;&#x441;&#x43B;&#x438; &#x43C;&#x44B; &#x437;&#x430;&#x445;&#x43E;&#x442;&#x438;&#x43C; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C; &#x432;&#x441;&#x435; &#x438;&#x43C;&#x435;&#x44E;&#x449;&#x438;&#x435;&#x441;&#x44F; &#x43E;&#x442;&#x434;&#x435;&#x43B;&#x44B;, &#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x432;&#x43E;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x43C; c &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; &#x3C;code&#x3E;.all()&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;lesson2:&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;plaintext&#x22;&#x3E;emmployee = session.query(Department).all()\n\noutput:\n ID: 2, name: Guards\n ID: 4, name: Legions&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x420;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x443; &#x441; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F;&#x43C;&#x438; &#x430;&#x433;&#x440;&#x435;&#x433;&#x430;&#x446;&#x438;&#x438;. &#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x41C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C; &#x43A;&#x43E;&#x43B;&#x438;&#x447;&#x435;&#x441;&#x442;&#x432;&#x43E; &#x438;&#x43C;&#x435;&#x44E;&#x449;&#x438;&#x445;&#x441;&#x44F; &#x434;&#x435;&#x43F;&#x430;&#x440;&#x442;&#x430;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x432;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x43D;&#x43E;&#x439; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438;&#x3C;br\u002F&#x3E;\r\n&#x3C;code&#x3E;.count()&#x3C;\u002Fcode&#x3E; &#x438;&#x43B;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x3C;code&#x3E;func.count()&#x3C;\u002Fcode&#x3E;. &#x421; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x432;&#x442;&#x43E;&#x440;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43E;&#x431;&#x440;&#x430;&#x449;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43A; &#x43B;&#x44E;&#x431;&#x44B;&#x43C; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F;&#x43C; SQL, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; &#x434;&#x43B;&#x44F; &#x3C;code&#x3E;select&#x3C;\u002Fcode&#x3E; &#x438;&#x43B;&#x438; &#x434;&#x43B;&#x44F; &#x432;&#x44B;&#x447;&#x438;&#x441;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x440;&#x43E;&#x43C;&#x435;&#x436;&#x443;&#x442;&#x43E;&#x447;&#x43D;&#x44B;&#x445; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x43E;&#x432;. &#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;lesson3:&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;plaintext&#x22;&#x3E;def get_departments_count(session: DBSession) -&#x3E; int:\n count = session.query(Department).count()\n\n return count\n\ndef get_departments_func_count(session: DBSession) -&#x3E; int:\n count = session.query(func.count(Department.id)).scalar()\n\n return count&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x41C;&#x43D;&#x43E;&#x433;&#x438;&#x435; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x442; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E; &#x3C;code&#x3E;count()&#x3C;\u002Fcode&#x3E; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x43D;&#x430;&#x43B;&#x438;&#x447;&#x438;&#x44F; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x432; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x435;. &#x42D;&#x442;&#x43E; &#x43D;&#x435; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x430;&#x44F; &#x43F;&#x440;&#x430;&#x43A;&#x442;&#x438;&#x43A;&#x430;, &#x43F;&#x43E;&#x440;&#x43E;&#x436;&#x434;&#x430;&#x44E;&#x449;&#x430;&#x44F; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x440;&#x435;&#x441;&#x443;&#x440;&#x441;&#x43E;&#x432; &#x411;&#x414; &#x438; &#x443;&#x432;&#x435;&#x43B;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x438; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;. &#x425;&#x43E;&#x440;&#x43E;&#x448;&#x438;&#x43C; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x431;&#x443;&#x434;&#x435;&#x442; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438; &#x3C;code&#x3E;exists()&#x3C;\u002Fcode&#x3E;, &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x44E;&#x449;&#x435;&#x439; &#x441;&#x43A;&#x430;&#x43B;&#x44F;&#x440;&#x43D;&#x43E;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435;:&#x3C;br\u002F&#x3E;\r\nlesson3:&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;plaintext&#x22;&#x3E;def check_department_exists(session: DBSession, department_name: str) -&#x3E; bool:\n\n is_exists = session.query(exists().where(Department.name == department_name)).scalar()\n\n return is_exists&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x414;&#x432;&#x438;&#x433;&#x430;&#x44F;&#x441;&#x44C; &#x434;&#x430;&#x43B;&#x44C;&#x448;&#x435;, &#x443;&#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x438;&#x43C; &#x437;&#x430;&#x434;&#x430;&#x447;&#x443; &#x438; &#x43F;&#x43E;&#x437;&#x43D;&#x430;&#x43A;&#x43E;&#x43C;&#x438;&#x43C;&#x441;&#x44F; &#x441; &#x441;&#x443;&#x449;&#x43D;&#x43E;&#x441;&#x442;&#x44C;&#x44E; &#x3C;code&#x3E;relation&#x3C;\u002Fcode&#x3E; &#x438;&#x43B;&#x438; &#x3C;code&#x3E;relationship&#x3C;\u002Fcode&#x3E;. &#x414;&#x435;&#x43B;&#x43E; &#x432; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; &#x432; &#x3C;code&#x3E;SQLAlchemy&#x3C;\u002Fcode&#x3E; &#x43A;&#x440;&#x43E;&#x43C;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; foreign_key&#x3C;br\u002F&#x3E;\r\n&#x43D;&#x430; &#x443;&#x440;&#x43E;&#x432;&#x43D;&#x435; &#x431;&#x430;&#x437;&#x44B; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x442;&#x441;&#x44F; &#x435;&#x449;&#x435; &#x438; &#x43E;&#x442;&#x43D;&#x43E;&#x448;&#x435;&#x43D;&#x438;&#x44F; &#x43C;&#x435;&#x436;&#x434;&#x443; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x430;&#x43C;&#x438;. &#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x422;&#x430;&#x43A;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x443;&#x44E; &#x43F;&#x43E; foreign key &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x443; &#x411;&#x414; &#x432; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x435;.&#x3C;br\u002F&#x3E;\r\n&#x42D;&#x442;&#x438; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x44B; &#x44F;&#x432;&#x43B;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x446;&#x438;&#x435;&#x439; &#x43D;&#x430; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x44B; &#x411;&#x414;, &#x441;&#x432;&#x44F;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x43C;&#x435;&#x436;&#x434;&#x443; &#x441;&#x43E;&#x431;&#x43E;&#x439;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x3C;code&#x3E;Relations&#x3C;\u002Fcode&#x3E; &#x432; &#x3C;code&#x3E;SQLAlchemy&#x3C;\u002Fcode&#x3E; &#x438;&#x43C;&#x435;&#x44E;&#x442; &#x433;&#x438;&#x431;&#x43A;&#x443;&#x44E; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x443;, &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x44F; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x442;&#x44C; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x438;&#x437; &#x411;&#x414; &#x440;&#x430;&#x437;&#x43D;&#x44B;&#x43C;&#x438; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x430;&#x43C;&#x438; &#x432; &#x440;&#x430;&#x437;&#x43D;&#x43E;&#x435; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x438;&#x43C;&#x435;&#x43D;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; &#x3C;code&#x3E;lazy&#x3C;\u002Fcode&#x3E;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x41E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x44B;&#x435; &#x441;&#x442;&#x435;&#x43F;&#x435;&#x43D;&#x438; &#x22;&#x43B;&#x435;&#x43D;&#x438;&#x432;&#x43E;&#x441;&#x442;&#x438;&#x22;:&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;ul&#x3E;\r\n&#x3C;li&#x3E;&#x3C;code&#x3E;select&#x3C;\u002Fcode&#x3E; &#x2014; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E;. ORM &#x434;&#x435;&#x43B;&#x430;&#x435;&#x442; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x442;&#x43E;&#x433;&#x434;&#x430;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x449;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x43A; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x43C;. &#x41E;&#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x442;&#x434;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x43C;.&#x3C;\u002Fli&#x3E;\r\n&#x3C;li&#x3E;&#x3C;code&#x3E;dynamic&#x3C;\u002Fcode&#x3E; &#x2014; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43C;&#x43E;&#x434;&#x438;&#x444;&#x438;&#x446;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x43E; &#x436;&#x435;&#x43B;&#x430;&#x43D;&#x438;&#x44E;. &#x41F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x442; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x438;&#x437; &#x411;&#x414; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430; all() &#x438;&#x43B;&#x438; one() &#x438;&#x43B;&#x438; &#x43B;&#x44E;&#x431;&#x44B;&#x445; &#x434;&#x440;&#x443;&#x433;&#x438;&#x445; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x44B;&#x445; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432;.&#x3C;\u002Fli&#x3E;\r\n&#x3C;li&#x3E;&#x3C;code&#x3E;joined&#x3C;\u002Fcode&#x3E; &#x2014; &#x432; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x439; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; LEFT JOIN. &#x412;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x441;&#x440;&#x430;&#x437;&#x443;.&#x3C;\u002Fli&#x3E;\r\n&#x3C;li&#x3E;&#x3C;code&#x3E;subquery&#x3C;\u002Fcode&#x3E; &#x2014; &#x43F;&#x43E;&#x445;&#x43E;&#x436; &#x43D;&#x430; select, &#x43D;&#x43E; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43A;&#x430;&#x43A; &#x43F;&#x43E;&#x434;&#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;.&#x3C;\u002Fli&#x3E;\r\n&#x3C;\u002Ful&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x41F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E; &#x2014; &#x3C;code&#x3E;select&#x3C;\u002Fcode&#x3E;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x424;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x432; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;&#x445; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x439; &#x438; &#x434;&#x438;&#x43D;&#x430;&#x43C;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x439;. &#x414;&#x438;&#x43D;&#x430;&#x43C;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x430;&#x44F; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x43D;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x44C; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x43C;&#x438;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x44F;&#x442;&#x44C;&#x441;&#x44F; &#x432; &#x437;&#x430;&#x432;&#x438;&#x441;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x43E;&#x442; &#x445;&#x43E;&#x434;&#x430; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;lesson4:&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;plaintext&#x22;&#x3E;def dynamic_filter(session: DBSession, filter: DFilter = None):\n\n query = session.query(Employee)\n\n if filter is not None:\n query = query.filter(*filter.conds)\n\n employees = query.all()\n\n return employees&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x412; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x435; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430; DFilter &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x44B; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B; &#x43D;&#x430; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x435; &#x43A;&#x430;&#x43A;&#x438;&#x445;-&#x43B;&#x438;&#x431;&#x43E; &#x432;&#x445;&#x43E;&#x434;&#x43D;&#x44B;&#x445; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;. &#x415;&#x441;&#x43B;&#x438; &#x43A;&#x43B;&#x430;&#x441;&#x441; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x451;&#x43D;, &#x43D;&#x43E; &#x434;&#x430;&#x43B;&#x435;&#x435; &#x432; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x435; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x443;&#x441;&#x43B;&#x43E;&#x432;&#x438;&#x44F;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x424;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F; .filter() &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442; &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442; &#x431;&#x438;&#x43D;&#x430;&#x440;&#x43D;&#x44B;&#x435; &#x443;&#x441;&#x43B;&#x43E;&#x432;&#x438;&#x44F; SQLAlchemy, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x430; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; * &#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x41F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x438;&#x43D;&#x430;&#x43C;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x445; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x444;&#x430;&#x43D;&#x442;&#x430;&#x437;&#x438;&#x435;&#x439;. &#x420;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442;, &#x43A;&#x430;&#x43A;&#x438;&#x435; &#x433;&#x435;&#x440;&#x43E;&#x438; &#x441;&#x435;&#x439;&#x447;&#x430;&#x441; &#x43D;&#x435;&#x430;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x44B;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;plaintext&#x22;&#x3E;output:\n Inactive_heros:\n Name: Tony Stark\n Name: Scott Lang\n Name: Peter Parker &#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x41F;&#x440;&#x435;&#x434;&#x43B;&#x430;&#x433;&#x430;&#x44E; &#x43F;&#x43E;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x442;&#x44C; &#x441; &#x43E;&#x442;&#x43D;&#x43E;&#x448;&#x435;&#x43D;&#x438;&#x435;&#x43C; many-to-many.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x41C;&#x44B; &#x438;&#x43C;&#x435;&#x435;&#x43C; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x443; Employee, &#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x439; &#x43F;&#x440;&#x438;&#x441;&#x443;&#x442;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442; relation &#x43A; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x435; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x438;&#x439; EmployeesSkills. &#x41E;&#x43D;&#x430; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; foreign_key &#x43D;&#x430; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x443; &#x441;&#x43E;&#x442;&#x440;&#x443;&#x434;&#x43D;&#x438;&#x43A;&#x43E;&#x432; &#x438; foreign_key&#x3C;br\u002F&#x3E;\r\n&#x43D;&#x430; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x443; &#x443;&#x43C;&#x435;&#x43D;&#x438;&#x439;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;lesson 5:&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;plaintext&#x22;&#x3E;def get_employee_with_skills(session: DBSession, eid: int):\n employee = session.query(EmployeeWithSkills).filter(EmployeeWithSkills.id == eid).one()\n\n return employee\n\noutput:\n Employee Tony Stark has skills:\n Skill: Fly, Desc: I belive I can Fly. I belive I can touch the sky\n Skill: Light Shield, Desc: Light protect. Perfect for everything&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; &#x43A;&#x43B;&#x430;&#x441;&#x441; EmployeeWithSkills &#x432; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x435; &#x432;&#x44B;&#x448;&#x435;, &#x43C;&#x44B; &#x43E;&#x431;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C;&#x441;&#x44F; &#x43A; &#x43D;&#x435;&#x43C;&#x443;, &#x43A;&#x430;&#x43A; &#x43A; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x435; &#x411;&#x414;, &#x43D;&#x43E; &#x43D;&#x430; &#x441;&#x430;&#x43C;&#x43E;&#x43C; &#x434;&#x435;&#x43B;&#x435; &#x442;&#x430;&#x43A;&#x43E;&#x439; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x44B; &#x43D;&#x435; &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442;. &#x42D;&#x442;&#x43E; &#x43A;&#x43B;&#x430;&#x441;&#x441; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x442; Employee &#x43D;&#x430;&#x43B;&#x438;&#x447;&#x438;&#x435; relation, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x438;&#x43C;&#x435;&#x435;&#x442; &#x43E;&#x442;&#x43D;&#x43E;&#x448;&#x435;&#x43D;&#x438;&#x435; many-to-many. &#x422;&#x430;&#x43A; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x440;&#x430;&#x437;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x443; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x43E;&#x432;, &#x43D;&#x430;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x44F; &#x440;&#x430;&#x437;&#x43D;&#x44B;&#x43C; &#x43D;&#x430;&#x431;&#x43E;&#x440;&#x43E;&#x43C; relations. &#x412; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x43C;&#x44B; &#x443;&#x432;&#x438;&#x434;&#x438;&#x43C; &#x443;&#x43C;&#x435;&#x43D;&#x438;&#x44F; &#x43E;&#x434;&#x43D;&#x43E;&#x433;&#x43E; &#x438;&#x437; &#x441;&#x43E;&#x442;&#x440;&#x443;&#x434;&#x43D;&#x438;&#x43A;&#x43E;&#x432;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x422;&#x430;&#x43A; &#x43A;&#x430;&#x43A; &#x441;&#x43E;&#x442;&#x440;&#x443;&#x434;&#x43D;&#x438;&#x43A; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x442;&#x44C; &#x432; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x438;&#x445; &#x43F;&#x43E;&#x434;&#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x44F;&#x445;, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x434;&#x438;&#x43C; relation, &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x44E;&#x449;&#x438;&#x439; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C; &#x44D;&#x442;&#x443; &#x438;&#x43D;&#x444;&#x43E;&#x440;&#x43C;&#x430;&#x446;&#x438;&#x44E;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x421;&#x43E;&#x437;&#x434;&#x430;&#x434;&#x438;&#x43C; &#x43A;&#x43B;&#x430;&#x441;&#x441; EmployeeWithDepartments, &#x43D;&#x430;&#x441;&#x43B;&#x435;&#x434;&#x443;&#x435;&#x43C;&#x44B;&#x439; &#x43E;&#x442; Employee &#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x435;:&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;plaintext&#x22;&#x3E;class EmployeeWithDepartments(Employee):\n departments = relation(\n Department,\n # primaryjoin=EmployeeDepartments.employee_id == Employee.id,\n secondary=EmployeeDepartments.__tablename__,\n # secondaryjoin=EmployeeDepartments.department_id == Department.id,\n )&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x421;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43A;&#x43B;&#x430;&#x441;&#x441; &#x43D;&#x435; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x43E;&#x432;&#x43E;&#x439; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x435;&#x439; &#x411;&#x414;. &#x42D;&#x442;&#x43E; &#x432;&#x441;&#x435; &#x442;&#x430; &#x436;&#x435; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x430; Employee, &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x43D;&#x430;&#x44F; c &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x3C;code&#x3E;relation&#x3C;\u002Fcode&#x3E;. &#x422;&#x430;&#x43A;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;, &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x449;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43A; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x435; &#x3C;code&#x3E;Employee&#x3C;\u002Fcode&#x3E; &#x438;&#x43B;&#x438; &#x3C;code&#x3E;EmployeeWithDepartments&#x3C;\u002Fcode&#x3E; &#x432; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;&#x445;. &#x420;&#x430;&#x437;&#x43D;&#x438;&#x446;&#x430; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43B;&#x438;&#x448;&#x44C; &#x432; &#x43E;&#x442;&#x441;&#x443;&#x442;&#x441;&#x442;&#x432;&#x438;&#x438;\u002F&#x43D;&#x430;&#x43B;&#x438;&#x447;&#x438;&#x438; &#x3C;code&#x3E;relation&#x3C;\u002Fcode&#x3E;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x41F;&#x435;&#x440;&#x432;&#x44B;&#x439; &#x430;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442; &#x443;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43A; &#x43A;&#x430;&#x43A;&#x43E;&#x439; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x435; &#x43C;&#x44B; &#x431;&#x443;&#x434;&#x435;&#x43C; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x432;&#x430;&#x442;&#x44C; &#x3C;code&#x3E;relation&#x3C;\u002Fcode&#x3E;.&#x3C;br\u002F&#x3E;\r\n&#x3C;code&#x3E;primaryjoin&#x3C;\u002Fcode&#x3E; &#x2014; &#x44D;&#x442;&#x43E; &#x443;&#x441;&#x43B;&#x43E;&#x432;&#x438;&#x435;, &#x43F;&#x43E; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C;&#x443; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x432;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x430; &#x434;&#x43E; &#x435;&#x451; &#x43F;&#x440;&#x438;&#x441;&#x43E;&#x435;&#x434;&#x438;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x43A; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x443;.&#x3C;br\u002F&#x3E;\r\n&#x3C;code&#x3E;secondary&#x3C;\u002Fcode&#x3E; &#x2014; &#x438;&#x43C;&#x44F; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x44B;, &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x430;&#x449;&#x435;&#x435; foreign_keys &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F;. &#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; many-to-many.&#x3C;br\u002F&#x3E;\r\n&#x3C;code&#x3E;secondaryjoin&#x3C;\u002Fcode&#x3E; &#x2014; &#x443;&#x441;&#x43B;&#x43E;&#x432;&#x438;&#x44F; &#x441;&#x43E;&#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x440;&#x43E;&#x43C;&#x435;&#x436;&#x443;&#x442;&#x43E;&#x447;&#x43D;&#x43E;&#x439; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x44B; &#x441; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x435;&#x439;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x3C;code&#x3E;primaryjoin&#x3C;\u002Fcode&#x3E; &#x438; &#x3C;code&#x3E;secondaryjoin&#x3C;\u002Fcode&#x3E; &#x441;&#x43B;&#x443;&#x436;&#x430;&#x442; &#x434;&#x43B;&#x44F; &#x44F;&#x432;&#x43D;&#x43E;&#x433;&#x43E; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x438;&#x44F; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x438;&#x439; &#x432; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x44B;&#x445; &#x441;&#x438;&#x442;&#x443;&#x430;&#x446;&#x438;&#x44F;&#x445;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x41F;&#x43E;&#x440;&#x43E;&#x439; &#x432;&#x43E;&#x437;&#x43D;&#x438;&#x43A;&#x430;&#x44E;&#x442; &#x441;&#x438;&#x442;&#x443;&#x430;&#x446;&#x438;&#x438;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x432;&#x430;&#x442;&#x44C; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x44B;, &#x43F;&#x43E;&#x43B;&#x44F; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x43E;&#x431;&#x44A;&#x44F;&#x432;&#x43B;&#x435;&#x43D;&#x44B; &#x432; &#x43E;&#x442;&#x43D;&#x43E;&#x448;&#x435;&#x43D;&#x438;&#x44F;&#x445;, &#x430; &#x43E;&#x442;&#x43D;&#x43E;&#x448;&#x435;&#x43D;&#x438;&#x44F; &#x432; &#x441;&#x432;&#x43E;&#x44E; &#x43E;&#x447;&#x435;&#x440;&#x435;&#x434;&#x44C; &#x44F;&#x432;&#x43B;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x43E;&#x442;&#x43D;&#x43E;&#x448;&#x435;&#x43D;&#x438;&#x44F;&#x43C;&#x438; &#x438;&#x441;&#x445;&#x43E;&#x434;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x430;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;plaintext&#x22;&#x3E;EmployeeWithCadreMovements -&#x3E; relation(CadreMovement) -&#x3E; field&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x415;&#x441;&#x43B;&#x438; &#x43E;&#x442;&#x43D;&#x43E;&#x448;&#x435;&#x43D;&#x438;&#x435; &#x43E;&#x442;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x430;&#x435;&#x442; &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439;, &#x442;&#x43E; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; .any(), &#x435;&#x441;&#x43B;&#x438; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x435;&#x434;&#x443;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x435;&#x43D;&#x43E; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43E;&#x434;&#x43D;&#x43E;, &#x442;&#x43E; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; .has()&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x414;&#x43B;&#x44F; &#x43B;&#x443;&#x447;&#x448;&#x435;&#x433;&#x43E; &#x43F;&#x43E;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x44F;, &#x434;&#x430;&#x43D;&#x43D;&#x430;&#x44F; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x446;&#x438;&#x44F; &#x431;&#x443;&#x434;&#x435;&#x442; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x43F;&#x440;&#x435;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x430; &#x43D;&#x430; SQL &#x44F;&#x437;&#x44B;&#x43A;&#x430; &#x432; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x446;&#x438;&#x44E; exists().&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x412;&#x44B;&#x437;&#x43E;&#x432;&#x435;&#x43C; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x441; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x438;&#x435;&#x43C; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; &#x43F;&#x440;&#x438;&#x447;&#x438;&#x43D;&#x44B; &#x3C;code&#x3E;reason&#x3C;\u002Fcode&#x3E;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x3C;code&#x3E;simple&#x3C;\u002Fcode&#x3E;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;lesson6&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;plaintext&#x22;&#x3E;def has_in_relations(session: DBSession, reason: str):\n employees = session.query(EmployeeWithCadreMovements).filter(EmployeeWithCadreMovements.cadre_movements.any(CadreMovement.reason == reason)).all()\n return employees\n\noutput:\n [Steve Rogers, Tony Stark]&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;lession7&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x420;&#x430;&#x441;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x438;&#x44F; relation &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438; &#x430;&#x433;&#x440;&#x435;&#x433;&#x430;&#x446;&#x438;&#x438;. &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x43C; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x435;&#x435; &#x43A;&#x430;&#x434;&#x440;&#x43E;&#x432;&#x43E;&#x435; &#x434;&#x432;&#x438;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F;.&#x3C;br\u002F&#x3E;\r\nprimaryjoin &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x443;&#x441;&#x43B;&#x43E;&#x432;&#x438;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x441;&#x43E;&#x435;&#x434;&#x438;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446; (&#x432; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; lazy=&#x27;joined&#x27;). &#x41D;&#x430;&#x43F;&#x43E;&#x43C;&#x43D;&#x438;&#x43C;, &#x447;&#x442;&#x43E; &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x442;&#x441;&#x44F; select.&#x3C;br\u002F&#x3E;\r\n&#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;, &#x444;&#x43E;&#x440;&#x43C;&#x438;&#x440;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x442;&#x434;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x43F;&#x440;&#x438; &#x43E;&#x431;&#x440;&#x430;&#x449;&#x435;&#x43D;&#x438;&#x438; &#x43A; &#x430;&#x442;&#x440;&#x438;&#x431;&#x443;&#x442;&#x443; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x430;. &#x418;&#x43C;&#x435;&#x43D;&#x43D;&#x43E; &#x434;&#x43B;&#x44F; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430; &#x43C;&#x44B; &#x438; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x442;&#x44C; &#x443;&#x441;&#x43B;&#x43E;&#x432;&#x438;&#x44F; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438;.&#x3C;br\u002F&#x3E;\r\n&#x41A;&#x430;&#x43A; &#x438;&#x437;&#x432;&#x435;&#x441;&#x442;&#x43D;&#x43E;, &#x43D;&#x435;&#x43B;&#x44C;&#x437;&#x44F; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438; &#x430;&#x433;&#x440;&#x435;&#x433;&#x430;&#x446;&#x438;&#x438; &#x432; &#x22;&#x447;&#x438;&#x441;&#x442;&#x43E;&#x43C;&#x22; &#x432;&#x438;&#x434;&#x435; &#x432; WHERE &#x443;&#x441;&#x43B;&#x43E;&#x432;&#x438;&#x438;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43C;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x43C; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x434;&#x430;&#x43D;&#x43D;&#x443;&#x44E; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C;, &#x443;&#x43A;&#x430;&#x437;&#x430;&#x432; relation&#x3C;br\u002F&#x3E;\r\n&#x441;&#x43E; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x43C;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430;&#x43C;&#x438;:&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;plaintext&#x22;&#x3E;last_cadre_movement = relation(\n CadreMovement,\n primaryjoin=and_(\n CadreMovement.employee == Employee.id,\n uselist=False,\n CadreMovement.id == select([func.max(CadreMovement.id)]).where(CadreMovement.employee == Employee.id)\n )\n)&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x41F;&#x440;&#x438; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x441;&#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x438;&#x440;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x442;&#x430;&#x43A;:&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;plaintext&#x22;&#x3E;SELECT \n cadre_movements.id AS cadre_movements_id, \n cadre_movements.created_at AS cadre_movements_created_at, \n cadre_movements.updated_at AS cadre_movements_updated_at, \n cadre_movements.employee AS cadre_movements_employee, \n cadre_movements.old_department AS cadre_movements_old_department, \n cadre_movements.new_department AS cadre_movements_new_department, \n cadre_movements.reason AS cadre_movements_reason \nFROM cadre_movements \nWHERE cadre_movements.employee = %(param_1)s \n AND cadre_movements.id = (\n SELECT max(cadre_movements.id) AS max_1 \n FROM cadre_movements \n WHERE cadre_movements.employee = %(param_1)s\n )&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x3C;a href=&#x22;https:\u002F\u002Fgithub.com\u002Fsandix90\u002Fsqlalchemy_basics&#x22;&#x3E;&#x421;&#x441;&#x44B;&#x43B;&#x43A;&#x430; &#x43D;&#x430; github&#x3C;\u002Fa&#x3E;&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;h3 id=&#x22;itog&#x22;&#x3E;&#x418;&#x442;&#x43E;&#x433;&#x3C;\u002Fh3&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;SQLAlchemy &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43C;&#x43E;&#x449;&#x43D;&#x435;&#x439;&#x448;&#x438;&#x43C; &#x438;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x43C; &#x432; &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x438;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x443;&#x43C;&#x435;&#x43D;&#x44C;&#x448;&#x430;&#x435;&#x442; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438;, &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x44F; &#x43D;&#x430;&#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;.&#x3C;\u002Fp&#x3E;&#x3C;br\u002F&#x3E;\r\n&#x3C;p&#x3E;&#x41D;&#x43E; &#x441;&#x442;&#x43E;&#x438;&#x442; &#x441;&#x43E;&#x431;&#x43B;&#x44E;&#x434;&#x430;&#x442;&#x44C; &#x442;&#x43E;&#x43D;&#x43A;&#x443;&#x44E; &#x433;&#x440;&#x430;&#x43D;&#x44C; &#x43C;&#x435;&#x436;&#x434;&#x443; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; ORM &#x438; &#x43D;&#x430;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435;&#x43C; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x44B;&#x445; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432;. &#x412; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x44F;&#x445; ORM &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x437;&#x430;&#x43F;&#x443;&#x442;&#x430;&#x442;&#x44C; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x438;&#x43B;&#x438; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x43A;&#x43E;&#x434; &#x433;&#x440;&#x43E;&#x43C;&#x43E;&#x437;&#x434;&#x43A;&#x438;&#x43C; &#x438; &#x43D;&#x435;&#x447;&#x438;&#x442;&#x430;&#x435;&#x43C;&#x44B;&#x43C;.&#x3C;br\u002F&#x3E;\r\n&#x423;&#x434;&#x430;&#x447;&#x438;!&#x3C;\u002Fp&#x3E;&#x3C;\u002Fdiv&#x3E;","date":"2019-10-06T07:39:29.000Z","favoritesCount":58,"flags":[],"flows":[{"alias":"develop","id":"1","name":"Разработка","path":"\u002Fflows\u002Fdevelop\u002F","route":{"name":"articles_list_by_flow","params":{"flowName":"develop"}}}],"hubs":[{"alias":"python","id":340,"image":"https:\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Fhub\u002F1c6\u002F724\u002F437\u002F1c6724437b83f3d71abd08e5c2877a7a.png","isSubscribed":false,"route":{"name":"articles_list_by_hub","params":{"name":"python","hl":"ru"}},"shortInfo":"Высокоуровневый язык программирования","title":"Python","flow":{"alias":"develop","id":"1","name":"Разработка","path":"\u002Fflows\u002Fdevelop\u002F","route":{"name":"articles_list_by_flow","params":{"flowName":"develop"}}},"isCompany":false,"meta":{},"ratingScore":239},{"alias":"postgresql","id":358,"image":"https:\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Fhub\u002F391\u002F633\u002F8e2\u002F3916338e24104572809b971807686a8f.png","isSubscribed":false,"route":{"name":"articles_list_by_hub","params":{"name":"postgresql","hl":"ru"}},"shortInfo":"Свободная объектно-реляционная СУБД","title":"PostgreSQL","flow":{"alias":"develop","id":"1","name":"Разработка","path":"\u002Fflows\u002Fdevelop\u002F","route":{"name":"articles_list_by_flow","params":{"flowName":"develop"}}},"isCompany":false,"meta":{},"ratingScore":31},{"alias":"sql","id":594,"image":"https:\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Fhub\u002F64b\u002F22b\u002F8b6\u002F64b22b8b6c4677778423e971d52eb05d.png","isSubscribed":false,"route":{"name":"articles_list_by_hub","params":{"name":"sql","hl":"ru"}},"shortInfo":"Формальный непроцедурный язык программирования","title":"SQL","flow":{"alias":"develop","id":"1","name":"Разработка","path":"\u002Fflows\u002Fdevelop\u002F","route":{"name":"articles_list_by_flow","params":{"flowName":"develop"}}},"isCompany":false,"meta":{},"ratingScore":49}],"id":"470285","isBookmarked":false,"isMegapost":false,"isCorporative":false,"isNews":false,"metadata":{"description":"Доброго дня. Сегодня хочу рассказать про ORM SQLAlchemy. Поговорим о том, что это, про его возможности и гибкость, а также рассмотрим случаи, которые не всегда...","images":[],"isShowBanners":true,"pageType":"publish_ugc_ru","scripts":[],"styles":[]},"origin":null,"route":{"name":"article_comments","params":{"id":"470285","companyName":""}},"score":5,"tags":[{"name":"sqlalchemy"},{"name":"python"},{"name":"postgresql"}],"title":"Крадущийся тигр, затаившийся SQLAlchemy. Основы","url":"https:\u002F\u002Fhabr.com\u002Fru\u002Fpost\u002F470285\u002F","viewsCount":2766,"votes":{"isEnabled":true,"voteState":0},"lang":"ru","hasPolls":false,"polls":{}}},"articlesIds":{},"isLoading":false,"pagesCount":{},"route":{"name":"article_comments","params":{"hl":"ru","id":"470285"}},"karma":{}},"comments":{"commentsList":[{"author":{"alias":"Andy_U","image":"https:\u002F\u002Fhabr.com\u002Fimages\u002Favatars\u002Fstub-user-middle.gif","route":{"name":"user_profile","params":{"login":"Andy_U","hl":"ru"}},"karmaScore":0,"type":{},"username":"Andy_U","fl":null,"hl":null,"isTopicAuthor":false,"imageSrc":"https:\u002F\u002Fhabr.com\u002Fimages\u002Favatars\u002Fstub-user-middle.gif","userpic":"https:\u002F\u002Fhabr.com\u002Fimages\u002Favatars\u002Fstub-user-middle.gif"},"canReply":true,"content":"&#x3C;div xmlns=&#x22;http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml&#x22;&#x3E;&#x41E;&#x434;&#x438;&#x43D; &#x44F; &#x43D;&#x435; &#x437;&#x43D;&#x430;&#x43B;, &#x447;&#x442;&#x43E; &#x442;&#x430;&#x43A; &#x43C;&#x43E;&#x436;&#x43D;&#x43E;?&#x3C;br\u002F&#x3E;\r\n&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;python&#x22;&#x3E; def __repr__(self):\n return &#x22;&#x26;lt;{0.__class__.__name__}(id={0.id!r})&#x3E;&#x22;.format(self)&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;\u002Fdiv&#x3E;","countCollapsed":0,"datetime_published":"2019-10-06T10:39:53.000Z","id":20718557,"indent_level":0,"isCollapsed":false,"isBookmarked":false,"isNew":0,"isReadonly":false,"isUfo":false,"parent_id":0,"rating":0,"hasChildren":true,"hasCollapsed":false,"votes":{"isEnabled":true,"voteState":0},"attachedForm":null,"backTo":null,"isVotesSwitcherOpened":false,"parentComment":null},{"author":{"alias":"onegreyonewhite","image":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002Ffa9\u002F942\u002Ff93\u002Ffa9942f936a90d8c8e53832682f0290e.png","route":{"name":"user_profile","params":{"login":"onegreyonewhite","hl":"ru"}},"karmaScore":0,"type":{},"username":"onegreyonewhite","fl":null,"hl":null,"isTopicAuthor":false,"imageSrc":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002Ffa9\u002F942\u002Ff93\u002Ffa9942f936a90d8c8e53832682f0290e.png","userpic":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002Ffa9\u002F942\u002Ff93\u002Ffa9942f936a90d8c8e53832682f0290e.png"},"canReply":true,"content":"&#x3C;div xmlns=&#x22;http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml&#x22;&#x3E;&#x3C;p&#x3E;&#x421;&#x443;&#x434;&#x44F; &#x43F;&#x43E; &#x432;&#x441;&#x435;&#x43C;&#x443; &#x434;&#x430;.&#x3C;br\u002F&#x3E;\r\n&#x412;&#x43E;&#x43E;&#x431;&#x449;&#x435; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x434;&#x430;&#x436;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x43B;&#x43E;&#x432;&#x430;&#x440;&#x44F; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C; &#x43F;&#x43E; &#x43A;&#x43B;&#x44E;&#x447;&#x443; (&#x43F;&#x438;&#x448;&#x438;&#x442;&#x435; &#x442;&#x430;&#x43A; &#x436;&#x435; &#x43A;&#x432;&#x430;&#x434;&#x440;&#x430;&#x442;&#x43D;&#x44B;&#x435; &#x441;&#x43A;&#x43E;&#x431;&#x43A;&#x438;, &#x43D;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x43B;&#x44E;&#x447;&#x430; &#x431;&#x435;&#x437; &#x43A;&#x430;&#x432;&#x44B;&#x447;&#x435;&#x43A;) &#x438;&#x43B;&#x438; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x430; &#x43F;&#x43E; &#x438;&#x43D;&#x434;&#x435;&#x43A;&#x441;&#x443;.&#x3C;\u002Fp&#x3E;&#x3C;\u002Fdiv&#x3E;","countCollapsed":0,"datetime_published":"2019-10-06T12:17:54.000Z","id":20718791,"indent_level":1,"isCollapsed":false,"isBookmarked":false,"isNew":0,"isReadonly":false,"isUfo":false,"parent_id":20718557,"rating":0,"hasChildren":true,"hasCollapsed":false,"votes":{"isEnabled":true,"voteState":0},"attachedForm":null,"backTo":null,"isVotesSwitcherOpened":false,"parentComment":null},{"author":{"alias":"Andy_U","image":"https:\u002F\u002Fhabr.com\u002Fimages\u002Favatars\u002Fstub-user-middle.gif","route":{"name":"user_profile","params":{"login":"Andy_U","hl":"ru"}},"karmaScore":0,"type":{},"username":"Andy_U","fl":null,"hl":null,"isTopicAuthor":false,"imageSrc":"https:\u002F\u002Fhabr.com\u002Fimages\u002Favatars\u002Fstub-user-middle.gif","userpic":"https:\u002F\u002Fhabr.com\u002Fimages\u002Favatars\u002Fstub-user-middle.gif"},"canReply":true,"content":"&#x3C;div xmlns=&#x22;http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml&#x22;&#x3E;&#x42F;, &#x447;&#x435;&#x441;&#x442;&#x43D;&#x43E; &#x433;&#x43E;&#x432;&#x43E;&#x440;&#x44F;, &#x43D;&#x435; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x432;&#x43D;&#x438;&#x43C;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x434;&#x43E;&#x43A;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x446;&#x438;&#x44E; &#x447;&#x438;&#x442;&#x430;&#x43B;, &#x43D;&#x43E; &#x43D;&#x435; &#x43F;&#x43E;&#x43C;&#x43D;&#x44E; &#x442;&#x430;&#x43C; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x44F; &#x442;&#x430;&#x43A;&#x43E;&#x433;&#x43E; &#x442;&#x440;&#x44E;&#x43A;&#x430;. &#x41D;&#x443; &#x438; &#x432;&#x43E;&#x43E;&#x431;&#x449;&#x435;, &#x44D;&#x442;&#x43E; &#x43A;&#x430;&#x43A;&#x430;&#x44F;-&#x442;&#x43E; &#x434;&#x432;&#x435;&#x440;&#x44C; &#x432; &#x430;&#x434;, &#x442;&#x438;&#x43F;&#x430; eval &#x438; exec:&#x3C;br\u002F&#x3E;\r\n&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;python&#x22;&#x3E;class Tst:\n\n def __init__(self):\n self._a = 1\n\n @property\n def a(self):\n print(&#x27;hahaha&#x27;)\n return self._a\n\n\nif __name__ == &#x27;__main__&#x27;:\n\n tst = Tst()\n print(&#x27;{0.a}&#x27;.format(tst))\n&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;\u002Fdiv&#x3E;","countCollapsed":0,"datetime_published":"2019-10-06T15:21:10.000Z","id":20719147,"indent_level":2,"isCollapsed":false,"isBookmarked":false,"isNew":0,"isReadonly":false,"isUfo":false,"parent_id":20718791,"rating":0,"hasChildren":true,"hasCollapsed":false,"votes":{"isEnabled":true,"voteState":0},"attachedForm":null,"backTo":null,"isVotesSwitcherOpened":false,"parentComment":null},{"author":{"alias":"onegreyonewhite","image":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002Ffa9\u002F942\u002Ff93\u002Ffa9942f936a90d8c8e53832682f0290e.png","route":{"name":"user_profile","params":{"login":"onegreyonewhite","hl":"ru"}},"karmaScore":0,"type":{},"username":"onegreyonewhite","fl":null,"hl":null,"isTopicAuthor":false,"imageSrc":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002Ffa9\u002F942\u002Ff93\u002Ffa9942f936a90d8c8e53832682f0290e.png","userpic":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002Ffa9\u002F942\u002Ff93\u002Ffa9942f936a90d8c8e53832682f0290e.png"},"canReply":true,"content":"&#x3C;div xmlns=&#x22;http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml&#x22;&#x3E;&#x3C;p&#x3E;&#x41A;&#x430;&#x43A; &#x43F;&#x43E; &#x43C;&#x43D;&#x435;, &#x434;&#x432;&#x435;&#x440;&#x44C;&#x44E; &#x432; &#x430;&#x434; &#x44F;&#x432;&#x43B;&#x44F;&#x44E;&#x442;&#x441;&#x44F; f-strings (Python&#x3E;=3.6), &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x443;&#x43F;&#x43E;&#x43C;&#x44F;&#x43D;&#x443;&#x43B;&#x438; &#x43D;&#x438;&#x436;&#x435;.&#x3C;br\u002F&#x3E;\r\n&#x422;&#x430;&#x43C; &#x43D;&#x430;&#x43F;&#x440;&#x44F;&#x43C;&#x443;&#x44E; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438; &#x43B;&#x435;&#x433;&#x43A;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C;.&#x3C;br\u002F&#x3E;\r\n&#x41F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x444;&#x43E;&#x440;&#x43C;&#x430;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43E;&#x431;&#x434;&#x443;&#x43C;&#x430;&#x43D;&#x43D;&#x43E; &#x438; &#x43D;&#x435; &#x444;&#x43E;&#x440;&#x43C;&#x430;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x438;&#x437;&#x432;&#x43D;&#x435;, &#x430; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x442;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x43C; &#x432;&#x44B; &#x434;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x442;&#x435; (&#x442;.&#x435;. &#x43D;&#x430;&#x445;&#x43E;&#x434;&#x44F;&#x449;&#x438;&#x43C;&#x441;&#x44F; &#x432;&#x43D;&#x443;&#x442;&#x440;&#x438; &#x43A;&#x43E;&#x434;&#x430;).&#x3C;\u002Fp&#x3E;&#x3C;\u002Fdiv&#x3E;","countCollapsed":0,"datetime_published":"2019-10-07T00:21:28.000Z","id":20720189,"indent_level":3,"isCollapsed":false,"isBookmarked":false,"isNew":0,"isReadonly":false,"isUfo":false,"parent_id":20719147,"rating":0,"hasChildren":true,"hasCollapsed":false,"votes":{"isEnabled":true,"voteState":0},"attachedForm":null,"backTo":null,"isVotesSwitcherOpened":false,"parentComment":null},{"author":{"alias":"Tihon_V","image":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002F246\u002Fb53\u002Fa61\u002F246b53a61e696f4bd9b14e73095f2e6d.png","route":{"name":"user_profile","params":{"login":"Tihon_V","hl":"ru"}},"karmaScore":0,"type":{},"username":"Tihon_V","fl":null,"hl":null,"isTopicAuthor":false,"imageSrc":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002F246\u002Fb53\u002Fa61\u002F246b53a61e696f4bd9b14e73095f2e6d.png","userpic":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002F246\u002Fb53\u002Fa61\u002F246b53a61e696f4bd9b14e73095f2e6d.png"},"canReply":true,"content":"&#x3C;div xmlns=&#x22;http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml&#x22;&#x3E;&#x41A;&#x430;&#x43A; &#x43F;&#x43E; &#x43C;&#x43D;&#x435; &#x2014; f-strings &#x442;&#x443;&#x442; &#x43A; &#x43C;&#x435;&#x441;&#x442;&#x443;&#x3C;br\u002F&#x3E;\r\n&#x3C;pre&#x3E;&#x3C;code class=&#x22;python&#x22;&#x3E;def __repr__(self):\n return f&#x22;&#x26;lt;{type(self).__name__}(id={self.id})&#x3E;&#x22;\n&#x3C;\u002Fcode&#x3E;&#x3C;\u002Fpre&#x3E;&#x3C;\u002Fdiv&#x3E;","countCollapsed":0,"datetime_published":"2019-10-06T14:02:53.000Z","id":20719013,"indent_level":1,"isCollapsed":false,"isBookmarked":false,"isNew":0,"isReadonly":false,"isUfo":false,"parent_id":20718557,"rating":1,"hasChildren":true,"hasCollapsed":false,"votes":{"isEnabled":true,"voteState":0},"attachedForm":null,"backTo":null,"isVotesSwitcherOpened":false,"parentComment":null}],"commentWithFormCache":null,"isFormDisabled":false,"previewComment":null,"pageArticleComments":{"freshComments":[],"lastViewedComment":0,"postId":"470285"}},"companies":{"profilesList":{"isLoading":false,"items":[],"cache":{"key":null,"page":null,"flowAlias":null,"timestamp":null},"pagesCount":0}},"companyProfile":{"categoryProfile":{"profileData":null}},"desktopState":{"desktopFl":null,"desktopHl":null,"isChecked":false,"isLoginDemanded":false},"dfp":{"slotsDict":{}},"flows":{"flows":[]},"hubPage":{"categoryProfile":{"profileData":null}},"hubs":{"profilesList":{"isLoading":false,"items":[],"cache":{"key":null,"page":null,"flowAlias":null,"timestamp":null},"pagesCount":0}},"i18n":{"fl":"ru","hl":"ru","messages":{"Already voted":"Вы уже проголосовали","ARTICLE_COMMENTS_COUNT":"{count, plural,\n=0 { Комментировать }\nother { Комментарии { count } }\n}","ARTICLE_COMMENTS_TITLE":"Комментарии","ARTICLE_DONATE_TITLE":"Поддержать автора","ARTICLE_DONATE_BUTTON":"Отправить деньги ","ARTICLE_DONATE_POPUP":"Платежная система","ARTICLE_ORIGIN_TITLE":"Автор оригинала:","ARTICLE_SHARING_TITLE":"Поделиться публикацией","ARTICLE_TAGS_TITLE":"Теги:","CALENDAR_MONTH_APRIL_TITLE":"Апрель","CALENDAR_MONTH_AUGUST_TITLE":"Август","CALENDAR_MONTH_DECEMBER_TITLE":"Декабрь","CALENDAR_MONTH_FEBRUARY_TITLE":"Февраль","CALENDAR_MONTH_JANUARY_TITLE":"Январь","CALENDAR_MONTH_JULY_TITLE":"Июль","CALENDAR_MONTH_JUNE_TITLE":"Июнь","CALENDAR_MONTH_MARCH_TITLE":"Март","CALENDAR_MONTH_MAY_TITLE":"Май","CALENDAR_MONTH_NOVEMBER_TITLE":"Ноябрь","CALENDAR_MONTH_OCTOBER_TITLE":"Октябрь","CALENDAR_MONTH_SEPTEMBER_TITLE":"Сентябрь","CALENDAR_NEXT_MONTH_TITLE":"Следующий месяц","CALENDAR_PREVIOUS_MONTH_TITLE":"Предыдущий месяц","CALENDAR_WEEKDAY_FRIDAY_SHORT_TITLE":"Пт","CALENDAR_WEEKDAY_FRIDAY_TITLE":"Пятница","CALENDAR_WEEKDAY_MONDAY_SHORT_TITLE":"Пн","CALENDAR_WEEKDAY_MONDAY_TITLE":"Понедельник","CALENDAR_WEEKDAY_SATURDAY_SHORT_TITLE":"Сб","CALENDAR_WEEKDAY_SATURDAY_TITLE":"Суббота","CALENDAR_WEEKDAY_SUNDAY_SHORT_TITLE":"Вс","CALENDAR_WEEKDAY_SUNDAY_TITLE":"Воскресенье","CALENDAR_WEEKDAY_THURSDAY_SHORT_TITLE":"Чт","CALENDAR_WEEKDAY_THURSDAY_TITLE":"Четверг","CALENDAR_WEEKDAY_TUESDAY_SHORT_TITLE":"Вт","CALENDAR_WEEKDAY_TUESDAY_TITLE":"Вторник","CALENDAR_WEEKDAY_WEDNESDAY_SHORT_TITLE":"Ср","CALENDAR_WEEKDAY_WEDNESDAY_TITLE":"Среда","CHARGE_KARMA_NOT_ENOUGH":"У вас недостаточно кармы для голосования","CHARGE_KARMA_VOTE_USERS_POSTS":"{type, plural,\n =1 { У вас \u003Cstrong\u003E{count}\u003C\u002Fstrong\u003E голос за карму и публикации}\n =2 { У вас \u003Cstrong\u003E{count}\u003C\u002Fstrong\u003E голоса за карму и публикации}\n other { У вас \u003Cstrong\u003E{count}\u003C\u002Fstrong\u003E голосов за карму и публикации}\n }","CHARGE_KARMA_VOTE_POSTS":"{type, plural,\n =1 { У вас \u003Cstrong\u003E{count}\u003C\u002Fstrong\u003E голос за публикации}\n =2 { У вас \u003Cstrong\u003E{count}\u003C\u002Fstrong\u003E голоса за публикации}\n other { У вас \u003Cstrong\u003E{count}\u003C\u002Fstrong\u003E голосов за публикации}\n }","CHARGE_KARMA_VOTE_COMMENTS":"{type, plural,\n =1 { У вас \u003Cstrong\u003E{count}\u003C\u002Fstrong\u003E голос за комментарии}\n =2 { У вас \u003Cstrong\u003E{count}\u003C\u002Fstrong\u003E голоса за комментарии}\n other { У вас \u003Cstrong\u003E{count}\u003C\u002Fstrong\u003E голосов за комментарии}\n }","CHARGE_KARMA_VOTE_AND_COMMENTS":"{type, plural,\n =1 { , и еще \u003Cstrong\u003E{count}\u003C\u002Fstrong\u003E голос за комментарии}\n =2 { , и еще \u003Cstrong\u003E{count}\u003C\u002Fstrong\u003E голоса за комментарии}\n other { , и еще \u003Cstrong\u003E{count}\u003C\u002Fstrong\u003E голосов за комментарии}\n }","CHARGE_KARMA_HOW_TO_INCREASE":"Как поднять карму?","CHARGE_KARMA_TOO_SMALL":"Вы не можете голосовать из-за маленькой кармы","CHARGE_EMPTY_FOR_TODAY":"На сегодня голоса закончились","COMMENT_ACTION_APPROVE":"Одобрить","COMMENT_ACTION_LOOK":"Посмотреть","COMMENT_ACTION_PREVIEW":"Предпросмотр","COMMENT_ACTION_REJECT":"Отклонить","COMMENT_ACTION_REPLY":"Ответить","COMMENT_ACTION_SAVE":"Сохранить","COMMENT_ACTION_SEND":"Отправить","COMMENT_ACTION_VOTE":"Голосовать","COMMENT_COLLAPSED":"Раскрыть ветку ({count})","COMMENT_EMPTY":"К сожалению, здесь пока нет ни одного комментария","COMMENT_NOTICE_UNABLE":"К сожалению, вы не можете оставлять комментарии.","COMMENT_NOTICE_UNAUTH_ACTION":"Войдите","COMMENT_NOTICE_UNAUTH_ACTION_SUFFIX":", пожалуйста.","COMMENT_NOTICE_UNAUTH_DECLARATION":"Только полноправные пользователи могут оставлять комментарии.","COMMENT_PLACEHOLDER_EMPTY":"НЛО прилетело и опубликовало эту надпись здесь","COMMENT_PLACEHOLDER_VOTED":"Проголосовал","ERROR_PAGE_AUTH":"Войти","ERROR_PAGE_BACK_TO_MAIN":"Вернуться на главную","ERROR_PAGE_MESSAGE_INTERNAL":"Что-то пошло не так","ERROR_PAGE_MESSAGE_NOT_AUTHORIZED":"Для просмотра этой страницы необходимо авторизоваться","ERROR_PAGE_MESSAGE_NOT_FOUND":"Страница устарела, была удалена или не существовала вовсе","ERROR_PAGE_MESSAGE_NOT_IMPLEMENTED":"Воспользуйтесь полной версией сайта, пожалуйста","ERROR_PAGE_MESSAGE_TIMEOUT":"Проверьте состояние вашего подключения и попробуйте обновить страницу.","ERROR_PAGE_REFRESH":"Обновить","ERROR_PAGE_TITLE_INTERNAL":"Внутренняя ошибка","ERROR_PAGE_TITLE_NOT_AUTHORIZED":"Ошибка авторизации.","ERROR_PAGE_TITLE_NOT_FOUND":"Страница не найдена","ERROR_PAGE_TITLE_NOT_IMPLEMENTED":"Для этого раздела мобильная версия еще не готова","ERROR_PAGE_TITLE_TIMEOUT":"Соединение потеряно","ERROR_PAGE_TITLE_ARTICLE_IN_DRAFTS":"Доступ к публикации закрыт","ERROR_PAGE_MESSAGE_ARTICLE_IN_DRAFTS":"Вы пытаетесь открыть публикацию, написанную пользователем \u003Ca class=\"tm-page__link\" href=\"{userProfileLink}\"\u003E{userName}\u003C\u002Fa\u003E, однако, публикация скрыта в черновики (самим автором или НЛО)","ERROR_PAGE_TITLE_ARTICLE_USER_INACTIVE":"Доступ к публикации закрыт","ERROR_PAGE_MESSAGE_ARTICLE_USER_INACTIVE":"Вы пытаетесь открыть публикацию, написанную пользователем \u003Ca class=\"tm-page__link\" href=\"{userProfileLink}\"\u003E{userName}\u003C\u002Fa\u003E, который в настоящее время заблокирован\u002Fдеактивирован или удалён","ERROR_PAGE_TITLE_ARTICLE_USER_BANNED":"Доступ к публикации закрыт","ERROR_PAGE_MESSAGE_ARTICLE_USER_BANNED":"Вы пытаетесь открыть публикацию, написанную пользователем \u003Ca class=\"tm-page__link\" href=\"{userProfileLink}\"\u003E{userName}\u003C\u002Fa\u003E, который в настоящее время заблокирован","EXAMPLE_COMPANY_DESC":"Компания","EXAMPLE_COMPANY":"MAIL.RU","EXAMPLE_COUNTER":"234 публикации","EXAMPLE_NICKNAME":"Boomburum","EXAMPLE_USERNAME":"Alexey Shavelev","FEEDBACK_TITLE":"Обратная связь","FEEDBACK_SUBJECT":"Укажите тему обращения:","FEEDBACK_EMAIL":"Ваш адрес электронной почты:","FEEDBACK_EMAIL_TIP":"На этот адрес будет отправлен ответ службы поддержки","FEEDBACK_MESSAGE":"Текст вашего сообщения:","FEEDBACK_PERSONAL":"Даю согласие на","FEEDBACK_PERSONAL_LINK":"обработку своих персональных данных","FEEDBACK_SEND":"Отправить","FEEDBACK_SENT":"Ваше сообщение отправлено. Сохраняйте терпение, в ближайшее время вы получите ответ.","FLAG_SANDBOX":"Из песочницы","FLAG_TRANSLATION":"Перевод","FLAG_TUTORIAL":"Tutorial","FOOTER_DESKTOP":"Полная версия","FOOTER_LANG":"Настройка языка","FOOTER_HELP":"Помощь","JOBS_ALL":"Все вакансии","JOBS_EMPTY":"На данный момент у компании нет открытых вакансий на «\u003Ca class=\"tm-company-vacancies__link\" href=\"https:\u002F\u002Fmoikrug.ru\u002Fvacancies?utm_source=tm_habrahabr&utm_medium=companyadmin&utm_campaign=vacancies\" target=\"_blank\"\u003EМоём круге\u003C\u002Fa\u003E»","JOBS_REMOTE":"удалённая работа","JOBS_TITLE":"{ company, select,\n none { Вакансии }\n other { Вакансии { company } }\n}","HELP_COMPANIES":"Компании","HELP_FEED":"Ленты","HELP_HABRACENTRE":"Хабрацентр","HELP_HABRAMAIL":"Диалоги","HELP_HUBS":"Хабы","HELP_KARMA":"Карма и рейтинг","HELP_LENTA":"Ленты","HELP_OTHER":"Разное","HELP_POSTS":"Публикации","HELP_PROBLEMS":"Проблемы с почтой","HELP_REGISTRATION":"Регистрация и приглашения","HELP_RULES":"Правила","HELP_SANDBOX":"Песочница","HELP_SETTINGS":"Настройки","HELP_SPONSORSHIP-INFO":"Спонсорство","HELP_TRACKER":"Трекер","MEGAPROJECTS_DESCRIPTION":"Мегапроекты Хабра — проекты, созданные контент-студией Хабра: яркие истории, тесты, квесты про IT-индустрию и все, что с ней связано.","NAV_ARTICLES":"Публикации","NAV_BLOG":"Блог","NAV_BOOKMARKS":"Закладки","NAV_BOOKMARKS_ARTICLES":"Публикации","NAV_BOOKMARKS_COMMENTS":"Комментарии","NAV_COMMENTS":"Комментарии","NAV_COMPANIES":"Компании","NAV_FEEDBACK":"Обратная связь","NAV_FLOWS":"Потоки","NAV_FLOW_ADMIN":"Администрирование","NAV_FLOW_DESIGN":"Дизайн","NAV_FLOW_DEVELOP":"Разработка","NAV_FLOW_GEEKTIMES":"Гиктаймс","NAV_FLOW_MANAGEMENT":"Управление","NAV_FLOW_MARKETING":"Маркетинг","NAV_FLOW_MISC":"Разное","NAV_HUBS":"Хабы","NAV_LOGOUT":"Выход","NAV_MEGAPROJECTS":"Мегапроекты","NAV_MY_FEED":"Моя лента","NAV_NEXT_PAGE":"туда","NAV_NEWS":"Новости","NAV_PREV_PAGE":"сюда","NAV_PROFILE":"Профиль","NAV_SEARCH":"Поиск","NAV_SETTINGS_LANGUAGE":"Настройка языка","NAV_TABS_ALL":"Все подряд","NAV_TABS_FEED":"По подписке","NAV_TABS_TOP":"Лучшие","NAV_TABS_TOP_DAILY":"День","NAV_TABS_TOP_MONTHLY":"Месяц","NAV_TABS_TOP_WEEKLY":"Неделя","NAV_VACANCIES":"Вакансии","NAV_USERS":"Пользователи","NEWS_DESCRIPTION":"Хабр — крупнейший в Европе ресурс для IT-специалистов. Сюда приходят обсудить новости индустрии и поделиться опытом.","NEWS_COMMENTS":"Комментарии:","NEWS_ALL_NEWS":"Все новости","BETA_TEST_NO":"Нет, спасибо","BETA_TEST_TEXT":"","BETA_TEST_TITLE":"","BETA_TEST_SWITCH_BACK":"Отключить β-тестирование","BETA_TEST_YES":"Да, давайте","OFFLINE_CLOSE":"Закрыть","OFFLINE_TITLE":"Интернет-соединение потеряно","REFRESH_TITLE":"Мы тут кое-что обновили. Чтобы «Хабр» работал корректно, обновите страницу.","REFRESH_ACTION":"Перезагрузить страницу","POINTS_ERROR_VOTING_DISABLED":"Недостаточно заряда для голосования","POINTS_LABEL_KARMA":"Карма","POINTS_LABEL_RATING":"Рейтинг","POINTS_LABEL_SUBSCRIBERS":"{type, plural,\n =5 { {count} подписчиков }\n =2 { {count} подписчика }\n =1 { {count} подписчик }\n =0 { }\n }","POLLS_VOTE":"Голосовать","POLLS_DECLINE":"Воздержаться","POLLS_STAT_VOTED":"{type, plural,\n =5 { Проголосовали {votesCount} пользователей. }\n =2 { Проголосовали {votesCount} пользователя. }\n =1 { Проголосовал {votesCount} пользователь. }\n =0 { Никто еще не голосовал. }\n }","POLLS_STAT_PASSED":"{type, plural,\n =5 { Воздержались {passCount} пользователей. }\n =2 { Воздержались {passCount} пользователя. }\n =1 { Воздержался {passCount} пользователь. }\n =0 { Воздержавшихся нет. }\n }","PROFILE_ACTION_EXPAND":"Показать все","PROFILE_ACTION_FOLLOW":"Подписаться","PROFILE_ACTION_FOLLOWING":"Подписан","PROFILE_ACTION_SUBSCRIBE":"Подписаться","PROFILE_ACTION_SUBSCRIBED":"Подписан","PROFILE_PAGE_TITLE_ARTICLES":"Публикации { username }","PROFILE_PAGE_TITLE_BOOKMARKS":"Закладки { username }","PROFILE_PAGE_TITLE_MAIN":"Профиль { username }","PROFILE_TEXT_BY_INVITATION":"по приглашению от","PROFILE_TEXT_UFO":"НЛО","PROFILE_TITLE_ABOUT":"О себе","PROFILE_TITLE_BADGES":"Значки","PROFILE_TITLE_COMPANIES":"{gender, plural,\n =2 { Подписана на компании }\n =1 { Подписан на компании }\n =0 { Подписан на компании }\n }","PROFILE_TITLE_CONTACTS":"Контактная информация","PROFILE_TITLE_HUBS":"Состоит в хабах","PROFILE_TITLE_INVITED":"{gender, plural,\n =2 { Приглашена }\n =1 { Приглашен }\n =0 { Приглашен }\n }","PROFILE_TITLE_INVITED_TO_SITE":"{gender, plural,\n =2 { Пригласила на сайт }\n =1 { Пригласил на сайт }\n =0 { Пригласил на сайт }\n }","PROFILE_TITLE_REGISTERED":"{gender, plural,\n =2 { Зарегистрирована }\n =1 { Зарегистрирован }\n =0 { Зарегистрирован }\n }","PROFILE_COMPANY_TITLE_ABOUT":"О компании","PROFILE_COMPANY_TITLE_BLOG":"Блог компании","PROFILE_COMPANY_TITLE_NEWS":"Новости компании","PROFILE_COMPANY_TITLE_DOMAINS":"Отрасли","PROFILE_COMPANY_TITLE_EMPLOYEES_COUNT":"Численность","PROFILE_COMPANY_TITLE_FOUNDATION_DATE":"Дата основания","PROFILE_COMPANY_TITLE_LOCATION":"Местоположение","PROFILE_COMPANY_TITLE_REGISTRATION_DATE":"Дата регистрации","PROFILE_COMPANY_TITLE_TEAM":"Команда","PROFILE_COMPANY_TITLE_VACANCIES":"Вакансии компании","PROFILE_COMPANY_TITLE_WEBSITE":"Сайт","RECAPTCHA_POLICY_TEXT":"Защита от спама reCAPTCHA.","RECAPTCHA_POLICY":"Политика конфиденциальности","RECAPTCHA_POLICY_AND":"","RECAPTCHA_POLICY_TERMS_OF_SERVICE":"Условия использования","RECAPTCHA_POLICY_APPLY":"","SEARCH_EMPTY_ARTICLES":"Сожалеем, поиск в публикациях не дал результатов","SEARCH_EMPTY_USERS":"Сожалеем, поиск по пользователямх не дал результатов","SEARCH_INPUT_PLACEHOLDER":"Поиск","SEARCH_TAB_ARTICLES":"Публикации","SEARCH_TAB_USERS":"Пользователи","SETTINGS_AGREEMENT_FINISH":"Завершить настройку","SETTINGS_ACTION_SAVE":"Сохранить настройки","SETTINGS_ARTICLES_ERROR":"Должен быть выбран хотя бы один язык","SETTINGS_ARTICLES_TITLE":"Публикации","SETTINGS_EMAIL_LABEL":"Получать письма об изменениях на сайте (не чаще 1 письма в месяц)","SETTINGS_FL_LANG_ENGLISH":"Английский","SETTINGS_FL_LANG_RUSSIAN":"Русский","SETTINGS_LANG_ENGLISH":"English","SETTINGS_LANG_RUSSIAN":"Русский","SETTINGS_RULES":"правила сайта","SETTINGS_TITLE":"Настройка языка","SETTINGS_UI_TITLE":"Интерфейс","TITLE_FEED":"Моя лента","TITLE_LATEST":"Все публикации подряд","TITLE_SIMILAR":"Похожие публикации","TITLE_TOP_DAILY":"Популярное за сутки","TITLE_MEGAPROJECTS":"Мегапроекты","TITLE_TOP_MONTHLY":"Лучшие публикации за месяц","TITLE_TOP_WEEKLY":"Лучшие публикации за неделю","TITLE_UNKNOWN":"","TOPIC_FORM_TITLE":"Создание публикации","TOPIC_HUBS_DESCRIPTION":"Выберите от 1 до 5 хабов; чем больше хабов будет указано, тем больше пользователей увидят публикацию","TOPIC_HUBS_TITLE":"Хабы","TOPIC_SCHEDULE_TITLE":"Запланировать публикацию","TOPIC_MODERATION_TITLE":"Публикация проверена модератором","TOPIC_NAME_DESCRIPTION":"Введите краткий и емкий заголовок, отражающий суть публикации","TOPIC_NAME_TITLE":"Заголовок","TOPIC_POLL_ADD_ANSWER_TITLE":"Добавить ответ","TOPIC_POLL_ADD_TITLE":"+ Добавить опрос","TOPIC_POLL_ANSWERS_TITLE":"Варианты ответа","TOPIC_POLL_CARD_TITLE":"Опрос №{ number }","TOPIC_POLL_DUE_DATE_TITLE":"Опрос имеет срок действия","TOPIC_POLL_MODE_MULTIPLE_TITLE":"Несколько","TOPIC_POLL_MODE_SINGLE_TITLE":"Один","TOPIC_POLL_SUBJECT_TITLE":"Тема опроса","TOPIC_TAGS_DESCRIPTION":"Метки необходимо разделять запятой","TOPIC_TAGS_TITLE":"Метки","TOPIC_TEXT_TITLE":"Текст","TOPIC_TRANSLATE_AUTHOR_DESCRIPTION":"Например: Martin McDonagh","TOPIC_TRANSLATE_AUTHOR_TITLE":"Автор оригинальной публикации","TOPIC_TRANSLATE_LINK_DESCRIPTION":"Например: https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FThe_Pillowman","TOPIC_TRANSLATE_LINK_TITLE":"Ссылка на оригинальную публикацию","TOPIC_TYPE_TITLE":"Тип публикации","TOPIC_TYPE_TRANSLATE_DESCRIPTION":"Собственный перевод иностранной статьи или публикации","TOPIC_TYPE_TRANSLATE_TITLE":"Перевод","TOPIC_TYPE_TUTORIAL_DESCRIPTION":"Обучающий материал в простой форме","TOPIC_TYPE_TUTORIAL_TITLE":"Туториал","WHEN_FULL_DATE":"{ day } { month, select,\n 0 { января }\n 1 { февраля }\n 2 { марта }\n 3 { апреля }\n 4 { мая }\n 5 { июня }\n 6 { июля }\n 7 { августа }\n 8 { сентября }\n 9 { октября }\n 10 { ноября }\n 11 { декабря }\n } { year }","WHEN_FULL_DATE_AT":"{ day } { month, select,\n 0 { января }\n 1 { февраля }\n 2 { марта }\n 3 { апреля }\n 4 { мая }\n 5 { июня }\n 6 { июля }\n 7 { августа }\n 8 { сентября }\n 9 { октября }\n 10 { ноября }\n 11 { декабря }\n } { year } в { time }","WHEN_TODAY_AT":"сегодня в { time }","WHEN_AT":"{ time }","WHEN_YESTERDAY_AT":"вчера в { time }","WELCOME_ACCOUNT":"3. Аккаунт","WELCOME_COMPANIES":"Компании","WELCOME_EMAIL":"5. Рассылка","WELCOME_FEED":"1. Лента","WELCOME_HIDE_HUBS_LIST":"Свернуть","WELCOME_HUBS":"Хабы","WELCOME_HUBS_LIST":"Состав подборки","WELCOME_KARMA":"4. Карма и рейтинг","WELCOME_NEXT_STEP":"Следующий шаг","WELCOME_PREV_STEP":"Предыдущий шаг","WELCOME_SHOW_ALL":"Показать все","WELCOME_SUBSCRIPTIONS":"2. Подписки","COMMENT_FORM_TITLE_BASE":"Написать комментарий","COMPANY":"Компания","DATE_FORMAT":"{ date } в { time }","EMPTY_POSTS_MESSAGE":"К сожалению, здесь пока нет ни одной публикации","HUB":"Хаб","NUMBER_FORMAT":"{ order, select,\nnone { { number } }\nthousands { { number }k }\n}","SITENAME":"Хабр","USER":"Пользователь"}},"info":{"infoPage":{}},"jobsList":{"jobsCompany":null,"jobsList":[]},"location":{"urlStruct":{"protocol":null,"slashes":null,"auth":null,"host":null,"port":null,"hostname":null,"hash":null,"query":{},"pathname":"\u002Fru\u002Fpost\u002F470285\u002Fcomments\u002F","path":"\u002Fru\u002Fpost\u002F470285\u002Fcomments\u002F","href":"\u002Fru\u002Fpost\u002F470285\u002Fcomments\u002F"}},"me":{"user":{"alias":"C1eriC","id":"179769","image":"https:\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002Fd01\u002Ffe1\u002F46a\u002Fd01fe146a28e3996dcf06dde41059a90.jpg","isSubscribed":false,"route":{"name":"user_profile","params":{"login":"C1eriC"}},"shortInfo":null,"title":"Александр","crc":1105603988,"charge":{"votesPosts":17,"votesComments":36,"restrictionComments":5,"restrictionPosts":5,"restrictionUsers":5},"karmaScore":17.7,"type":{"isReadAndComment":false,"isReadOnly":false},"username":"C1eriC","email":"c1er@mail.ru","counters":{"posts":"1","comments":"10","followed":"5","followers":"1","favorites":"35"},"groups":["normal"],"fl":"ru","hl":"ru"},"errorMessage":""},"navMenu":{"delta":0,"isOpened":false},"newsBlock":{"newsItems":{},"requestTime":{}},"online":{"isOfflineInformed":false,"isOnline":true},"promoBlock":{"promoItems":[],"title":""},"rootClassName":{"classNamesDict":{"tm-fira-loaded":true}},"settingsOther":{"inputs":{"uiLang":{"errors":[],"ref":null,"value":""},"articlesLangEnglish":{"errors":[],"ref":null,"value":false},"articlesLangRussian":{"errors":[],"ref":null,"value":false},"agreement":{"errors":[],"ref":null,"value":false},"email":{"errors":[],"ref":null,"value":true}}},"similarList":{"similarList":[]},"ssr":{"error":null,"isDataLoaded":true,"isDataLoading":false,"isHydrationFailed":false,"isI18nLoaded":true,"isServer":false},"tabs":{"isFilterOpened":false},"userComments":{"comments":[],"isLoading":false,"pagesCount":0,"route":null},"userMenu":{"delta":0,"isOpened":false},"userProfile":{"companies":[],"hubs":[],"invitations":[],"categoryProfile":{"profileData":{"alias":"NapoleonIT","id":"1937959","image":"https:\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002F5a2\u002F462\u002F845\u002F5a2462845b5b5599bb8a75992e25eaa6.png","isSubscribed":false,"route":{"name":"articles_list_by_user","params":{"login":"NapoleonIT","hl":"ru"}},"shortInfo":"IT-компания","title":"Napoleon IT","karmaScore":7,"type":{"isReadAndComment":false,"isReadOnly":false},"username":"NapoleonIT","counters":{"posts":"3","comments":"0","followed":"0","followers":"2","favorites":"1"},"fl":null,"hl":null,"badges":[{"id":"1","title":"Захабренный","alias":"habred","description":"Пользователь с кармой \u003E0","url":null,"is_disabled":false,"is_removable":false}],"contactsLinks":[],"followersCount":2,"ratingScore":4,"registrationDate":"2019-01-17T07:43:32.000Z","invitationDate":"","gender":"0","votes":{"isEnabled":true,"voteState":0},"fullname":"Napoleon IT","imageSrc":"https:\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002F5a2\u002F462\u002F845\u002F5a2462845b5b5599bb8a75992e25eaa6.png","paymentsMethods":[],"login":"NapoleonIT"}}},"users":{"profilesList":{"isLoading":false,"items":[],"cache":{"key":null,"page":null,"flowAlias":null,"timestamp":null},"pagesCount":0}},"viewport":{"prevScrollY":{},"scrollY":0,"width":0}}</script><script src="/js/vendors.983b12ad.js" defer></script><script src="/js/app.a99c6101.js" defer></script>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
</script>
<script type="text/javascript" >
(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
ym(24049213, "init", {
clickmap:true,
trackLinks:true,
accurateTrackBounce:true,
webvisor:true
});
</script>
<noscript>
<div>
<img src="https://mc.yandex.ru/watch/24049213" style="position:absolute; left:-9999px;" alt="" />
</div>
</noscript>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment