Рубрики
Без рубрики

Модуль Python SQLite

Модуль Python SQLite-это легкая библиотека, которая обеспечивает простой способ выполнения часто сложной задачи управления базами данных типа SQL. Это, в отличие от других

Автор оригинала: Pankaj Kumar.

Python SQLite Module-это легкая библиотека, которая обеспечивает простой способ выполнения часто сложной задачи управления базами данных SQL type. Это, в отличие от других систем баз данных, не требует выделенного серверного процесса/машины.

Это сочетает в себе простые в использовании запросы типа SQL для управления базами данных, но использует его для внутреннего хранения объектов самым простым способом!

Давайте быстро пройдемся по этой библиотеке и создадим нашу собственную базу данных для нашего приложения!

Python SQLite

Python SQLite поставляется вместе с любой установленной версией Python, поэтому нет необходимости устанавливать его с помощью pip . Правильно, он у вас уже есть!

Чтобы импортировать его, поскольку мы будем использовать Python3 , мы импортируем модуль sqlite3 .

import sqlite3

Давайте начнем с основных методов модуля.

Создание базы данных

Хотя мы уже упоминали, что внешний сервер не работает, и все находится внутри текущей машины, поскольку это стандартный протокол для систем баз данных, этот модуль также действует как один, делая это!

Мы создадим соединение с базой данных Python SQLite . Это только выделяет память для базы данных и извлекает любые данные из файла базы данных, так что база данных создается из файла db .

import sqlite3
# Establish a connection to the Database and create
# a connection object
conn = sqlite3.connect('database.db')

Здесь database.db – это файл базы данных, в котором будут храниться данные. Поэтому мы вызываем базу данных из этого файла.

ПРИМЕЧАНИЕ : Если этот файл не существует, база данных автоматически создаст его для вас и будет использовать этот файл для обновления базы данных в следующий раз.

Если у нас уже есть файл, мы должны убедиться, что случайно не перезапишем его. Итак, мы должны проверить, существует ли файл уже в системе, используя приведенную ниже функцию.

import os

def check_db(filename):
    return os.path.exists(filename)

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

import sqlite3
conn = sqlite3.connect(':memory:')

Проблема с приведенным выше методом заключается в том, что нам нужно явно закрыть соединение в конце, используя conn.close() . У Python есть очень хорошее решение для этого – контекстные менеджеры . A with оператор context manager автоматически сделает это за вас, поэтому наш измененный код теперь будет:

import sqlite3

db_file = 'database.db'
with sqlite3.connect(db_file) as conn:
    print('Created the connection!')
print('Automatically closed the connection!')

Выход

Created the connection!
Automatically closed the connection!

Создайте объект курсора

Как только соединение установлено, у нас есть объект соединения, из которого мы можем построить объект Cursor .

# Create a cursor to the Database
c = conn.cursor()

Этот курсор является указателем на базу данных, которая используется для навигации по ней, чтобы мы могли перемещаться по местоположениям и выполнять SQL-запросы.

Создайте схему базы данных

Прежде чем мы начнем выполнять запросы, нам нужно сначала создать схему, основанную на том, как будут храниться записи. Это происходит в виде таблицы базы данных , которая представляет собой структуру, содержащую строки и столбцы.

Строки соответствуют фактическим значениям данных, а столбцы – именам атрибутов.

Давайте создадим простую схему для хранения изображений. Мы определим любое изображение как имеющее Имя , a Размер и Дата создания изображения. Фактические данные будут где-то в памяти. Схема определяет только то, как организованы данные.

Таблица Бд

Поскольку мы собираемся определить таблицу следующим образом, схема таблицы будет выглядеть следующим образом.

Таблица изображений

Мы можем выполнять запросы с помощью курсора, передавая cursor.execute('SQL_QUERY') , используя SQL запрос.

Давайте напишем SQL-запрос для создания этой схемы.

CREATE TABLE images(
    name text primary key,
    size text,
    date date
);

Мы можем передать этот запрос в виде строки, но если вы хотите выполнять более длинные запросы, проще просто создать файл .sql , а затем прочитать его из файла, используя cursor.executescript() .

Итак , давайте поместим наш запрос в файл с именем schema.sql и прочитаем из него.

import sqlite3
import os

def check_db(filename):
    return os.path.exists(filename)

db_file = 'database.db'
schema_file = 'schema.sql'

if check_db(db_file):
    print('Database already exists. Exiting...')
    exit(0)

with open(schema_file, 'r') as rf:
    # Read the schema from the file
    schema = rf.read()

with sqlite3.connect(db_file) as conn:
    print('Created the connection!')
    # Execute the SQL query to create the table
    conn.executescript(schema)
    print('Created the Table! Now inserting')
    conn.executescript("""
                       insert into images (name, size, date)
                       values
                       ('sample.png', 100, '2019-10-10'),
                       ('ask_python.png', 450, '2019-05-02'),
                       ('class_room.jpeg', 1200, '2018-04-07');
                       """)
    print('Inserted values into the table!')
print('Closed the connection!')

Выход

Created the connection!
Created the Table! Now inserting
Inserted values into the table!
Closed the connection!

Получите значения из таблицы

Теперь, когда у нас есть таблица с начальными значениями, давайте запросим таблицу, чтобы получить все ее строки. Мы не можем просто распечатать объект курсора, поэтому нам нужно явно получить атрибуты с помощью cursor.fetchall () и распечатайте их , выполнив итерацию.

import sqlite3

db_file = 'database.db'

with sqlite3.connect(db_file) as conn:
    cursor = conn.cursor()
    cursor.execute("""
                   select * from images
                   """)
    for row in cursor.fetchall():
        name, size, date = row
        print(f'{name} {size} {date}')

Выход

sample.png 100 2019-10-10
ask_python.png 450 2019-05-02
class_room.jpeg 1200 2018-04-07

Транзакции в SQLite

Управление транзакциями является одной из функций баз данных SQL, и SQLite также обрабатывает их. Транзакция-это в основном последовательность изменений, в которой вы можете безопасно изменить базу данных, выполнив запрос, а затем разместив commit .

Если по какой-то причине непосредственно перед фиксацией вы не хотите завершать транзакцию, вы можете вернуться в предыдущее состояние перед фиксацией, используя rollback .

Аналогично, мы также можем просматривать состояние базы данных с помощью этих типов изменений.

import sqlite3

db_filename = 'database.db'

def display_table(conn):
    cursor = conn.cursor()
    cursor.execute('select name, size, date from images;')
    for name, size, date in cursor.fetchall():
        print(name, size, date)


with sqlite3.connect(db_filename) as conn1:
    print('Before changes:')
    display_table(conn1)

    cursor1 = conn1.cursor()
    cursor1.execute("""
    insert into images (name, size, date)
    values ('JournalDev.png', 2000, '2020-02-20');
    """)

    print('\nAfter changes in conn1:')
    display_table(conn1)

    print('\nBefore commit:')
    with sqlite3.connect(db_filename) as conn2:
        display_table(conn2)

    # Commit from the first connection
    conn1.commit()
    print('\nAfter commit:')
    with sqlite3.connect(db_filename) as conn3:
        display_table(conn3)

    cursor1.execute("""
    insert into images (name, size, date)
    values ('Hello.png', 200, '2020-01-18');
    """)

    print('\nBefore commit:')
    with sqlite3.connect(db_filename) as conn2:
        display_table(conn2)

    # Revert to changes before conn1's commit
    conn1.rollback()
    print('\nAfter connection 1 rollback:')
    with sqlite3.connect(db_filename) as conn4:
        display_table(conn4)

Выход

Before changes:
sample.png 100 2019-10-10
ask_python.png 450 2019-05-02
class_room.jpeg 1200 2018-04-07

After changes in conn1:
sample.png 100 2019-10-10
ask_python.png 450 2019-05-02
class_room.jpeg 1200 2018-04-07
JournalDev.png 2000 2020-02-20

Before commit:
sample.png 100 2019-10-10
ask_python.png 450 2019-05-02
class_room.jpeg 1200 2018-04-07

After commit:
sample.png 100 2019-10-10
ask_python.png 450 2019-05-02
class_room.jpeg 1200 2018-04-07
JournalDev.png 2000 2020-02-20

Before commit:
sample.png 100 2019-10-10
ask_python.png 450 2019-05-02
class_room.jpeg 1200 2018-04-07
JournalDev.png 2000 2020-02-20

After connection 1 rollback:
sample.png 100 2019-10-10
ask_python.png 450 2019-05-02
class_room.jpeg 1200 2018-04-07
JournalDev.png 2000 2020-02-20

Здесь, как вы можете видеть, таблица изменяется только после того, как мы явно завершим транзакцию. Любые изменения до этого фактически не изменяют таблицу.

Наконец, мы откатываем запись Hello.png , чтобы она не вставлялась в таблицу.

Вывод

Надеюсь, это дало вам хорошее представление о том, как вы можете использовать систему баз данных типа SQL с легкостью Python в sqlite3 .

Рекомендации