Сохранение данных Python - модуль Sqlite3
Одним из основных недостатков файлов CSV, JSON, XML и т. Д. Является то, что они не очень полезны для произвольного доступа и обработки транзакций, поскольку они в значительной степени неструктурированы по своей природе. Следовательно, становится очень трудно изменить содержимое.
Эти плоские файлы не подходят для среды клиент-сервер, поскольку в них отсутствует возможность асинхронной обработки. Использование файлов с неструктурированными данными приводит к избыточности и несогласованности данных.
Эти проблемы можно решить с помощью реляционной базы данных. База данных - это организованный набор данных для устранения избыточности и несогласованности и поддержания целостности данных. Модель реляционной базы данных очень популярна.
Его основная идея - упорядочить данные в таблице сущностей (называемой отношением). Структура таблицы сущностей предоставляет один атрибут, значение которого уникально для каждой строки. Такой атрибут называется'primary key'.
Когда первичный ключ одной таблицы появляется в структуре других таблиц, он называется 'Foreign key'и это составляет основу отношений между ними. На основе этой модели в настоящее время доступно множество популярных продуктов РСУБД -
- GadFly
- mSQL
- MySQL
- PostgreSQL
- Microsoft SQL Server 2000
- Informix
- Interbase
- Oracle
- Sybase
- SQLite
SQLite - это легкая реляционная база данных, используемая в самых разных приложениях. Это автономная, бессерверная, транзакционная СУБД с нулевой конфигурацией. Вся база данных представляет собой один файл, который можно разместить в любом месте файловой системы. Это программное обеспечение с открытым исходным кодом, занимающее очень мало места и не требующее настройки. Он широко используется во встроенных устройствах, IOT и мобильных приложениях.
Все реляционные базы данных используют SQL для обработки данных в таблицах. Однако ранее каждая из этих баз данных связывалась с приложением Python с помощью модуля Python, специфичного для данного типа базы данных.
Следовательно, между ними отсутствовала совместимость. Если бы пользователь захотел перейти на другой продукт базы данных, это было бы сложно. Эта проблема несовместимости была решена путем поднятия «предложения по расширению Python (PEP 248)», чтобы рекомендовать согласованный интерфейс для реляционных баз данных, известный как DB-API. Последние рекомендации называютсяDB-APIВерсия 2.0. (PEP 249)
Стандартная библиотека Python состоит из модуля sqlite3, который является совместимым с DB-API модулем для работы с базой данных SQLite с помощью программы Python. В этой главе объясняется возможность подключения Python к базе данных SQLite.
Как упоминалось ранее, в Python встроена поддержка базы данных SQLite в виде модуля sqlite3. Для других баз данных соответствующий модуль Python, совместимый с DB-API, должен быть установлен с помощью утилиты pip. Например, чтобы использовать базу данных MySQL, нам необходимо установить модуль PyMySQL.
pip install pymysql
В DB-API рекомендуются следующие шаги -
Установите соединение с базой данных, используя connect() функция и получить объект подключения.
Вызов cursor() метод объекта подключения для получения объекта курсора.
Сформируйте строку запроса, состоящую из выполняемого оператора SQL.
Выполните желаемый запрос, вызвав execute() метод.
Закройте соединение.
import sqlite3
db=sqlite3.connect('test.db')
Здесь db - это объект подключения, представляющий test.db. Обратите внимание: эта база данных будет создана, если она еще не существует. Объект подключения db имеет следующие методы -
Sr.No. | Методы и описание |
---|---|
1 |
cursor(): Возвращает объект Cursor, который использует это соединение. |
2 |
commit(): Явно фиксирует все ожидающие транзакции в базе данных. |
3 |
rollback(): Этот необязательный метод вызывает откат транзакции до начальной точки. |
4 |
close(): Закрывает соединение с базой данных навсегда. |
Курсор действует как дескриптор для данного SQL-запроса, позволяя получить одну или несколько строк результата. Объект курсора получается из соединения для выполнения SQL-запросов с использованием следующего оператора -
cur=db.cursor()
Для объекта курсора определены следующие методы:
Старший Нет | Методы и описание |
---|---|
1 |
execute() Выполняет SQL-запрос в строковом параметре. |
2 |
executemany() Выполняет SQL-запрос, используя набор параметров в списке кортежей. |
3 |
fetchone() Выбирает следующую строку из набора результатов запроса. |
4 |
fetchall() Выбирает все оставшиеся строки из набора результатов запроса. |
5 |
callproc() Вызывает хранимую процедуру. |
6 |
close() Закрывает объект курсора. |
Следующий код создает таблицу в test.db: -
import sqlite3
db=sqlite3.connect('test.db')
cur =db.cursor()
cur.execute('''CREATE TABLE student (
StudentID INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT (20) NOT NULL,
age INTEGER,
marks REAL);''')
print ('table created successfully')
db.close()
Желаемая целостность данных в базе данных достигается за счет commit() и rollback()методы объекта подключения. Строка SQL-запроса может содержать неправильный SQL-запрос, который может вызвать исключение, которое необходимо правильно обработать. Для этого оператор execute () помещается в блок try. В случае успеха результат постоянно сохраняется с помощью метода commit (). Если запрос не выполняется, транзакция отменяется с помощью метода rollback ().
Следующий код выполняет запрос INSERT к таблице учеников в test.db.
import sqlite3
db=sqlite3.connect('test.db')
qry="insert into student (name, age, marks) values('Abbas', 20, 80);"
try:
cur=db.cursor()
cur.execute(qry)
db.commit()
print ("record added successfully")
except:
print ("error in query")
db.rollback()
db.close()
Если вы хотите, чтобы данные в предложении значений запроса INSERT были динамически предоставлены пользователем, используйте подстановку параметров, как рекомендовано в Python DB-API. ? символ используется в качестве заполнителя в строке запроса и предоставляет значения в виде кортежа в методе execute (). В следующем примере вставляется запись с использованием метода подстановки параметров. В качестве входных данных используются имя, возраст и оценки.
import sqlite3
db=sqlite3.connect('test.db')
nm=input('enter name')
a=int(input('enter age'))
m=int(input('enter marks'))
qry="insert into student (name, age, marks) values(?,?,?);"
try:
cur=db.cursor()
cur.execute(qry, (nm,a,m))
db.commit()
print ("one record added successfully")
except:
print("error in operation")
db.rollback()
db.close()
Модуль sqlite3 определяет executemany()метод, который может добавлять сразу несколько записей. Добавляемые данные должны быть представлены в виде списка кортежей, каждый кортеж должен содержать одну запись. Объект списка - это параметр метода executemany () вместе со строкой запроса. Однако метод executemany () не поддерживается некоторыми другими модулями.
В UPDATEзапрос обычно содержит логическое выражение, указанное в предложении WHERE. Строка запроса в методе execute () должна содержать синтаксис запроса UPDATE. Чтобы обновить значение 'age' до 23 для name = 'Anil', определите строку, как показано ниже:
qry="update student set age=23 where name='Anil';"
Чтобы сделать процесс обновления более динамичным, мы используем метод подстановки параметров, как описано выше.
import sqlite3
db=sqlite3.connect('test.db')
nm=input(‘enter name’)
a=int(input(‘enter age’))
qry="update student set age=? where name=?;"
try:
cur=db.cursor()
cur.execute(qry, (a, nm))
db.commit()
print("record updated successfully")
except:
print("error in query")
db.rollback()
db.close()
Аналогичным образом операция DELETE выполняется путем вызова метода execute () со строкой, имеющей синтаксис SQL-запроса DELETE. Кстати,DELETE запрос также обычно содержит WHERE пункт.
import sqlite3
db=sqlite3.connect('test.db')
nm=input(‘enter name’)
qry="DELETE from student where name=?;"
try:
cur=db.cursor()
cur.execute(qry, (nm,))
db.commit()
print("record deleted successfully")
except:
print("error in operation")
db.rollback()
db.close()
Одна из важных операций с таблицей базы данных - извлечение из нее записей. SQL предоставляетSELECTзапрос для этой цели. Когда в метод execute () передается строка, содержащая синтаксис запроса SELECT, возвращается объект набора результатов. Есть два важных метода с объектом курсора, с помощью которых можно получить одну или несколько записей из набора результатов.
fetchone ()
Выбирает следующую доступную запись из набора результатов. Это кортеж, состоящий из значений каждого столбца выбранной записи.
fetchall ()
Выбирает все оставшиеся записи в виде списка кортежей. Каждый кортеж соответствует одной записи и содержит значения каждого столбца в таблице.
В следующем примере перечислены все записи в таблице студентов.
import sqlite3
db=sqlite3.connect('test.db')
37
sql="SELECT * from student;"
cur=db.cursor()
cur.execute(sql)
while True:
record=cur.fetchone()
if record==None:
break
print (record)
db.close()
Если вы планируете использовать базу данных MySQL вместо базы данных SQLite, вам необходимо установить PyMySQLмодуль, как описано выше. Все шаги в процессе подключения к базе данных одинаковы, поскольку база данных MySQL установлена на сервере, функции connect () требуется URL-адрес и учетные данные для входа.
import pymysql
con=pymysql.connect('localhost', 'root', '***')
Единственное, что может отличаться от SQLite, - это специфические типы данных MySQL. Точно так же любую ODBC-совместимую базу данных можно использовать с Python, установив модуль pyodbc.