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>18 авг 2023</li>
2
<ul><li>18 авг 2023</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Инструкция по поиску философского камня для всех змееустов.</p>
4
</ul><p>Инструкция по поиску философского камня для всех змееустов.</p>
5
<p>Иллюстрация: Катя Павловская для Skillbox Media</p>
5
<p>Иллюстрация: Катя Павловская для Skillbox Media</p>
6
<p>Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.</p>
6
<p>Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.</p>
7
<p>SQLAlchemy позволяет при работе с базами данных вместо SQL-запросов использовать привычные для разработчика объекты и их методы. И это очень удобно.</p>
7
<p>SQLAlchemy позволяет при работе с базами данных вместо SQL-запросов использовать привычные для разработчика объекты и их методы. И это очень удобно.</p>
8
<p>Библиотека поддерживает различные СУБД, в том числе SQLite,<a>PostgreSQL</a>и MySQL. Причём управлять ими можно, используя одни и те же универсальные методы.</p>
8
<p>Библиотека поддерживает различные СУБД, в том числе SQLite,<a>PostgreSQL</a>и MySQL. Причём управлять ими можно, используя одни и те же универсальные методы.</p>
9
<p>Давайте познакомимся с SQLAlchemy, разберёмся, как с ней работать, а заодно создадим с её помощью свою базу данных.</p>
9
<p>Давайте познакомимся с SQLAlchemy, разберёмся, как с ней работать, а заодно создадим с её помощью свою базу данных.</p>
10
<p>Из этой статьи вы узнаете:</p>
10
<p>Из этой статьи вы узнаете:</p>
11
<ul><li><a>что такое SQLAlchemy;</a></li>
11
<ul><li><a>что такое SQLAlchemy;</a></li>
12
<li><a>как её подключить;</a></li>
12
<li><a>как её подключить;</a></li>
13
<li><a>как создать первую базу данных и таблицу в ней;</a></li>
13
<li><a>как создать первую базу данных и таблицу в ней;</a></li>
14
<li><a>какие дополнительные возможности есть в библиотеке.</a></li>
14
<li><a>какие дополнительные возможности есть в библиотеке.</a></li>
15
</ul><p>? Далее мы не будем подробно рассматривать виды и механику SQL-запросов. Если хотите узнать об этом больше,<a>читайте нашу статью об SQL</a>.</p>
15
</ul><p>? Далее мы не будем подробно рассматривать виды и механику SQL-запросов. Если хотите узнать об этом больше,<a>читайте нашу статью об SQL</a>.</p>
16
<p>SQLAlchemy - это Python-библиотека, которая позволяет работать с реляционными базами данных с помощью ORM.</p>
16
<p>SQLAlchemy - это Python-библиотека, которая позволяет работать с реляционными базами данных с помощью ORM.</p>
17
<p><strong>Реляционные базы данных</strong>хранят информацию в виде связанных между собой таблиц. К таким базам относят Oracle, Microsoft SQL Server, PostgreSQL и другие. Реляционные базы данных работают по принципам реляционной алгебры, но это тема для отдельной статьи.</p>
17
<p><strong>Реляционные базы данных</strong>хранят информацию в виде связанных между собой таблиц. К таким базам относят Oracle, Microsoft SQL Server, PostgreSQL и другие. Реляционные базы данных работают по принципам реляционной алгебры, но это тема для отдельной статьи.</p>
18
<p>Сила SQLAlchemy - в её <strong>ORM</strong>. Расшифровывается как<strong>object relational mapper</strong>, или<strong>"объектно-реляционное отображение"</strong>. ORM позволяет управлять базами данных с помощью методов объектов в коде и при этом не использовать SQL-запросы. На самом деле это очень удобно, так как позволяет писать привычный код, не переключаясь на SQL.</p>
18
<p>Сила SQLAlchemy - в её <strong>ORM</strong>. Расшифровывается как<strong>object relational mapper</strong>, или<strong>"объектно-реляционное отображение"</strong>. ORM позволяет управлять базами данных с помощью методов объектов в коде и при этом не использовать SQL-запросы. На самом деле это очень удобно, так как позволяет писать привычный код, не переключаясь на SQL.</p>
19
<p>Например, вместо SQL-запроса можно вызвать несколько методов, которые сделают то же самое:</p>
19
<p>Например, вместо SQL-запроса можно вызвать несколько методов, которые сделают то же самое:</p>
20
# SQL-запрос SELECT product_id, product_name, price, category FROM products WHERE category = 'Electronics' ORDER BY price DESC; # ORM-представление query = session.query(products).filter(products.category == 'Electronics').order_by(products.price.desc()).all()<p>Здесь мы обращаемся к строкам таблицы products, в которой есть категория Electronics, а затем сортируем товары по убыванию цены. Запрос несложный, но по коду на Python проще понять, какие действия и когда выполняются, особенно если вы незнакомы с SQL.</p>
20
# SQL-запрос SELECT product_id, product_name, price, category FROM products WHERE category = 'Electronics' ORDER BY price DESC; # ORM-представление query = session.query(products).filter(products.category == 'Electronics').order_by(products.price.desc()).all()<p>Здесь мы обращаемся к строкам таблицы products, в которой есть категория Electronics, а затем сортируем товары по убыванию цены. Запрос несложный, но по коду на Python проще понять, какие действия и когда выполняются, особенно если вы незнакомы с SQL.</p>
21
<p>Ещё одна особенность SQLAlchemy в том, что мы можем заменить базу данных в любой момент - например, с SQLite на PostgreSQL. Код приложения останется ровно тем же и продолжит работать. Нам не придётся переписывать ничего, кроме тех мест, где мы указываем, какую базу данных используем.</p>
21
<p>Ещё одна особенность SQLAlchemy в том, что мы можем заменить базу данных в любой момент - например, с SQLite на PostgreSQL. Код приложения останется ровно тем же и продолжит работать. Нам не придётся переписывать ничего, кроме тех мест, где мы указываем, какую базу данных используем.</p>
22
<p>Всё благодаря тому, что библиотека состоит из двух компонентов - SQLAlchemy Core и SQLAlchemy ORM.</p>
22
<p>Всё благодаря тому, что библиотека состоит из двух компонентов - SQLAlchemy Core и SQLAlchemy ORM.</p>
23
<ul><li>SQLAlchemy Core - это как бы абстракция над SQL. Компонент умеет общаться с SQL и превращать Python-код в понятные для баз данных запросы с помощью SQL Expression Language. При этом он понимает, с каким именно видом хранилища данных взаимодействует.</li>
23
<ul><li>SQLAlchemy Core - это как бы абстракция над SQL. Компонент умеет общаться с SQL и превращать Python-код в понятные для баз данных запросы с помощью SQL Expression Language. При этом он понимает, с каким именно видом хранилища данных взаимодействует.</li>
24
<li>SQLAlchemy ORM - удобный для разработчика интерфейс для управления базами данных. Компонент позволяет работать с ними и коммитить запросы прямо в Python-коде - без необходимости переписывать всё на язык SQL.</li>
24
<li>SQLAlchemy ORM - удобный для разработчика интерфейс для управления базами данных. Компонент позволяет работать с ними и коммитить запросы прямо в Python-коде - без необходимости переписывать всё на язык SQL.</li>
25
</ul><p>Теперь перейдём к практике. Мы будем работать с SQLAlchemy ORM, потому что это самый простой способ общаться с базами данных. Для начала установим библиотеку, а затем создадим первую таблицу.</p>
25
</ul><p>Теперь перейдём к практике. Мы будем работать с SQLAlchemy ORM, потому что это самый простой способ общаться с базами данных. Для начала установим библиотеку, а затем создадим первую таблицу.</p>
26
<p>Если у вас уже установлен Python, то скачать библиотеку SQLAlchemy можно, например, через pip:</p>
26
<p>Если у вас уже установлен Python, то скачать библиотеку SQLAlchemy можно, например, через pip:</p>
27
pip install sqlalchemy<p>Если вы используете дистрибутив Anaconda, воспользуйтесь такой командой:</p>
27
pip install sqlalchemy<p>Если вы используете дистрибутив Anaconda, воспользуйтесь такой командой:</p>
28
conda install -c anaconda sqlalchemy<p>Теперь убедитесь, что установка библиотеки прошла успешно:</p>
28
conda install -c anaconda sqlalchemy<p>Теперь убедитесь, что установка библиотеки прошла успешно:</p>
29
>>> import sqlalchemy >>> sqlalchemy.__version__ '1.4.41'<p>Если мы получили в ответе версию библиотеки, то всё установлено правильно. При импорте библиотеки сразу зададим ей короткое имя, чтобы постоянно не писать sqlalchemy:</p>
29
>>> import sqlalchemy >>> sqlalchemy.__version__ '1.4.41'<p>Если мы получили в ответе версию библиотеки, то всё установлено правильно. При импорте библиотеки сразу зададим ей короткое имя, чтобы постоянно не писать sqlalchemy:</p>
30
import sqlalchemy as db<p>Здесь мы указали сокращение - db. Дальше будем использовать именно его.</p>
30
import sqlalchemy as db<p>Здесь мы указали сокращение - db. Дальше будем использовать именно его.</p>
31
<p>Чтобы создать первую базу данных, нам нужно выбрать один из диалектов SQL. Вот список нескольких, которые поддерживает библиотека SQLAlchemy:</p>
31
<p>Чтобы создать первую базу данных, нам нужно выбрать один из диалектов SQL. Вот список нескольких, которые поддерживает библиотека SQLAlchemy:</p>
32
<ul><li>PostgreSQL;</li>
32
<ul><li>PostgreSQL;</li>
33
<li>MySQL;</li>
33
<li>MySQL;</li>
34
<li>SQLite;</li>
34
<li>SQLite;</li>
35
<li>Oracle;</li>
35
<li>Oracle;</li>
36
<li>Microsoft SQL Server (MS SQL).</li>
36
<li>Microsoft SQL Server (MS SQL).</li>
37
</ul><p>Мы будем использовать SQLite, так как для неё не нужно поднимать сервер и она уже установлена вместе с Python. При этом дополнительно импортировать ничего не придётся - SQLAlchemy всё сделает за нас.</p>
37
</ul><p>Мы будем использовать SQLite, так как для неё не нужно поднимать сервер и она уже установлена вместе с Python. При этом дополнительно импортировать ничего не придётся - SQLAlchemy всё сделает за нас.</p>
38
<p>Первым делом нужно подключиться к базе данных или создать движок для этого. Движок представляет собой объект, который умеет управлять базой и выполнять SQL-команды.</p>
38
<p>Первым делом нужно подключиться к базе данных или создать движок для этого. Движок представляет собой объект, который умеет управлять базой и выполнять SQL-команды.</p>
39
<p>Чтобы создать движок, воспользуйтесь функцией create_engine:</p>
39
<p>Чтобы создать движок, воспользуйтесь функцией create_engine:</p>
40
engine = db.create_engine('sqlite:///myDatabase.db')<p>SQLAlchemy использует определённую URL-структуру для обозначения базы данных и её имени. Внутрь функции мы передаём строку с названием диалекта базы данных, который нам нужен (sqlite), а затем через двоеточие и три слеша - название хранилища и расширение db.</p>
40
engine = db.create_engine('sqlite:///myDatabase.db')<p>SQLAlchemy использует определённую URL-структуру для обозначения базы данных и её имени. Внутрь функции мы передаём строку с названием диалекта базы данных, который нам нужен (sqlite), а затем через двоеточие и три слеша - название хранилища и расширение db.</p>
41
<p>Теперь нужно запустить движок и создать подключение:</p>
41
<p>Теперь нужно запустить движок и создать подключение:</p>
42
conn = engine.connect()<p>С помощью этой строки мы подключились к базе данных. Объект conn понадобится нам дальше для выполнения SQL-запросов. conn - это сокращение от connection - "соединение". А соединять мы будем как раз наши запросы и базу данных.</p>
42
conn = engine.connect()<p>С помощью этой строки мы подключились к базе данных. Объект conn понадобится нам дальше для выполнения SQL-запросов. conn - это сокращение от connection - "соединение". А соединять мы будем как раз наши запросы и базу данных.</p>
43
<p>Дальше по канонам SQLAlchemy нужно указать метаданные. В них будет храниться вся информация об устройстве таблиц. По сути, метаданные - это как бы фасад здания, по которому понятно, как устроена база данных внутри. Получить их можно так:</p>
43
<p>Дальше по канонам SQLAlchemy нужно указать метаданные. В них будет храниться вся информация об устройстве таблиц. По сути, метаданные - это как бы фасад здания, по которому понятно, как устроена база данных внутри. Получить их можно так:</p>
44
metadata = db.MetaData()<p>Готово - можно переходить к созданию первой таблицы.</p>
44
metadata = db.MetaData()<p>Готово - можно переходить к созданию первой таблицы.</p>
45
<p>Создадим базу данных для книг из библиотеки. Договоримся, что в таблице будет находиться список книг и их авторов.</p>
45
<p>Создадим базу данных для книг из библиотеки. Договоримся, что в таблице будет находиться список книг и их авторов.</p>
46
<p>Ещё раз напомним, что в SQLAlchemy всё представлено в виде объектов, а значит, таблица - это тоже объект. Его принято называть понятно и с маленькой буквы:</p>
46
<p>Ещё раз напомним, что в SQLAlchemy всё представлено в виде объектов, а значит, таблица - это тоже объект. Его принято называть понятно и с маленькой буквы:</p>
47
books = db.Table(′books′, metadata, db.Column(′book_id′, db.Integer, primary_key=True), db.Column(′book_name′, db.Text), db.Column(′book_author′, db.Text), db.Column(′book_year′, db.Integer), db.Column(′book_is_taken′, db.Boolean, default=False) )<p>Появилось много непонятного кода. Давайте разбираться.</p>
47
books = db.Table(′books′, metadata, db.Column(′book_id′, db.Integer, primary_key=True), db.Column(′book_name′, db.Text), db.Column(′book_author′, db.Text), db.Column(′book_year′, db.Integer), db.Column(′book_is_taken′, db.Boolean, default=False) )<p>Появилось много непонятного кода. Давайте разбираться.</p>
48
<ul><li>Сначала мы создали таблицу с помощью функции Table. Внутрь передали название этой таблицы (books) и метаданные (metadata), указали, из каких она будет состоять столбцов.</li>
48
<ul><li>Сначала мы создали таблицу с помощью функции Table. Внутрь передали название этой таблицы (books) и метаданные (metadata), указали, из каких она будет состоять столбцов.</li>
49
<li>Каждый столбец - это объект SQLAlchemy, который состоит из нескольких параметров. Обязательными являются имя и тип данных.</li>
49
<li>Каждый столбец - это объект SQLAlchemy, который состоит из нескольких параметров. Обязательными являются имя и тип данных.</li>
50
<li>Мы создали пять столбцов: уникальный идентификатор книги (book_id), название (book_name), автор (book_author), год (book_year) и статус доступности книги в библиотеке (book_is_taken).</li>
50
<li>Мы создали пять столбцов: уникальный идентификатор книги (book_id), название (book_name), автор (book_author), год (book_year) и статус доступности книги в библиотеке (book_is_taken).</li>
51
<li>Для всех столбцов также указали типы - например, Integer, Text и Boolean. Они представляют собой обычные типы целых чисел, строк и булевых переменных соответственно.</li>
51
<li>Для всех столбцов также указали типы - например, Integer, Text и Boolean. Они представляют собой обычные типы целых чисел, строк и булевых переменных соответственно.</li>
52
<li>Ещё мы добавили для первого столбца параметр primary_key=True. Это значит, что столбец будет главным - то есть по нему будут идентифицироваться строки и он будет вычисляться автоматически.</li>
52
<li>Ещё мы добавили для первого столбца параметр primary_key=True. Это значит, что столбец будет главным - то есть по нему будут идентифицироваться строки и он будет вычисляться автоматически.</li>
53
<li>Для последнего столбца указали значение по умолчанию - False. Всё потому, что сначала книги всегда находятся в библиотеке.</li>
53
<li>Для последнего столбца указали значение по умолчанию - False. Всё потому, что сначала книги всегда находятся в библиотеке.</li>
54
</ul><p>Выглядеть наша таблица будет так:</p>
54
</ul><p>Выглядеть наша таблица будет так:</p>
55
book_idbook_namebook_authorbook_yearbook_is_taken<p>А в заполненном виде - вот так:</p>
55
book_idbook_namebook_authorbook_yearbook_is_taken<p>А в заполненном виде - вот так:</p>
56
book_idbook_namebook_authorbook_yearbook_is_taken1БесыФёдор Достоевский1872False2Старик и мореЭрнест Хемингуэй1952True<p>Теперь, чтобы создать объект таблицы, вызовем функцию create_all:</p>
56
book_idbook_namebook_authorbook_yearbook_is_taken1БесыФёдор Достоевский1872False2Старик и мореЭрнест Хемингуэй1952True<p>Теперь, чтобы создать объект таблицы, вызовем функцию create_all:</p>
57
metadata.create_all(engine)<p>Запустим написанный Python-код и создадим файл с базой данных.</p>
57
metadata.create_all(engine)<p>Запустим написанный Python-код и создадим файл с базой данных.</p>
58
<p>Мы создали движок для управления базой данных, затем подключились к ней и добавили первую таблицу. Пришло время заполнить её первыми значениями.</p>
58
<p>Мы создали движок для управления базой данных, затем подключились к ней и добавили первую таблицу. Пришло время заполнить её первыми значениями.</p>
59
<p>Чтобы добавить элементы в базу данных, нужно создать запрос в виде объекта. Делается это так:</p>
59
<p>Чтобы добавить элементы в базу данных, нужно создать запрос в виде объекта. Делается это так:</p>
60
insertion_query = books.insert().values([ {′book_name′:′Бесы′, ′book_author′:′Фёдор Достоевский′, ′book_year′:1872}, {′book_name′:′Старик и море′, ′book_author′:′Эрнест Хемингуэй′, ′book_year′:1952} ])<p>Разберём написанное. В начале мы указали, что обращаемся к таблице books для добавления в неё новых элементов с помощью insert(). Далее мы говорим, что будем сами добавлять значения - values(). И передаём внутрь значений элементы в фигурных скобках - то есть объекты с заполненными свойствами.</p>
60
insertion_query = books.insert().values([ {′book_name′:′Бесы′, ′book_author′:′Фёдор Достоевский′, ′book_year′:1872}, {′book_name′:′Старик и море′, ′book_author′:′Эрнест Хемингуэй′, ′book_year′:1952} ])<p>Разберём написанное. В начале мы указали, что обращаемся к таблице books для добавления в неё новых элементов с помощью insert(). Далее мы говорим, что будем сами добавлять значения - values(). И передаём внутрь значений элементы в фигурных скобках - то есть объекты с заполненными свойствами.</p>
61
<p>Каждая строка - отдельный объект, в котором указываются название столбца и его значение через двоеточие. Заметьте, что мы не указывали значения для столбцов book_id и book_is_taken, потому что они заполняются автоматически.</p>
61
<p>Каждая строка - отдельный объект, в котором указываются название столбца и его значение через двоеточие. Заметьте, что мы не указывали значения для столбцов book_id и book_is_taken, потому что они заполняются автоматически.</p>
62
<p>Чтобы данные закоммитились в базу данных, нужно обратиться к объекту conn и передать ему наш запрос:</p>
62
<p>Чтобы данные закоммитились в базу данных, нужно обратиться к объекту conn и передать ему наш запрос:</p>
63
conn.execute(insertion_query) conn.commit()<p>Метод execute отправит запрос к базе данных и попросит её записать новую информацию, а команда commit применит изменения. Если не выполнить его, мы не увидим новых строк в таблице. Это то же самое, что написать SQL-запрос в терминале и забыть нажать<strong>Enter</strong>.</p>
63
conn.execute(insertion_query) conn.commit()<p>Метод execute отправит запрос к базе данных и попросит её записать новую информацию, а команда commit применит изменения. Если не выполнить его, мы не увидим новых строк в таблице. Это то же самое, что написать SQL-запрос в терминале и забыть нажать<strong>Enter</strong>.</p>
64
<p>Запускаем Python-код и переходим к следующему этапу - выводу данных в консоль.</p>
64
<p>Запускаем Python-код и переходим к следующему этапу - выводу данных в консоль.</p>
65
<p>Пришло время убедиться, что данные действительно добавляются в таблицу. Для этого в SQLAlchemy есть метод select, который и поможет вывести информацию в консоль.</p>
65
<p>Пришло время убедиться, что данные действительно добавляются в таблицу. Для этого в SQLAlchemy есть метод select, который и поможет вывести информацию в консоль.</p>
66
select_all_query = db.select([books]) select_all_results = conn.execute(select_all_query)<p>Здесь в первой строке мы создали новый запрос - получить все данные из таблицы books. Так как функция select ожидает, что мы будем обращаться сразу к нескольким таблицам, то объект таблицы нужно передать как список.</p>
66
select_all_query = db.select([books]) select_all_results = conn.execute(select_all_query)<p>Здесь в первой строке мы создали новый запрос - получить все данные из таблицы books. Так как функция select ожидает, что мы будем обращаться сразу к нескольким таблицам, то объект таблицы нужно передать как список.</p>
67
<p>Во второй строке мы снова используем соединение conn, чтобы выполнить запрос к базе данных. Внутрь передаём наш новый запрос. Теперь выведите результат в консоль:</p>
67
<p>Во второй строке мы снова используем соединение conn, чтобы выполнить запрос к базе данных. Внутрь передаём наш новый запрос. Теперь выведите результат в консоль:</p>
68
print(select_all_results.fetchall())<p>Просто так вывести значение объекта select_all_results не получится, потому что после выполнения предыдущей команды объект-соединение вернёт нам только указание на расположение данных. Это что-то вроде ссылки на область в памяти компьютера. Если прочитать её, мы увидим набор непонятных значений - например, 0xe1344af.</p>
68
print(select_all_results.fetchall())<p>Просто так вывести значение объекта select_all_results не получится, потому что после выполнения предыдущей команды объект-соединение вернёт нам только указание на расположение данных. Это что-то вроде ссылки на область в памяти компьютера. Если прочитать её, мы увидим набор непонятных значений - например, 0xe1344af.</p>
69
<p>Чтобы получить сами данные, нужно дополнительно вызвать метод fetchall().</p>
69
<p>Чтобы получить сами данные, нужно дополнительно вызвать метод fetchall().</p>
70
<p>Вот что увидим в консоли после запуска Python-кода:</p>
70
<p>Вот что увидим в консоли после запуска Python-кода:</p>
71
[(1, ′Бесы′, ′Фёдор Достоевский′, 1872, False), (2, ′Старик и море′, ′Эрнест Хемингуэй′, 1952, False)]<p>Получили список из двух объектов. Всё, как и задумывалось.</p>
71
[(1, ′Бесы′, ′Фёдор Достоевский′, 1872, False), (2, ′Старик и море′, ′Эрнест Хемингуэй′, 1952, False)]<p>Получили список из двух объектов. Всё, как и задумывалось.</p>
72
<p>Поздравляем, мы создали первую базу данных, добавили в неё таблицу и даже заполнили её элементами. А в конце вывели все строки в консоль. Пора научиться делать более сложные вещи.</p>
72
<p>Поздравляем, мы создали первую базу данных, добавили в неё таблицу и даже заполнили её элементами. А в конце вывели все строки в консоль. Пора научиться делать более сложные вещи.</p>
73
<p>С SQLAlchemy можно выполнять любые SQL-запросы прямо в Python-коде. Это значит, что мы можем изменять, удалять, сортировать и фильтровать данные, а также многое другое. Давайте посмотрим на пару примеров.</p>
73
<p>С SQLAlchemy можно выполнять любые SQL-запросы прямо в Python-коде. Это значит, что мы можем изменять, удалять, сортировать и фильтровать данные, а также многое другое. Давайте посмотрим на пару примеров.</p>
74
<p>Напомним, как выглядит наша таблица:</p>
74
<p>Напомним, как выглядит наша таблица:</p>
75
book_idbook_namebook_authorbook_yearbook_is_taken1БесыФёдор Достоевский1872False2Старик и мореЭрнест Хемингуэй1952False<p>Чтобы отфильтровать данные, создадим новый запрос:</p>
75
book_idbook_namebook_authorbook_yearbook_is_taken1БесыФёдор Достоевский1872False2Старик и мореЭрнест Хемингуэй1952False<p>Чтобы отфильтровать данные, создадим новый запрос:</p>
76
select_author_query = db.select([books]).where(books.columns.book_author==′Фёдор Достоевский′) select_all_results = conn.execute(select_author_query)<p>Метод where работает как самый простой фильтр: если выполняется условие внутри скобок, то мы забираем строку таблицы в финальную выдачу. А если нет - пропускаем и идём дальше.</p>
76
select_author_query = db.select([books]).where(books.columns.book_author==′Фёдор Достоевский′) select_all_results = conn.execute(select_author_query)<p>Метод where работает как самый простой фильтр: если выполняется условие внутри скобок, то мы забираем строку таблицы в финальную выдачу. А если нет - пропускаем и идём дальше.</p>
77
<p>Наш фильтр выберет из таблицы все строки, у которых значение колонки book_author равно "Фёдор Достоевский". Это соответствует условию books.columns.book_author==′Фёдор Достоевский′. Здесь мы указываем, что берём таблицу books, смотрим на её столбцы columns и фильтруем по колонке book_author.</p>
77
<p>Наш фильтр выберет из таблицы все строки, у которых значение колонки book_author равно "Фёдор Достоевский". Это соответствует условию books.columns.book_author==′Фёдор Достоевский′. Здесь мы указываем, что берём таблицу books, смотрим на её столбцы columns и фильтруем по колонке book_author.</p>
78
<p>Вторая строка кода просто выполнит команду и обновит данные в таблице. За это отвечает соединение - объект conn.</p>
78
<p>Вторая строка кода просто выполнит команду и обновит данные в таблице. За это отвечает соединение - объект conn.</p>
79
<p>Результат получаем уже знакомым способом - с помощью метода fetchall():</p>
79
<p>Результат получаем уже знакомым способом - с помощью метода fetchall():</p>
80
print(select_all_results.fetchall()) >> [(1, ′Бесы′, ′Фёдор Достоевский′, 1872, False)]<p>Видим, что вывелась только одна строка. Но если бы у нас было больше книг от Достоевского в таблице, то вывелись бы все. Давайте добавим ещё две:</p>
80
print(select_all_results.fetchall()) >> [(1, ′Бесы′, ′Фёдор Достоевский′, 1872, False)]<p>Видим, что вывелась только одна строка. Но если бы у нас было больше книг от Достоевского в таблице, то вывелись бы все. Давайте добавим ещё две:</p>
81
insertion_query = books.insert().values([ {′book_name′:′Униженные и оскорблённые′, ′book_author′:′Фёдор Достоевский′, ′book_year′:1861}, {′book_name′:′Братья Карамазовы′, ′book_author′:′Фёдор Достоевский′, ′book_year′:1880} ])<p>Таблица теперь выглядит так:</p>
81
insertion_query = books.insert().values([ {′book_name′:′Униженные и оскорблённые′, ′book_author′:′Фёдор Достоевский′, ′book_year′:1861}, {′book_name′:′Братья Карамазовы′, ′book_author′:′Фёдор Достоевский′, ′book_year′:1880} ])<p>Таблица теперь выглядит так:</p>
82
book_idbook_namebook_authorbook_yearbook_is_taken1БесыФёдор Достоевский1872False2Старик и мореЭрнест Хемингуэй1952False3Униженные и оскорблённыеФёдор Достоевский1861False4Братья КарамазовыФёдор Достоевский1880False<p>Снова выполним запрос:</p>
82
book_idbook_namebook_authorbook_yearbook_is_taken1БесыФёдор Достоевский1872False2Старик и мореЭрнест Хемингуэй1952False3Униженные и оскорблённыеФёдор Достоевский1861False4Братья КарамазовыФёдор Достоевский1880False<p>Снова выполним запрос:</p>
83
select_author_query = db.select([books]).where(books.columns.book_author==′Фёдор Достоевский′) select_all_results = conn.execute(select_author_query) print(select_all_results.fetchall())<p>Результат:</p>
83
select_author_query = db.select([books]).where(books.columns.book_author==′Фёдор Достоевский′) select_all_results = conn.execute(select_author_query) print(select_all_results.fetchall())<p>Результат:</p>
84
[(1, ′Бесы′, ′Фёдор Достоевский′, 1872, False), (3, ′Униженные и оскорблённые′, ′Фёдор Достоевский′, 1861, False), (4, ′Братья Карамазовы′, ′Фёдор Достоевский′, 1880, False)]<p>Получили все строки с нужным автором.</p>
84
[(1, ′Бесы′, ′Фёдор Достоевский′, 1872, False), (3, ′Униженные и оскорблённые′, ′Фёдор Достоевский′, 1861, False), (4, ′Братья Карамазовы′, ′Фёдор Достоевский′, 1880, False)]<p>Получили все строки с нужным автором.</p>
85
<p>Данные можно не только получать, но и обновлять. Например, мы вдруг вспомнили, что первая версия "Братьев Карамазовых" Достоевского была опубликована в 1879 году. По крайней мере, на это ссылаются некоторые филологи. Поэтому давайте обновим дату публикации.</p>
85
<p>Данные можно не только получать, но и обновлять. Например, мы вдруг вспомнили, что первая версия "Братьев Карамазовых" Достоевского была опубликована в 1879 году. По крайней мере, на это ссылаются некоторые филологи. Поэтому давайте обновим дату публикации.</p>
86
<p>Чтобы изменить данные, используйте функцию update:</p>
86
<p>Чтобы изменить данные, используйте функцию update:</p>
87
update_query = db.update(books).where(books.columns.book_name==′Братья Карамазовы′).values(book_year=1879) conn.execute(update_query)<p>Здесь мы сначала вызвали функцию update и передали в неё таблицу. Затем выбрали нужную строку через фильтрацию с помощью функции where. А потом с помощью функции values изменили год в нужной строке.</p>
87
update_query = db.update(books).where(books.columns.book_name==′Братья Карамазовы′).values(book_year=1879) conn.execute(update_query)<p>Здесь мы сначала вызвали функцию update и передали в неё таблицу. Затем выбрали нужную строку через фильтрацию с помощью функции where. А потом с помощью функции values изменили год в нужной строке.</p>
88
<p>Стоит отметить, что объект-соединение conn не вернёт ничего после выполнения запроса. Поэтому, чтобы вывести элементы таблицы в консоль, придётся воспользоваться функцией select:</p>
88
<p>Стоит отметить, что объект-соединение conn не вернёт ничего после выполнения запроса. Поэтому, чтобы вывести элементы таблицы в консоль, придётся воспользоваться функцией select:</p>
89
select_all_query = db.select([books]) select_all_results = conn.execute(select_all_query) print(select_all_results.fetchall())<p>Посмотрим на обновлённую таблицу:</p>
89
select_all_query = db.select([books]) select_all_results = conn.execute(select_all_query) print(select_all_results.fetchall())<p>Посмотрим на обновлённую таблицу:</p>
90
book_idbook_namebook_authorbook_yearbook_is_taken1БесыФёдор Достоевский1872False2Старик и мореЭрнест Хемингуэй1952False3Униженные и оскорблённыеФёдор Достоевский1861False4Братья КарамазовыФёдор Достоевский<strong>1879</strong>False<p>Отлично - данные обновились.</p>
90
book_idbook_namebook_authorbook_yearbook_is_taken1БесыФёдор Достоевский1872False2Старик и мореЭрнест Хемингуэй1952False3Униженные и оскорблённыеФёдор Достоевский1861False4Братья КарамазовыФёдор Достоевский<strong>1879</strong>False<p>Отлично - данные обновились.</p>
91
<p>Ненужные строки в SQLAlchemy можно удалить с помощью функции delete:</p>
91
<p>Ненужные строки в SQLAlchemy можно удалить с помощью функции delete:</p>
92
delete_query = db.delete(books).where(books.columns.book_name==′Братья Карамазовы′) conn.execute(delete_query)<p>Логика кода выше похожа на предыдущие команды. Мы вызываем функцию delete, в неё передаём объект таблицы, а затем с помощью фильтров выбираем строку, которую нужно удалить. В нашем случае мы хотим удалить книгу с названием "Братья Карамазовы".</p>
92
delete_query = db.delete(books).where(books.columns.book_name==′Братья Карамазовы′) conn.execute(delete_query)<p>Логика кода выше похожа на предыдущие команды. Мы вызываем функцию delete, в неё передаём объект таблицы, а затем с помощью фильтров выбираем строку, которую нужно удалить. В нашем случае мы хотим удалить книгу с названием "Братья Карамазовы".</p>
93
<p>Функция delete также не возвращает ничего после выполнения запроса. Поэтому выводить элементы в консоль нужно с помощью функции select:</p>
93
<p>Функция delete также не возвращает ничего после выполнения запроса. Поэтому выводить элементы в консоль нужно с помощью функции select:</p>
94
select_all_query = db.select([books]) select_all_results = conn.execute(select_all_query) print(select_all_results.fetchall())<p>Таблица, из которой удалили элемент, выглядит так:</p>
94
select_all_query = db.select([books]) select_all_results = conn.execute(select_all_query) print(select_all_results.fetchall())<p>Таблица, из которой удалили элемент, выглядит так:</p>
95
book_idbook_namebook_authorbook_yearbook_is_taken1БесыФёдор Достоевский1872False2Старик и мореЭрнест Хемингуэй1952False3Униженные и оскорблённыеФёдор Достоевский1861False<p>Всё работает - элемент и правда удалён.</p>
95
book_idbook_namebook_authorbook_yearbook_is_taken1БесыФёдор Достоевский1872False2Старик и мореЭрнест Хемингуэй1952False3Униженные и оскорблённыеФёдор Достоевский1861False<p>Всё работает - элемент и правда удалён.</p>
96
<p>Резюмируем всё, что узнали об SQLAlchemy:</p>
96
<p>Резюмируем всё, что узнали об SQLAlchemy:</p>
97
<ul><li>SQLAlchemy - это библиотека для Python, которая умеет общаться с базами данных прямо в Python-коде.</li>
97
<ul><li>SQLAlchemy - это библиотека для Python, которая умеет общаться с базами данных прямо в Python-коде.</li>
98
<li>Главное её достоинство - ORM. С помощью него можно работать с базами данных, как будто это обычные объекты в языке Python.</li>
98
<li>Главное её достоинство - ORM. С помощью него можно работать с базами данных, как будто это обычные объекты в языке Python.</li>
99
<li>Библиотека поддерживает много популярных диалектов SQL - например, MySQL, SQLite и PostgreSQL.</li>
99
<li>Библиотека поддерживает много популярных диалектов SQL - например, MySQL, SQLite и PostgreSQL.</li>
100
<li>SQLAlchemy умеет выполнять все запросы, доступные в SQL. Поэтому вы не заметите отличий от самого SQL, когда перейдёте на неё.</li>
100
<li>SQLAlchemy умеет выполнять все запросы, доступные в SQL. Поэтому вы не заметите отличий от самого SQL, когда перейдёте на неё.</li>
101
<li>В библиотеке есть привычные запросы: select, update, delete, filter, where и другие.</li>
101
<li>В библиотеке есть привычные запросы: select, update, delete, filter, where и другие.</li>
102
</ul><p>Python для всех</p>
102
</ul><p>Python для всех</p>
103
<p>Вы освоите Python на практике и создадите проекты для портфолио - телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер - руководитель отдела разработки в "Сбере".</p>
103
<p>Вы освоите Python на практике и создадите проекты для портфолио - телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер - руководитель отдела разработки в "Сбере".</p>
104
<p><a>Пройти бесплатно</a></p>
104
<p><a>Пройти бесплатно</a></p>
105
<a><b>Бесплатный курс по разработке на Python ➞</b>Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер - руководитель отдела разработки в "Сбере". Пройти курс</a>
105
<a><b>Бесплатный курс по разработке на Python ➞</b>Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер - руководитель отдела разработки в "Сбере". Пройти курс</a>