0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>13 июл 2023</li>
2
<ul><li>13 июл 2023</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Знакомимся с СУБД, устанавливаем её на компьютер и пишем первые запросы.</p>
4
</ul><p>Знакомимся с СУБД, устанавливаем её на компьютер и пишем первые запросы.</p>
5
<p>Иллюстрация: Colowgee / Stable Diffusion / Олег Бартунов / Postgres Professional / freepik / Colowgee для Skillbox Media</p>
5
<p>Иллюстрация: Colowgee / Stable Diffusion / Олег Бартунов / Postgres Professional / freepik / Colowgee для Skillbox Media</p>
6
<p>Пишет об истории IT, разработке и советской кибернетике. Знает Python, JavaScript и немного C++, но предпочитает писать на русском.</p>
6
<p>Пишет об истории IT, разработке и советской кибернетике. Знает Python, JavaScript и немного C++, но предпочитает писать на русском.</p>
7
<p>PostgreSQL - самая популярная система управления базами данных в мире. Об этом говорят не только результаты опросов разработчиков и предпринимателей, но и количество вакансий, в которых владение ею указывается среди необходимых навыков.</p>
7
<p>PostgreSQL - самая популярная система управления базами данных в мире. Об этом говорят не только результаты опросов разработчиков и предпринимателей, но и количество вакансий, в которых владение ею указывается среди необходимых навыков.</p>
8
<p>Из этой статьи вы узнаете, чем так хороша PostgreSQL, научитесь её устанавливать в Windows и Linux и создадите базу данных с двумя связанными таблицами. А заодно погрузитесь в историю этого замечательного проекта.</p>
8
<p>Из этой статьи вы узнаете, чем так хороша PostgreSQL, научитесь её устанавливать в Windows и Linux и создадите базу данных с двумя связанными таблицами. А заодно погрузитесь в историю этого замечательного проекта.</p>
9
<p>Содержание:</p>
9
<p>Содержание:</p>
10
<ul><li><a>Что такое PostgreSQL и для чего она нужна</a></li>
10
<ul><li><a>Что такое PostgreSQL и для чего она нужна</a></li>
11
<li><a>Достоинства и недостатки PostgreSQL</a></li>
11
<li><a>Достоинства и недостатки PostgreSQL</a></li>
12
<li><a>POSTGRES -> PostgreSQL: история проекта</a></li>
12
<li><a>POSTGRES -> PostgreSQL: история проекта</a></li>
13
<li><a>Как установить Postgres в Windows и Linux</a></li>
13
<li><a>Как установить Postgres в Windows и Linux</a></li>
14
<li><a>Как создать и связать две таблицы</a></li>
14
<li><a>Как создать и связать две таблицы</a></li>
15
<li><a>Что почитать и где следить за новостями</a></li>
15
<li><a>Что почитать и где следить за новостями</a></li>
16
</ul><p><strong>PostgreSQL</strong>- это свободно распространяемая объектно-реляционная система управления базами данных (СУБД) с открытым исходным кодом, написанном на языке C.</p>
16
</ul><p><strong>PostgreSQL</strong>- это свободно распространяемая объектно-реляционная система управления базами данных (СУБД) с открытым исходным кодом, написанном на языке C.</p>
17
<p>"Объектно-реляционная" означает, что PostgreSQL поддерживает концепции, присущие как реляционным базам данных, так и объектно-ориентированным языкам программирования (объекты, классы, наследование и другие). Далее мы рассмотрим, как эта поддержка реализуется и какие преимущества даёт при разработке приложений.</p>
17
<p>"Объектно-реляционная" означает, что PostgreSQL поддерживает концепции, присущие как реляционным базам данных, так и объектно-ориентированным языкам программирования (объекты, классы, наследование и другие). Далее мы рассмотрим, как эта поддержка реализуется и какие преимущества даёт при разработке приложений.</p>
18
<p>В своих продуктах PostgreSQL используют такие IT-гиганты, как Huawei, Alibaba, "Инстаграм"* и Yahoo. Согласно<a>исследованию Stack Overflow</a>, в котором приняло участие 48 тысяч профессиональных разработчиков, в 2022 году PostgreSQL была самой популярной СУБД.</p>
18
<p>В своих продуктах PostgreSQL используют такие IT-гиганты, как Huawei, Alibaba, "Инстаграм"* и Yahoo. Согласно<a>исследованию Stack Overflow</a>, в котором приняло участие 48 тысяч профессиональных разработчиков, в 2022 году PostgreSQL была самой популярной СУБД.</p>
19
<em>Скриншот:<a>Stack Overflow</a>/ Skillbox Media</em><p>Начнём с того, почему PostgreSQL долгое время остаётся одной из самых популярных СУБД. Здесь перечислены только самые важные достоинства - полный список куда более внушителен.</p>
19
<em>Скриншот:<a>Stack Overflow</a>/ Skillbox Media</em><p>Начнём с того, почему PostgreSQL долгое время остаётся одной из самых популярных СУБД. Здесь перечислены только самые важные достоинства - полный список куда более внушителен.</p>
20
<p><strong>Расширяемость и богатый набор типов данных.</strong>Помимо стандартных, в PostgreSQL есть типы для геометрических расчётов, сетевых адресов и полнотекстового поиска. Мощная система расширений позволяет добавлять новые возможности и типы данных. Кроме того, администратор может писать свои функции и процедуры на Python, PHP, Java, Ruby и многих других языках программирования, а также загружать модули на языке C из центрального репозитория<a>PGXN</a>.</p>
20
<p><strong>Расширяемость и богатый набор типов данных.</strong>Помимо стандартных, в PostgreSQL есть типы для геометрических расчётов, сетевых адресов и полнотекстового поиска. Мощная система расширений позволяет добавлять новые возможности и типы данных. Кроме того, администратор может писать свои функции и процедуры на Python, PHP, Java, Ruby и многих других языках программирования, а также загружать модули на языке C из центрального репозитория<a>PGXN</a>.</p>
21
<p><strong>Масштабируемость.</strong>Для повышения производительности и масштабируемости в PostgreSQL используются разные виды блокировок на уровне таблиц и строк; шесть видов индексов, среди которых B-дерево и обобщённое дерево поиска (GiST) для полнотекстового поиска; наследование таблиц - для быстрого создания таблиц на основе имеющейся структуры. Вы также можете анализировать скорость выполнения запросов с помощью команды explain, очищать диск от мусора командой vacuum и собирать статистику по таблицам с analyze.</p>
21
<p><strong>Масштабируемость.</strong>Для повышения производительности и масштабируемости в PostgreSQL используются разные виды блокировок на уровне таблиц и строк; шесть видов индексов, среди которых B-дерево и обобщённое дерево поиска (GiST) для полнотекстового поиска; наследование таблиц - для быстрого создания таблиц на основе имеющейся структуры. Вы также можете анализировать скорость выполнения запросов с помощью команды explain, очищать диск от мусора командой vacuum и собирать статистику по таблицам с analyze.</p>
22
<p><strong>Кросс-платформенность.</strong>PostgreSQL поддерживается всеми популярными операционными системами, среди которых различные дистрибутивы Linux и BSD, macOS, Windows, Solaris и другие. Интерфейсы для этой СУБД реализованы практически во всех языках программирования.</p>
22
<p><strong>Кросс-платформенность.</strong>PostgreSQL поддерживается всеми популярными операционными системами, среди которых различные дистрибутивы Linux и BSD, macOS, Windows, Solaris и другие. Интерфейсы для этой СУБД реализованы практически во всех языках программирования.</p>
23
<p><strong>Безопасность.</strong>В PostgreSQL есть множество инструментов для защиты данных от злоумышленников: пароль, Kerberos, LDAP, GSSAPI, SSPI, PAM и другие. Она позволяет управлять доступом к объектам БД на нескольких уровнях - от базы данных до отдельных столбцов, а также шифровать данные на аппаратном уровне.</p>
23
<p><strong>Безопасность.</strong>В PostgreSQL есть множество инструментов для защиты данных от злоумышленников: пароль, Kerberos, LDAP, GSSAPI, SSPI, PAM и другие. Она позволяет управлять доступом к объектам БД на нескольких уровнях - от базы данных до отдельных столбцов, а также шифровать данные на аппаратном уровне.</p>
24
<p><strong>Возможности NoSQL.</strong>Помимо стандартных форматов, PostgreSQL поддерживает XML, а с девятой версии - JSON и JSONB. Последний позволяет не разбирать JSON-документ перед записью в базу данных, что существенно ускоряет его сохранение в БД.</p>
24
<p><strong>Возможности NoSQL.</strong>Помимо стандартных форматов, PostgreSQL поддерживает XML, а с девятой версии - JSON и JSONB. Последний позволяет не разбирать JSON-документ перед записью в базу данных, что существенно ускоряет его сохранение в БД.</p>
25
<p><strong>Свободное распространение и открытый код.</strong>Проект распространяется под лицензией BSD, что позволяет бесплатно его использовать, модифицировать и распространять. Исходный код можно посмотреть на <a>зеркале официального Git-репозитория</a>.</p>
25
<p><strong>Свободное распространение и открытый код.</strong>Проект распространяется под лицензией BSD, что позволяет бесплатно его использовать, модифицировать и распространять. Исходный код можно посмотреть на <a>зеркале официального Git-репозитория</a>.</p>
26
<p><strong>Живое сообщество и исчерпывающее официальное руководство.</strong>PostgreSQL поддерживается большим активным сообществом пользователей и разработчиков, которые получают новости о проекте через еженедельные рассылки, обсуждают вопросы администрирования и ведут дискуссии.<a>Официальная документация</a>регулярно обновляется и на момент публикации содержит около 3000 страниц подробных и понятных инструкций.</p>
26
<p><strong>Живое сообщество и исчерпывающее официальное руководство.</strong>PostgreSQL поддерживается большим активным сообществом пользователей и разработчиков, которые получают новости о проекте через еженедельные рассылки, обсуждают вопросы администрирования и ведут дискуссии.<a>Официальная документация</a>регулярно обновляется и на момент публикации содержит около 3000 страниц подробных и понятных инструкций.</p>
27
<p>И всё-таки добавим капельку дёгтя в нашу бочку мёда. Да, при всех достоинствах у этой прекрасной СУБД есть недостатки.</p>
27
<p>И всё-таки добавим капельку дёгтя в нашу бочку мёда. Да, при всех достоинствах у этой прекрасной СУБД есть недостатки.</p>
28
<p><strong>Сложность настройки.</strong>Наверняка вы уже оценили обилие возможностей, которые даёт Postgres. Очевидно, что оно влечёт за собой разнообразие конфигураций, что может создавать сложности для начинающих пользователей. Настройка базы данных требует глубокого понимания архитектуры и параметров.</p>
28
<p><strong>Сложность настройки.</strong>Наверняка вы уже оценили обилие возможностей, которые даёт Postgres. Очевидно, что оно влечёт за собой разнообразие конфигураций, что может создавать сложности для начинающих пользователей. Настройка базы данных требует глубокого понимания архитектуры и параметров.</p>
29
<p><strong>Высокое потребление ресурсов.</strong>PostgreSQL может потреблять больше ресурсов (памяти и процессорного времени) по сравнению с некоторыми другими СУБД. Особенно это заметно при работе с большими объёмами данных и сложными запросами.</p>
29
<p><strong>Высокое потребление ресурсов.</strong>PostgreSQL может потреблять больше ресурсов (памяти и процессорного времени) по сравнению с некоторыми другими СУБД. Особенно это заметно при работе с большими объёмами данных и сложными запросами.</p>
30
<p><strong>Отсутствие некоторых функций.</strong>В сравнении с некоторыми коммерческими СУБД PostgreSQL может слегка отставать в функциональности.</p>
30
<p><strong>Отсутствие некоторых функций.</strong>В сравнении с некоторыми коммерческими СУБД PostgreSQL может слегка отставать в функциональности.</p>
31
<p>Отметим, что перечисленные недостатки в основном относятся к конкретным сценариям использования. В целом PostgreSQL остаётся одной из наиболее мощных и широко используемых открытых СУБД.</p>
31
<p>Отметим, что перечисленные недостатки в основном относятся к конкретным сценариям использования. В целом PostgreSQL остаётся одной из наиболее мощных и широко используемых открытых СУБД.</p>
32
<p>В этом разделе мы кратко рассмотрим историю Postgres. Если вы хотите поскорее установить её и попрактиковаться, то можете сразу переходить к <a>следующему разделу</a>.</p>
32
<p>В этом разделе мы кратко рассмотрим историю Postgres. Если вы хотите поскорее установить её и попрактиковаться, то можете сразу переходить к <a>следующему разделу</a>.</p>
33
<p>В 1985 году, когда SQL ещё не был мировым стандартом, группа инженеров Калифорнийского университета Беркли под руководством профессора Майкла Стоунбрейкера начала разработку реляционной СУБД POSTGRES. В основе проекта лежали наработки, которые Стоунбрейкер сделал во время работы над INGRES - одной из первых реляционных СУБД.</p>
33
<p>В 1985 году, когда SQL ещё не был мировым стандартом, группа инженеров Калифорнийского университета Беркли под руководством профессора Майкла Стоунбрейкера начала разработку реляционной СУБД POSTGRES. В основе проекта лежали наработки, которые Стоунбрейкер сделал во время работы над INGRES - одной из первых реляционных СУБД.</p>
34
Майкл Стоунбрейкер<em>Фото: Wikimedia Commons</em><p>К 1988 году команда опубликовала ряд научных статей, описывающих язык запросов POSTQUEL, который лежал в основе POSTGRES. Название недвусмысленно намекало на то, что новый язык более современный и продвинутый, чем SQL. Саму POSTGRES называли "постреляционной СУБД" - её создавали для того, чтобы преодолеть ставшие тогда очевидными ограничения SQL.</p>
34
Майкл Стоунбрейкер<em>Фото: Wikimedia Commons</em><p>К 1988 году команда опубликовала ряд научных статей, описывающих язык запросов POSTQUEL, который лежал в основе POSTGRES. Название недвусмысленно намекало на то, что новый язык более современный и продвинутый, чем SQL. Саму POSTGRES называли "постреляционной СУБД" - её создавали для того, чтобы преодолеть ставшие тогда очевидными ограничения SQL.</p>
35
<p>Первая версия инновационной СУБД вышла в 1989 году, но уже в 1992-м, после нескольких обновлений, проект закрыли. К счастью, исходный код POSTGRES распространялся по лицензии BSD. Выпускники Беркли Эндрю Ю и Джоли Чену продолжили её развивать, заменив язык POSTQUEL на SQL, который на тот момент уже стал международным стандартом. Новая инкарнация сперва получила имя Postgres95 (по году создания), а затем PostgreSQL. С тех пор вышло 28 версий СУБД.</p>
35
<p>Первая версия инновационной СУБД вышла в 1989 году, но уже в 1992-м, после нескольких обновлений, проект закрыли. К счастью, исходный код POSTGRES распространялся по лицензии BSD. Выпускники Беркли Эндрю Ю и Джоли Чену продолжили её развивать, заменив язык POSTQUEL на SQL, который на тот момент уже стал международным стандартом. Новая инкарнация сперва получила имя Postgres95 (по году создания), а затем PostgreSQL. С тех пор вышло 28 версий СУБД.</p>
36
<p>Сегодня проект поддерживает довольно небольшая по нынешним меркам<a>команда разработчиков</a>. Во главе команды стоит управляющий комитет (Core Team) - члены комитета принимают решения по развитию и выпуску новых версий Postgres. Разработчики делятся на обычных (contributors) и основных (major contributors). Кроме того, небольшая группа разработчиков (commiters) имеет право вносить изменения в исходный код.</p>
36
<p>Сегодня проект поддерживает довольно небольшая по нынешним меркам<a>команда разработчиков</a>. Во главе команды стоит управляющий комитет (Core Team) - члены комитета принимают решения по развитию и выпуску новых версий Postgres. Разработчики делятся на обычных (contributors) и основных (major contributors). Кроме того, небольшая группа разработчиков (commiters) имеет право вносить изменения в исходный код.</p>
37
<p>В число основных разработчиков входят и три программиста из России: Олег Бартунов, Фёдор Сигаев и Александр Коротков.</p>
37
<p>В число основных разработчиков входят и три программиста из России: Олег Бартунов, Фёдор Сигаев и Александр Коротков.</p>
38
Генеральный директор Postgres Professional Олег Бартунов<em>Фото:<a>Postgres Professional</a></em><p>На момент публикации статьи последней стабильной версией является PostgreSQL 15, а 29 июня 2023 года стала доступна вторая бета-версия PostgreSQL 16.</p>
38
Генеральный директор Postgres Professional Олег Бартунов<em>Фото:<a>Postgres Professional</a></em><p>На момент публикации статьи последней стабильной версией является PostgreSQL 15, а 29 июня 2023 года стала доступна вторая бета-версия PostgreSQL 16.</p>
39
<p>Установщик для любой операционной системы есть на <a>официальном сайте PostgreSQL</a>в разделе Latest Releases. На главной странице сайта нажмите кнопку<strong>Download</strong>и выберите свою операционную систему:</p>
39
<p>Установщик для любой операционной системы есть на <a>официальном сайте PostgreSQL</a>в разделе Latest Releases. На главной странице сайта нажмите кнопку<strong>Download</strong>и выберите свою операционную систему:</p>
40
<p>Далее мы рассмотрим процесс установки для Windows и Linux.</p>
40
<p>Далее мы рассмотрим процесс установки для Windows и Linux.</p>
41
<p>Нажмите на иконку Windows в разделе<strong>Downloads</strong>, и вы попадёте на страницу установщика PostgreSQL. Установщик включает в себя следующие утилиты:</p>
41
<p>Нажмите на иконку Windows в разделе<strong>Downloads</strong>, и вы попадёте на страницу установщика PostgreSQL. Установщик включает в себя следующие утилиты:</p>
42
<ul><li>сервер PostgreSQL,</li>
42
<ul><li>сервер PostgreSQL,</li>
43
<li>pgAdmin4 - графический инструмент для управления базой данных,</li>
43
<li>pgAdmin4 - графический инструмент для управления базой данных,</li>
44
<li>менеджер пакетов Stack Builder.</li>
44
<li>менеджер пакетов Stack Builder.</li>
45
</ul><p>Перейдите на страницу выбора версии установщика, нажав на ссылку<strong>Download the installer</strong>. Перед вам откроется список доступных файлов - выбирайте последнюю версию (на скриншоте это версия 15.3). Обратите внимание на разрядность скачиваемого файла - она должна совпадать с разрядностью вашей ОС.</p>
45
</ul><p>Перейдите на страницу выбора версии установщика, нажав на ссылку<strong>Download the installer</strong>. Перед вам откроется список доступных файлов - выбирайте последнюю версию (на скриншоте это версия 15.3). Обратите внимание на разрядность скачиваемого файла - она должна совпадать с разрядностью вашей ОС.</p>
46
<em>Скриншот: EDB / Skillbox Media</em><p>Запустите установщик. В приветственном окне нажмите<strong>Далее</strong>и выберите путь установки или оставьте папку по умолчанию.</p>
46
<em>Скриншот: EDB / Skillbox Media</em><p>Запустите установщик. В приветственном окне нажмите<strong>Далее</strong>и выберите путь установки или оставьте папку по умолчанию.</p>
47
<em>Скриншот: Skillbox Media</em><p><strong>Важно!</strong></p>
47
<em>Скриншот: Skillbox Media</em><p><strong>Важно!</strong></p>
48
<p>Если будете самостоятельно выбирать путь установки, не создавайте для этого папку - иначе получите сообщение об ошибке: "The chosen installation directory exists and is non-empty. Please choose a different directory". Просто впишите название папки в строку, например: "PostgreSQL/15", а установщик сам её создаст.</p>
48
<p>Если будете самостоятельно выбирать путь установки, не создавайте для этого папку - иначе получите сообщение об ошибке: "The chosen installation directory exists and is non-empty. Please choose a different directory". Просто впишите название папки в строку, например: "PostgreSQL/15", а установщик сам её создаст.</p>
49
<p>Затем нужно будет выбрать компоненты. По умолчанию галочки стоят во всех пунктах, но устанавливать всё необязательно. Главное для нас - сервер Postgres и pgAdmin. Также рекомендуем оставить инструменты командной строки, потому что они наверняка понадобятся для администрирования БД.</p>
49
<p>Затем нужно будет выбрать компоненты. По умолчанию галочки стоят во всех пунктах, но устанавливать всё необязательно. Главное для нас - сервер Postgres и pgAdmin. Также рекомендуем оставить инструменты командной строки, потому что они наверняка понадобятся для администрирования БД.</p>
50
<em>Скриншот: Skillbox Media</em><p>Далее нужно выбрать каталог, в котором будут храниться созданные вами базы данных. В рамках обучения можно оставить путь по умолчанию.</p>
50
<em>Скриншот: Skillbox Media</em><p>Далее нужно выбрать каталог, в котором будут храниться созданные вами базы данных. В рамках обучения можно оставить путь по умолчанию.</p>
51
<em>Скриншот: Skillbox Media</em><p>На следующем шаге вас попросят придумать пароль администратора - он понадобится для подключения к серверу PostgreSQL и входа в pgAdmin 4. Не забудьте его записать, чтобы не пришлось всё сносить и устанавливать заново :)</p>
51
<em>Скриншот: Skillbox Media</em><p>На следующем шаге вас попросят придумать пароль администратора - он понадобится для подключения к серверу PostgreSQL и входа в pgAdmin 4. Не забудьте его записать, чтобы не пришлось всё сносить и устанавливать заново :)</p>
52
<p>Затем установщик предложит выбрать язык и ещё раз покажет настройки, с которыми будет установлена PostgreSQL. Нажимайте "Далее", пока не начнётся процесс установки - он займёт несколько минут. По окончании в меню "Пуск" появится папка с компонентами и документацией:</p>
52
<p>Затем установщик предложит выбрать язык и ещё раз покажет настройки, с которыми будет установлена PostgreSQL. Нажимайте "Далее", пока не начнётся процесс установки - он займёт несколько минут. По окончании в меню "Пуск" появится папка с компонентами и документацией:</p>
53
<em>Скриншот: Skillbox Media</em><p>Проверим, всё ли работает. Запустите pgAdmin и кликните на <strong>Servers</strong>в левом верхнем углу. Вас попросят ввести пароль пользователя - это тот, пароль, который вы задавали во время установки.</p>
53
<em>Скриншот: Skillbox Media</em><p>Проверим, всё ли работает. Запустите pgAdmin и кликните на <strong>Servers</strong>в левом верхнем углу. Вас попросят ввести пароль пользователя - это тот, пароль, который вы задавали во время установки.</p>
54
<em>Скриншот: Skillbox Media</em><p>Если пароль введён верно, вы увидите такой дашборд:</p>
54
<em>Скриншот: Skillbox Media</em><p>Если пароль введён верно, вы увидите такой дашборд:</p>
55
<em>Скриншот: Skillbox Media</em><p>Чтобы проверить, подключён ли сервер, давайте спросим у него версию СУБД командой SELECT VERSION ():</p>
55
<em>Скриншот: Skillbox Media</em><p>Чтобы проверить, подключён ли сервер, давайте спросим у него версию СУБД командой SELECT VERSION ():</p>
56
<em>Скриншот: Skillbox Media</em><p>Если в нижней области экрана появился ответ, значит, сервер подключён и готов принимать запросы. С чем вас и поздравляем!</p>
56
<em>Скриншот: Skillbox Media</em><p>Если в нижней области экрана появился ответ, значит, сервер подключён и готов принимать запросы. С чем вас и поздравляем!</p>
57
<p>Как и все программы в ОС Linux, PostgreSQL проще всего установить через терминал из официального репозитория вашего дистрибутива. Откройте Bash и актуализируйте репозитории в своей системе:</p>
57
<p>Как и все программы в ОС Linux, PostgreSQL проще всего установить через терминал из официального репозитория вашего дистрибутива. Откройте Bash и актуализируйте репозитории в своей системе:</p>
58
$ sudo apt update<p>Затем одной командой установите PostgreSQL:</p>
58
$ sudo apt update<p>Затем одной командой установите PostgreSQL:</p>
59
$ sudo apt -y install postgresql<p>Флаг -y отключает подтверждение установки (Y/n).</p>
59
$ sudo apt -y install postgresql<p>Флаг -y отключает подтверждение установки (Y/n).</p>
60
<em>Скриншот: Skillbox Media</em><p>Когда установка завершится, убедитесь, что служба PostgreSQL включена (enabled) и сервер готов принимать запросы (accepting connections):</p>
60
<em>Скриншот: Skillbox Media</em><p>Когда установка завершится, убедитесь, что служба PostgreSQL включена (enabled) и сервер готов принимать запросы (accepting connections):</p>
61
$ sudo systemctl is-enabled postgresql$ sudo pg_isready<p>Терминал должен ответить так:</p>
61
$ sudo systemctl is-enabled postgresql$ sudo pg_isready<p>Терминал должен ответить так:</p>
62
<em>Скриншот: Skillbox Media</em><p>Теперь создадим базу данных и пользователя - чтобы работать с сервером через панель pgAdmin 4. Когда вы установили PostgreSQL, в вашей системе появилась учётная запись<strong>postgres</strong> - из-под неё можно управлять служебными процессами и создавать новых пользователей. Переключитесь на этого пользователя следующей командой:</p>
62
<em>Скриншот: Skillbox Media</em><p>Теперь создадим базу данных и пользователя - чтобы работать с сервером через панель pgAdmin 4. Когда вы установили PostgreSQL, в вашей системе появилась учётная запись<strong>postgres</strong> - из-под неё можно управлять служебными процессами и создавать новых пользователей. Переключитесь на этого пользователя следующей командой:</p>
63
$ sudo su - postgres<p>После этого в приглашение ко вводу появится префикс postgres:</p>
63
$ sudo su - postgres<p>После этого в приглашение ко вводу появится префикс postgres:</p>
64
<em>Скриншот: Skillbox Media</em><p>Создавать новую БД будем в командной оболочке<strong>psql</strong>:</p>
64
<em>Скриншот: Skillbox Media</em><p>Создавать новую БД будем в командной оболочке<strong>psql</strong>:</p>
65
$ psql<em>Скриншот: Skillbox Media</em><p>Если приглашение для ввода изменилось на postgres=#, то вы находитесь в <strong>psql</strong>.</p>
65
$ psql<em>Скриншот: Skillbox Media</em><p>Если приглашение для ввода изменилось на postgres=#, то вы находитесь в <strong>psql</strong>.</p>
66
<p>Теперь можно создать пользователя, под которым вы будете работать в pgAdmin, и пароль для него:</p>
66
<p>Теперь можно создать пользователя, под которым вы будете работать в pgAdmin, и пароль для него:</p>
67
postgres=# CREATE USER anton WITH PASSWORD 'j8IIj_p0kZ';<p>Оболочка будет дублировать название каждой удачно выполненной команды. Не забудьте поставить точку с запятой, иначе она будет "думать", что вы продолжаете ввод инструкций.</p>
67
postgres=# CREATE USER anton WITH PASSWORD 'j8IIj_p0kZ';<p>Оболочка будет дублировать название каждой удачно выполненной команды. Не забудьте поставить точку с запятой, иначе она будет "думать", что вы продолжаете ввод инструкций.</p>
68
<em>Скриншот: Skillbox Media</em><p>Теперь создайте базу данных. Мы назвали её skillbox_test_db:</p>
68
<em>Скриншот: Skillbox Media</em><p>Теперь создайте базу данных. Мы назвали её skillbox_test_db:</p>
69
postgres=# CREATE DATABASE skillbox_test_db;<p>Чтобы пользователь, которого мы недавно создали, обладал всеми правами в новой БД, их нужно назначить:</p>
69
postgres=# CREATE DATABASE skillbox_test_db;<p>Чтобы пользователь, которого мы недавно создали, обладал всеми правами в новой БД, их нужно назначить:</p>
70
GRANT ALL PRIVILEGES ON DATABASE skillbox_test_db to anton;<p>Если оболочка подтвердила выдачу прав словом GRANT, выйдите из неё, нажав комбинацию клавиш<strong>Ctrl</strong>+<strong>D</strong>.</p>
70
GRANT ALL PRIVILEGES ON DATABASE skillbox_test_db to anton;<p>Если оболочка подтвердила выдачу прав словом GRANT, выйдите из неё, нажав комбинацию клавиш<strong>Ctrl</strong>+<strong>D</strong>.</p>
71
<p>Наконец, можно устанавливать pgAdmin. К сожалению, здесь тоже придётся немного повозиться. Программа не доступна из репозитория Ubuntu, поэтому придётся устанавливать её из репозитория поставщика - pgAdmin 4 APT.</p>
71
<p>Наконец, можно устанавливать pgAdmin. К сожалению, здесь тоже придётся немного повозиться. Программа не доступна из репозитория Ubuntu, поэтому придётся устанавливать её из репозитория поставщика - pgAdmin 4 APT.</p>
72
<p>Сначала установить открытый ключ GPG - он нужен, чтобы проверять подлинность репозитория:</p>
72
<p>Сначала установить открытый ключ GPG - он нужен, чтобы проверять подлинность репозитория:</p>
73
$ curl -fsS https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo gpg --dearmor -o /usr/share/keyrings/packages-pgadmin-org.gpg<p>Затем создайте конфигурационный файл для репозитория - из него утилита<strong>apt</strong>будет получать информацию, необходимую для установки пакетов:</p>
73
$ curl -fsS https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo gpg --dearmor -o /usr/share/keyrings/packages-pgadmin-org.gpg<p>Затем создайте конфигурационный файл для репозитория - из него утилита<strong>apt</strong>будет получать информацию, необходимую для установки пакетов:</p>
74
$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/packages-pgadmin-org.gpg] https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/$(lsb_release -cs) pgadmin4 main" > /etc/apt/sources.list.d/pgadmin4.list && apt update'<p>Наконец, установите pgAdmin 4:</p>
74
$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/packages-pgadmin-org.gpg] https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/$(lsb_release -cs) pgadmin4 main" > /etc/apt/sources.list.d/pgadmin4.list && apt update'<p>Наконец, установите pgAdmin 4:</p>
75
$ sudo apt install pgadmin4<p>После выполнения команды у вас на компьютере будут все файлы, необходимые для запуска pgAdmin 4. Но перед началом работы нужно запустить скрипт, который подготовит pgAdmin к работе:</p>
75
$ sudo apt install pgadmin4<p>После выполнения команды у вас на компьютере будут все файлы, необходимые для запуска pgAdmin 4. Но перед началом работы нужно запустить скрипт, который подготовит pgAdmin к работе:</p>
76
$ sudo /usr/pgadmin4/bin/setup-web.sh<p>В процессе вас попросят ввести почту и пароль. Пароль понадобится для входа в админку, поэтому его лучше запомнить или записать. В конце скрипт перезапустит сервер Apache2 с новыми настройками.</p>
76
$ sudo /usr/pgadmin4/bin/setup-web.sh<p>В процессе вас попросят ввести почту и пароль. Пароль понадобится для входа в админку, поэтому его лучше запомнить или записать. В конце скрипт перезапустит сервер Apache2 с новыми настройками.</p>
77
<p>Теперь вы можете запустить pgAdmin 4 по IP-адресу<a>http://127.0.0.1/pgadmin4</a>. В окне авторизации введите адрес электронной почты и пароль, которые указывали на предыдущем шаге. Если данные введены верно, то вы увидите такой интерфейс:</p>
77
<p>Теперь вы можете запустить pgAdmin 4 по IP-адресу<a>http://127.0.0.1/pgadmin4</a>. В окне авторизации введите адрес электронной почты и пароль, которые указывали на предыдущем шаге. Если данные введены верно, то вы увидите такой интерфейс:</p>
78
<em>Скриншот: Skillbox Media</em><p>Напомним, что pgAdmin 4 - это клиент, который предоставляет удобный доступ к PostgreSQL. Чтобы работать с данными, нужно подключить его к серверу. Для этого кликните на иконку<strong>Add New Server</strong>:</p>
78
<em>Скриншот: Skillbox Media</em><p>Напомним, что pgAdmin 4 - это клиент, который предоставляет удобный доступ к PostgreSQL. Чтобы работать с данными, нужно подключить его к серверу. Для этого кликните на иконку<strong>Add New Server</strong>:</p>
79
<em>Скриншот: Skillbox Media</em><p>Задайте серверу имя и перейдите к настройкам:</p>
79
<em>Скриншот: Skillbox Media</em><p>Задайте серверу имя и перейдите к настройкам:</p>
80
<em>Скриншот: Skillbox Media</em><p>Здесь нужно заполнить три поля: host name (для работы на локальном компьютере пишем localhost), username и password. Имя пользователя и пароль вы <a>задавали заранее</a>:</p>
80
<em>Скриншот: Skillbox Media</em><p>Здесь нужно заполнить три поля: host name (для работы на локальном компьютере пишем localhost), username и password. Имя пользователя и пароль вы <a>задавали заранее</a>:</p>
81
<em>Скриншот: Skillbox Media</em><p>Если вы всё ввели правильно, слева появится информация об имеющихся базах данных. Проверим подключение, запросив в <strong>Query Tool</strong>номер версии СУБД командой SELECT VERSION ():</p>
81
<em>Скриншот: Skillbox Media</em><p>Если вы всё ввели правильно, слева появится информация об имеющихся базах данных. Проверим подключение, запросив в <strong>Query Tool</strong>номер версии СУБД командой SELECT VERSION ():</p>
82
<em>Скриншот: Skillbox Media</em><p>В нашем случае ответ выглядит так:</p>
82
<em>Скриншот: Skillbox Media</em><p>В нашем случае ответ выглядит так:</p>
83
<p>PostgreSQL 14.8 (Ubuntu 14.8-0ubuntu0.22.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0, 64-bit.</p>
83
<p>PostgreSQL 14.8 (Ubuntu 14.8-0ubuntu0.22.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0, 64-bit.</p>
84
<p>Другими словами, сервер PostgreSQL успешно подключился к pgAdmin 4 и готов принимать от него запросы.</p>
84
<p>Другими словами, сервер PostgreSQL успешно подключился к pgAdmin 4 и готов принимать от него запросы.</p>
85
<p>Теперь, когда база данных подключена, давайте попрактикуемся с SQL-запросами. Представьте следующую ситуацию: менеджеры Skillbox попросили нас создать базу данных студентов, в которой будет видно, кто на каком курсе учится. Для простоты будем считать, что каждый студент может учиться только на одном курсе.</p>
85
<p>Теперь, когда база данных подключена, давайте попрактикуемся с SQL-запросами. Представьте следующую ситуацию: менеджеры Skillbox попросили нас создать базу данных студентов, в которой будет видно, кто на каком курсе учится. Для простоты будем считать, что каждый студент может учиться только на одном курсе.</p>
86
<p>Очевидно, что для этих целей понадобится две таблицы: в одной будет храниться информация о курсах, а во второй - о студентах. Кажется, это отличный повод потренироваться в создании таблиц и записей.</p>
86
<p>Очевидно, что для этих целей понадобится две таблицы: в одной будет храниться информация о курсах, а во второй - о студентах. Кажется, это отличный повод потренироваться в создании таблиц и записей.</p>
87
<p>Таблицу с курсами, как это ни удивительно, назовём<strong>Courses</strong>. Она будет состоять из следующих полей:</p>
87
<p>Таблицу с курсами, как это ни удивительно, назовём<strong>Courses</strong>. Она будет состоять из следующих полей:</p>
88
<ul><li><strong>course_id</strong>- уникальный идентификатор курса, который генерируется автоматически и не может быть равен<strong>NULL</strong>.<strong></strong>Это поле будет выполнять роль первичного ключа (primary key);</li>
88
<ul><li><strong>course_id</strong>- уникальный идентификатор курса, который генерируется автоматически и не может быть равен<strong>NULL</strong>.<strong></strong>Это поле будет выполнять роль первичного ключа (primary key);</li>
89
<li><strong>course_name</strong>- название курса. Размер поля не превышает 100 символов, а значение не может быть равно<strong>NULL</strong>;</li>
89
<li><strong>course_name</strong>- название курса. Размер поля не превышает 100 символов, а значение не может быть равно<strong>NULL</strong>;</li>
90
<li><strong>hours</strong>- количество часов в виде целого числа;</li>
90
<li><strong>hours</strong>- количество часов в виде целого числа;</li>
91
<li><strong>price</strong>- стоимость курса в виде числа с плавающей точкой;</li>
91
<li><strong>price</strong>- стоимость курса в виде числа с плавающей точкой;</li>
92
<li><strong>is_open</strong>- хранит информацию о том, открыт или закрыт курс, и не может содержать<strong>NULL</strong>.</li>
92
<li><strong>is_open</strong>- хранит информацию о том, открыт или закрыт курс, и не может содержать<strong>NULL</strong>.</li>
93
</ul><p>У каждого студента в таблице будет поле с идентификаторами курсов, на которые он записан. При этом набор id должен быть строго ограничен, а сохранение несуществующих id - запрещено.</p>
93
</ul><p>У каждого студента в таблице будет поле с идентификаторами курсов, на которые он записан. При этом набор id должен быть строго ограничен, а сохранение несуществующих id - запрещено.</p>
94
<p>Создать таблицу можно с помощью SQL-запроса в командной оболочке<strong>psql</strong>или в окне<strong>Query Tool</strong>(см.<a>Установка и запуск PostgreSQL в Linux</a>) pgAdmin:</p>
94
<p>Создать таблицу можно с помощью SQL-запроса в командной оболочке<strong>psql</strong>или в окне<strong>Query Tool</strong>(см.<a>Установка и запуск PostgreSQL в Linux</a>) pgAdmin:</p>
95
CREATE TABLE courses( course_id integer NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, course_name character varying (100) NOT NULL, hours integer, price float, is_open boolean DEFAULT TRUE );<p>Другой путь пролегает через кнопки и окна графического интерфейса. На боковой панели перейдите в раздел<strong>Schemas</strong>("Схемы") и кликните правой кнопкой мыши на разделе<strong>Tables</strong>("Таблицы"). Появится контекстное окно с приглашением создать новую таблицу - переходим:</p>
95
CREATE TABLE courses( course_id integer NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, course_name character varying (100) NOT NULL, hours integer, price float, is_open boolean DEFAULT TRUE );<p>Другой путь пролегает через кнопки и окна графического интерфейса. На боковой панели перейдите в раздел<strong>Schemas</strong>("Схемы") и кликните правой кнопкой мыши на разделе<strong>Tables</strong>("Таблицы"). Появится контекстное окно с приглашением создать новую таблицу - переходим:</p>
96
<em>Скриншот: Skillbox Media</em><em>Скриншот: Skillbox Media</em><em>Скриншот: Skillbox Media</em><p>Задайте таблице имя в разделе с общими настройками и перейдите в раздел<strong>Columns</strong>. Здесь можно создать и настроить необходимые поля.</p>
96
<em>Скриншот: Skillbox Media</em><em>Скриншот: Skillbox Media</em><em>Скриншот: Skillbox Media</em><p>Задайте таблице имя в разделе с общими настройками и перейдите в раздел<strong>Columns</strong>. Здесь можно создать и настроить необходимые поля.</p>
97
<p>Создадим и настроим поле<strong>course_id</strong>. Нажмите "<strong>+"</strong>в правом углу модального окна и в появившейся строке заполните параметры в соответствии с условиями: поле является первичным ключом и никогда не должно принимать значение<strong>NULL</strong>.</p>
97
<p>Создадим и настроим поле<strong>course_id</strong>. Нажмите "<strong>+"</strong>в правом углу модального окна и в появившейся строке заполните параметры в соответствии с условиями: поле является первичным ключом и никогда не должно принимать значение<strong>NULL</strong>.</p>
98
<em>Скриншот: Skillbox Media</em><p>Осталось добавить автоматическую генерацию значений. Для этого нажмите на иконку карандаша (edit row) - откроется раздел с подробными настройками. Перейдите в раздел<strong>Constraints</strong>("Ограничения") и выберите тип<strong>IDENTIFY</strong>. Готово! Вы создали автоматически генерируемый первичный ключ.</p>
98
<em>Скриншот: Skillbox Media</em><p>Осталось добавить автоматическую генерацию значений. Для этого нажмите на иконку карандаша (edit row) - откроется раздел с подробными настройками. Перейдите в раздел<strong>Constraints</strong>("Ограничения") и выберите тип<strong>IDENTIFY</strong>. Готово! Вы создали автоматически генерируемый первичный ключ.</p>
99
<em>Скриншот: Skillbox Media</em><p>Попробуйте заполнить остальные поля самостоятельно.</p>
99
<em>Скриншот: Skillbox Media</em><p>Попробуйте заполнить остальные поля самостоятельно.</p>
100
<p>Подсказка 1</p>
100
<p>Подсказка 1</p>
101
<p>Для текстовых полей с переменной, но ограниченной длиной подходят типы character varying и varchar.</p>
101
<p>Для текстовых полей с переменной, но ограниченной длиной подходят типы character varying и varchar.</p>
102
<p>Подсказка 2</p>
102
<p>Подсказка 2</p>
103
<p>В PostgreSQL есть два типа чисел с плавающей точкой: real и double precision.</p>
103
<p>В PostgreSQL есть два типа чисел с плавающей точкой: real и double precision.</p>
104
<p>В результате у вас должен получиться такой набор полей:</p>
104
<p>В результате у вас должен получиться такой набор полей:</p>
105
<p>Во второй таблице<strong>(students)</strong>будут храниться данные студентов и ссылки на курсы из таблицы<strong>courses</strong>:</p>
105
<p>Во второй таблице<strong>(students)</strong>будут храниться данные студентов и ссылки на курсы из таблицы<strong>courses</strong>:</p>
106
<ul><li><strong>student_id</strong>- уникальный идентификатор студента (primary key);</li>
106
<ul><li><strong>student_id</strong>- уникальный идентификатор студента (primary key);</li>
107
<li><strong>name</strong>- имя студента;</li>
107
<li><strong>name</strong>- имя студента;</li>
108
<li><strong>middlename</strong>- отчество;</li>
108
<li><strong>middlename</strong>- отчество;</li>
109
<li><strong>lastname</strong>- фамилия;</li>
109
<li><strong>lastname</strong>- фамилия;</li>
110
<li><strong>contacts</strong>- контакты (телефон, email, ссылки на соцсети и так далее);</li>
110
<li><strong>contacts</strong>- контакты (телефон, email, ссылки на соцсети и так далее);</li>
111
<li><strong>course</strong> - курсы (набор id из таблицы с курсами). Это поле выступает внешним ключом, который связывает таблицы между собой.</li>
111
<li><strong>course</strong> - курсы (набор id из таблицы с курсами). Это поле выступает внешним ключом, который связывает таблицы между собой.</li>
112
</ul><p>Так как у одного студента может быть несколько контактов, то для поля<strong>contacts</strong>подойдёт тип<strong>character varying[]</strong>(массив строк ограниченной длины).</p>
112
</ul><p>Так как у одного студента может быть несколько контактов, то для поля<strong>contacts</strong>подойдёт тип<strong>character varying[]</strong>(массив строк ограниченной длины).</p>
113
<p>Создадим новую таблицу и настроим столбцы, исходя из условий:</p>
113
<p>Создадим новую таблицу и настроим столбцы, исходя из условий:</p>
114
<p>Сделаем так, чтобы столбец<strong>course</strong>ссылался на таблицу<strong>courses</strong>.<strong></strong>Для этого перейдите во вкладку<strong>Constraints</strong>("Ограничения") →<strong>Foreign Key</strong>("Внешний ключ") и нажмите на <strong>+</strong>.</p>
114
<p>Сделаем так, чтобы столбец<strong>course</strong>ссылался на таблицу<strong>courses</strong>.<strong></strong>Для этого перейдите во вкладку<strong>Constraints</strong>("Ограничения") →<strong>Foreign Key</strong>("Внешний ключ") и нажмите на <strong>+</strong>.</p>
115
<p>Задайте произвольное название ограничению - оно ни на что не влияет. Затем свяжите столбцы: в <strong>Local Column</strong>("Локальный столбец") укажите поле<strong>course</strong>, в <strong>References</strong>("Ссылается на") таблицу<strong>courses</strong>и в <strong>Referencing</strong>("Зависимый столбец") поле<strong>course_id</strong>.<strong></strong>Готово! Вы создали и связали две таблицы.</p>
115
<p>Задайте произвольное название ограничению - оно ни на что не влияет. Затем свяжите столбцы: в <strong>Local Column</strong>("Локальный столбец") укажите поле<strong>course</strong>, в <strong>References</strong>("Ссылается на") таблицу<strong>courses</strong>и в <strong>Referencing</strong>("Зависимый столбец") поле<strong>course_id</strong>.<strong></strong>Готово! Вы создали и связали две таблицы.</p>
116
<p>О том же самом сервер можно было бы попросить на языке SQL:</p>
116
<p>О том же самом сервер можно было бы попросить на языке SQL:</p>
117
CREATE TABLE students ( student_id integer NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name character varying (30) NOT NULL, middlename character varying (30) NOT NULL, lastname character varying (30) NOT NULL, contacts character varying[], course integer, CONSTRAINT students_courses FOREIGN KEY (course) REFERENCES courses (course_id) );<p>Часто опытные разработчики рекомендуют вместо книг читать "доку", и на то есть несколько причин:</p>
117
CREATE TABLE students ( student_id integer NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name character varying (30) NOT NULL, middlename character varying (30) NOT NULL, lastname character varying (30) NOT NULL, contacts character varying[], course integer, CONSTRAINT students_courses FOREIGN KEY (course) REFERENCES courses (course_id) );<p>Часто опытные разработчики рекомендуют вместо книг читать "доку", и на то есть несколько причин:</p>
118
<ul><li>Официальная документация регулярно обновляется и, как правило, учитывает последние изменения в проекте. В то время как книги устаревают с выходом новых версий ПО.</li>
118
<ul><li>Официальная документация регулярно обновляется и, как правило, учитывает последние изменения в проекте. В то время как книги устаревают с выходом новых версий ПО.</li>
119
<li>Документация всегда под рукой (в интернете или в pdf-формате) и организована в виде удобного справочника, что ускоряет поиск ответов на вопросы.</li>
119
<li>Документация всегда под рукой (в интернете или в pdf-формате) и организована в виде удобного справочника, что ускоряет поиск ответов на вопросы.</li>
120
<li>И самое приятное - она бесплатная.</li>
120
<li>И самое приятное - она бесплатная.</li>
121
</ul><p>В случае с PostgreSQL<a>официальное руководство</a>лучше любой книги ещё и тем, что охватывает практически все вопросы, касающиеся установки, настройки и администрирования СУБД. В pdf-версии документа уже почти 3000 страниц! Ни одна книга не может похвастаться таким объёмом.</p>
121
</ul><p>В случае с PostgreSQL<a>официальное руководство</a>лучше любой книги ещё и тем, что охватывает практически все вопросы, касающиеся установки, настройки и администрирования СУБД. В pdf-версии документа уже почти 3000 страниц! Ни одна книга не может похвастаться таким объёмом.</p>
122
<p>Но это не значит, что от технической литературы нет никакой пользы. Некоторые учебники ощутимо облегчают знакомство с PostgreSQL благодаря тому, что не загружают новичков деталями на старте, а вводят их по мере знакомства с инструментом.</p>
122
<p>Но это не значит, что от технической литературы нет никакой пользы. Некоторые учебники ощутимо облегчают знакомство с PostgreSQL благодаря тому, что не загружают новичков деталями на старте, а вводят их по мере знакомства с инструментом.</p>
123
<p>Вот несколько книг, на которые стоит обратить внимание:</p>
123
<p>Вот несколько книг, на которые стоит обратить внимание:</p>
124
<ul><li>"PostgreSQL для начинающих" - П. Лузанов, Е. Рогов, И. Лёвшин.</li>
124
<ul><li>"PostgreSQL для начинающих" - П. Лузанов, Е. Рогов, И. Лёвшин.</li>
125
<li>"PostgreSQL: основы языка SQL" - Е. П. Моргунов.</li>
125
<li>"PostgreSQL: основы языка SQL" - Е. П. Моргунов.</li>
126
<li>"Оптимизация запросов в PostgreSQL" - Добровская Г., Новиков Б., Бейликова А.</li>
126
<li>"Оптимизация запросов в PostgreSQL" - Добровская Г., Новиков Б., Бейликова А.</li>
127
<li>"Изучаем PostgreSQL 10" - Салахаддин Джуба.</li>
127
<li>"Изучаем PostgreSQL 10" - Салахаддин Джуба.</li>
128
</ul><p><strong>Небольшой комментарий к последнему пункту.</strong>Хоть "Изучаем PostgreSQL 10" и посвящена десятой версии Postgres (на момент публикации статьи вышла бета-версия 16-й), в ней изложены настолько фундаментальные принципы, что она остаётся актуальной и по сей день.</p>
128
</ul><p><strong>Небольшой комментарий к последнему пункту.</strong>Хоть "Изучаем PostgreSQL 10" и посвящена десятой версии Postgres (на момент публикации статьи вышла бета-версия 16-й), в ней изложены настолько фундаментальные принципы, что она остаётся актуальной и по сей день.</p>
129
<p>Следить за новостями можно на <a>официальном сайте</a>или в <a>Twitter-аккаунте PostgreSQL</a>(второй способ с VPN удобнее). Наконец, задать технические вопросы можно в чате русскоязычного сообщества в Telegram:<a>https://t.me/pgsql</a>.</p>
129
<p>Следить за новостями можно на <a>официальном сайте</a>или в <a>Twitter-аккаунте PostgreSQL</a>(второй способ с VPN удобнее). Наконец, задать технические вопросы можно в чате русскоязычного сообщества в Telegram:<a>https://t.me/pgsql</a>.</p>
130
<p>* Решением суда запрещена "деятельность компании Meta Platforms Inc. по реализации продуктов - социальных сетей Facebook и Instagram на территории Российской Федерации по основаниям осуществления экстремистской деятельности".</p>
130
<p>* Решением суда запрещена "деятельность компании Meta Platforms Inc. по реализации продуктов - социальных сетей Facebook и Instagram на территории Российской Федерации по основаниям осуществления экстремистской деятельности".</p>
131
<a>Курс с трудоустройством: "Профессия Java-разработчик + ИИ" Узнать о курсе</a>
131
<a>Курс с трудоустройством: "Профессия Java-разработчик + ИИ" Узнать о курсе</a>