Все приложения взаимодействуют с данными, чаще всего через



бет5/5
Дата21.01.2022
өлшемі105,52 Kb.
#112943
түріРуководство
1   2   3   4   5
Байланысты:
Как подружить Python и базы данных SQL (1)

Примечание. Не рекомендуется использовать SELECT * для больших таблиц, так как это может привести к большому числу операций ввода-вывода, которые увеличивают сетевой трафик.

Результат вышеприведенного запроса выглядит следующим образом:



(1, 'James', 25, 'male', 'USA')

(2, 'Leila', 32, 'female', 'France')

(3, 'Brigitte', 35, 'female', 'England')

(4, 'Mike', 40, 'male', 'Denmark')

(5, 'Elizabeth', 21, 'female', 'Canada')

Таким же образом вы можете извлечь все записи из таблицы posts:



select_posts = "SELECT * FROM posts"

posts = execute_read_query(connection, select_posts)
for post in posts:

print(post)

Вывод выглядит так:



(1, 'Happy', 'I am feeling very happy today', 1)

(2, 'Hot Weather', 'The weather is very hot today', 2)

(3, 'Help', 'I need some help with my work', 2)

(4, 'Great News', 'I am getting married', 1)

(5, 'Interesting Game', 'It was a fantastic game of tennis', 5)

(6, 'Party', 'Anyone up for a late-night party today?', 3)

JOIN


Вы также можете выполнять более сложные запросы, включающие операции типа JOIN для извлечения данных из двух связанных таблиц. Например, следующий скрипт возвращает идентификаторы и имена пользователей, а также описание сообщений, опубликованных этими пользователями:

select_users_posts = """

SELECT

users.id,

users.name,

posts.description

FROM

posts

INNER JOIN users ON users.id = posts.user_id

"""
users_posts = execute_read_query(connection, select_users_posts)
for users_post in users_posts:

print(users_post)

Вывод данных:



(1, 'James', 'I am feeling very happy today')

(2, 'Leila', 'The weather is very hot today')

(2, 'Leila', 'I need some help with my work')

(1, 'James', 'I am getting married')

(5, 'Elizabeth', 'It was a fantastic game of tennis')

(3, 'Brigitte', 'Anyone up for a late night party today?')

Следующий скрипт возвращает все сообщения вместе с комментариями к сообщениям и именами пользователей, которые разместили комментарии:



select_posts_comments_users = """

SELECT

posts.description as post,

text as comment,

name

FROM

posts

INNER JOIN comments ON posts.id = comments.post_id

INNER JOIN users ON users.id = comments.user_id

"""
posts_comments_users = execute_read_query(

connection, select_posts_comments_users

)
for posts_comments_user in posts_comments_users:

print(posts_comments_user)

Вывод выглядит так:



('Anyone up for a late night party today?', 'Count me in', 'James')

('I need some help with my work', 'What sort of help?', 'Elizabeth')

('I am getting married', 'Congrats buddy', 'Leila')

('It was a fantastic game of tennis', 'I was rooting for Nadal though', 'Mike')

('I need some help with my work', 'Help with your thesis?', 'Leila')

('I am getting married', 'Many congratulations', 'Elizabeth')

Из вывода понятно, что имена столбцов не были возвращены методом fetchall(). Чтобы вернуть имена столбцов, нужно забрать атрибут description объекта cursor. Например, следующий список возвращает все имена столбцов для вышеуказанного запроса:



cursor = connection.cursor()

cursor.execute(select_posts_comments_users)

cursor.fetchall()
column_names = [description[0] for description in cursor.description]

print(column_names)

Вывод выглядит так:



['post', 'comment', 'name']

WHERE


Теперь мы выполним SELECT-запрос, который возвращает текст поста и общее количество лайков, им полученных:

select_post_likes = """

SELECT

description as Post,

COUNT(likes.id) as Likes

FROM

likes,

posts

WHERE

posts.id = likes.post_id

GROUP BY

likes.post_id

"""
post_likes = execute_read_query(connection, select_post_likes)
for post_like in post_likes:

print(post_like)

Вывод следующий:



('The weather is very hot today', 1)

('I need some help with my work', 1)

('I am getting married', 2)

('It was a fantastic game of tennis', 1)

('Anyone up for a late night party today?', 2)

То есть используя запрос WHERE, вы можете возвращать более конкретные результаты.

MySQL

Процесс выбора записей в MySQL абсолютно идентичен процессу выбора записей в SQLite:



def execute_read_query(connection, query):

cursor = connection.cursor()

result = None

try:

cursor.execute(query)

result = cursor.fetchall()

return result

except Error as e:

print(f"The error '{e}' occurred")

Теперь выберем все записи из таблицы users:



select_users = "SELECT * FROM users"

users = execute_read_query(connection, select_users)
for user in users:

print(user)

Вывод будет похож на то, что мы видели с SQLite.

PostgreSQL

Процесс выбора записей из таблицы PostgreSQL с помощью модуля psycopg2 тоже похож на SQLite и MySQL. Снова используем cursor.execute(), затем метод fetchall()для выбора записей из таблицы. Следующий скрипт выбирает все записи из таблицы users:



def execute_read_query(connection, query):

cursor = connection.cursor()

result = None

try:

cursor.execute(query)

result = cursor.fetchall()

return result

except OperationalError as e:

print(f"The error '{e}' occurred")
select_users = "SELECT * FROM users"

users = execute_read_query(connection, select_users)
for user in users:

print(user)

Опять же, результат будет похож на то, что мы видели раньше.

6. Обновление записей таблицы

SQLite


Обновление записей в SQLite выглядит довольно просто. Снова можно применить execute_query(). В качестве примера обновим текст поста с id равным 2. Сначала создадим описание для SELECT:

select_post_description = "SELECT description FROM posts WHERE id = 2"
post_description = execute_read_query(connection, select_post_description)
for description in post_description:

print(description)

Увидим следующий вывод:



('The weather is very hot today',)

Следующий скрипт обновит описание:



update_post_description = """

UPDATE

posts

SET

description = "The weather has become pleasant now"

WHERE

id = 2

"""
execute_query(connection, update_post_description)

Теперь, если мы выполним SELECT-запрос еще раз, увидим следующий результат:



('The weather has become pleasant now',)

То есть запись была обновлена.

MySQL

Процесс обновления записей в MySQL с помощью модуля mysql-connector-python является точной копией модуля sqlite3:



update_post_description = """

UPDATE

posts

SET

description = "The weather has become pleasant now"

WHERE

id = 2

"""
execute_query(connection, update_post_description)

PostgreSQL

Запрос на обновление PostgreSQL аналогичен SQLite и MySQL.

7. Удаление записей таблицы

SQLite

В качестве примера удалим комментарий с id равным 5:



delete_comment = "DELETE FROM comments WHERE id = 5"

execute_query(connection, delete_comment)

Теперь, если мы извлечем все записи из таблицы comments, то увидим, что пятый комментарий был удален. Процесс удаления в MySQL и PostgreSQL идентичен SQLite:

Заключение

В этом руководстве мы разобрались, как применять три распространенные библиотеки Python для работы с реляционными базами данных. Научившись работать с одним из модулей sqlite3, mysql-connector-python и psycopg2, вы легко сможете перенести свои знания на другие модули и оперировать любой из баз данных SQLite, MySQL и PostgreSQL.



Однако это лишь вершина айсберга! Существуют также библиотеки для работы с SQL и объектно-реляционными отображениями, такие как SQLAlchemy и Django ORM, которые автоматизируют задачи взаимодействия Python с базами данных.

Если вам интересна тематика работы с базами данных с помощью Python, напишите об этом в комментариях – мы подготовим дополнительные материалы.

Достарыңызбен бөлісу:
1   2   3   4   5




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет