HTML Diff
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 &gt;&gt;&gt; import sqlalchemy &gt;&gt;&gt; sqlalchemy.__version__ '1.4.41'<p>Если мы получили в ответе версию библиотеки, то всё установлено правильно. При импорте библиотеки сразу зададим ей короткое имя, чтобы постоянно не писать sqlalchemy:</p>
29 &gt;&gt;&gt; import sqlalchemy &gt;&gt;&gt; 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()) &gt;&gt; [(1, ′Бесы′, ′Фёдор Достоевский′, 1872, False)]<p>Видим, что вывелась только одна строка. Но если бы у нас было больше книг от Достоевского в таблице, то вывелись бы все. Давайте добавим ещё две:</p>
80 print(select_all_results.fetchall()) &gt;&gt; [(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>