Автор оригинала: Pankaj Kumar.
Если вы ищете что-то, с помощью которого вы можете использовать полные операции БД в свое приложение, без необходимости установки программы серверов базы данных, таких как MySQL, PostgreSQL или Oracle, Python SQLite3
Модуль для вас.
Python sqlite.
Python SQLite3 – это отличный модуль, с которым вы можете выполнять все возможные операции БД с памятью и постоянной базой данных в ваших приложениях.
Этот модуль реализует Python DB API Интерфейс должен быть совместимым решением для реализации операций, связанных с SQL в программе.
Использование модуля SQLite3
В этом разделе мы начнем использовать SQLite3
Модуль в нашем приложении, чтобы мы могли создавать базы данных и таблицы внутри него и выполнять различные операции БД на нем. Давайте начнем.
Python SQLite Create База данных
Когда мы говорим о базах данных, мы смотрим на один файл, который будет сохранен в файловой системе, и его доступ управляется сам модуль, чтобы предотвратить повреждение, когда несколько пользователей пытаются писать ему.
Вот пример программы, которая создает новую базу данных перед открытием ее для операций:
import os import sqlite3 db_filename = 'journaldev.db' db_exists = not os.path.exists(db_filename) connection = sqlite3.connect(db_filename) if db_exists: print('No schema exists.') else: print('DB exists.') connection.close()
Мы проверим программу дважды, чтобы проверить, работает ли она правильно. Давайте посмотрим на вывод этой программы:
Создать новую БД
Как и ожидалось, второй раз мы запустим программу, мы видим вывод какБД существует
Отказ Python SQLite Create Table
Чтобы начать работу с базой данных, мы должны определить таблицу схемы, на которую мы будем писать наши дополнительные запросы и выполнять операции. Вот схема, которую мы будем следовать:
Схема таблицы SQLite Python
Для одной и той же схемы мы будем писать связанные с SQL Query Next, и эти запросы будут сохранены в book_schema.sql
:
CREATE TABLE book ( name text primary key, topic text, published date ); CREATE TABLE chapter ( id number primary key autoincrement not null, name text, day_effort integer, book text not null references book(name) );
Теперь будем использовать Подключиться ()
Функция для подключения к базе данных и вставить некоторые исходные данные с использованием executeScript ()
Функция:
import os import sqlite3 db_filename = 'journaldev.db' schema_filename = 'book_schema.sql' db_exists = not os.path.exists(db_filename) with sqlite3.connect(db_filename) as conn: if db_exists: print('Creating schema') with open(schema_filename, 'rt') as file: schema = file.read() conn.executescript(schema) print('Inserting initial data') conn.executescript(""" insert into book (name, topic, published) values ('JournalDev', 'Java', '2011-01-01'); insert into chapter (name, day_effort, book) values ('Java XML', 2,'JournalDev'); insert into chapter (name, day_effort, book) values ('Java Generics', 1, 'JournalDev'); insert into chapter (name, day_effort, book) values ('Java Reflection', 3, 'JournalDev'); """) else: print('DB already exists.')
Когда мы выполняем программу и проверьте, какие все данные присутствуют в таблице главы, мы увидим следующий вывод:
БД с исходными данными
Посмотрите, как я смог запросить каталог файла DB из командной строки. Мы будем запросить данные из самого модуля SQLite3 в следующем разделе.Выбор курсора Python SQLite Select
Теперь мы извлемте данные в нашем скрипте, используя курсор, чтобы получить все главы, которые выполняют некоторые критерии:
import sqlite3 db_filename = 'journaldev.db' with sqlite3.connect(db_filename) as conn: cursor = conn.cursor() cursor.execute(""" select id, name, day_effort, book from chapter where book = 'JournalDev' """) for row in cursor.fetchall(): id, name, day_effort, book = row print('{:2d} ({}) {:2d} ({})'.format( id, name, day_effort, book))
Давайте посмотрим на вывод этой программы:
Получить данные из БД
Это был простой пример получения данных из таблицы, где один столбец соответствует определенному значению.
Получение метаданных таблицы
В наших программах также важно получить метаданные для таблицы для целей документации и гораздо больше:
import sqlite3 db_filename = 'journaldev.db' with sqlite3.connect(db_filename) as connection: cursor = connection.cursor() cursor.execute(""" select * from chapter where book = 'JournalDev' """) print('Chapter table has these columns:') for column_info in cursor.description: print(column_info)
Давайте посмотрим на вывод этой программы:
Метаданные стола
Из-за причины создания схемы мы не предоставили колонку чего-либо от их имени, большинство значений нет.Используя именованные параметры
С именованными параметрами мы можем пройти аргументы нашим сценариям и, следовательно, SQL-запросы мы пишем в наших программах. Использование именованных параметров очень легко, давайте посмотрим, как мы можем сделать это:
import sqlite3 import sys db_filename = 'journaldev.db' book_name = sys.argv[1] with sqlite3.connect(db_filename) as conn: cursor = conn.cursor() query = """ select id, name, day_effort, book from chapter where book = :book_name """ cursor.execute(query, {'book_name': book_name}) for row in cursor.fetchall(): id, name, day_effort, book = row print('{:2d} ({}) {:2d} ({})'.format( id, name, day_effort, book))
Давайте посмотрим на вывод этой программы:
Прохождение именованного параметра
Посмотрите, как легко пройти названный параметр и заменить его в запрос прямо перед его выполнением.Управление транзакциями Python SQLite3
Ну, транзакции – это функция, для которой известны реляционные базы данных. Модуль SQLite3 полностью способен управлять внутренним состоянием транзакции, единственное, что нам нужно сделать, это позволить ему знать, что транзакция произойдет.
Вот образец программы, которая описывает, как мы пишем транзакции в нашей программе, явно вызывая совершать ()
Функция:
import sqlite3 db_filename = 'journaldev.db' def show_books(conn): cursor = conn.cursor() cursor.execute('select name, topic from book') for name, topic in cursor.fetchall(): print(' ', name) with sqlite3.connect(db_filename) as conn1: print('Before changes:') show_books(conn1) # Insert in one cursor cursor1 = conn1.cursor() cursor1.execute(""" insert into book (name, topic, published) values ('Welcome Python', 'Python', '2013-01-01') """) print('\nAfter changes in conn1:') show_books(conn1) # Select from another connection, without committing first print('\nBefore commit:') with sqlite3.connect(db_filename) as conn2: show_books(conn2) # Commit then select from another connection conn1.commit() print('\nAfter commit:') with sqlite3.connect(db_filename) as conn3: show_books(conn3)
Давайте посмотрим на вывод этой программы:
Работает транзакциями
Когда show_books (...)
Функция называется до Conn1
был совершен, результат зависит от того, какое соединение используется. Как изменения были сделаны из Conn1
это видит внесенные изменения, но Conn2
нет. Как только мы совершили все изменения, все соединения смогли увидеть внесенные изменения, включая Conn3
Отказ
Заключение
В этом уроке мы изучали основы модуля SQLite3 в Python и преданные транзакциями также. Когда ваша программа хочет работать с некоторыми реляционными данными, модуль SQLite3 обеспечивает простой способ справиться с данными и получать результаты по всей жизни программы.