📜  Python数据持久性-Sqlite3模块

📅  最后修改于: 2020-11-07 08:27:06             🧑  作者: Mango


CSV,JSON,XML等文件的一个主要缺点是,它们对于随机访问和事务处理不是很有用,因为它们实质上是非结构化的。因此,修改内容变得非常困难。

这些平面文件缺少异步处理功能,因此不适合客户端-服务器环境。使用非结构化数据文件会导致数据冗余和不一致。

通过使用关系数据库可以克服这些问题。数据库是有组织的数据收集,以消除冗余和不一致并维护数据完整性。关系数据库模型非常流行。

它的基本概念是将数据安排在实体表中(称为关系)。实体表结构提供了一个属性,其值对于每一行都是唯一的。这样的属性称为“主键”

当一个表的主键出现在其他表的结构中时,称为“外键” ,这构成了两者之间关系的基础。基于此模型,当前有许多流行的RDBMS产品可用-

  • SQL
  • 的MySQL
  • PostgreSQL的
  • Microsoft SQL Server 2000
  • Informix
  • 基地间
  • 甲骨文
  • Sybase公司
  • SQLite的

SQLite是用于各种应用程序的轻量级关系数据库。它是一个自包含,无服务器,零配置的事务型SQL数据库引擎。整个数据库是一个文件,可以将其放置在文件系统中的任何位置。这是一款开源软件,占地面积非常小,零配置。它广泛用于嵌入式设备,物联网和移动应用程序中。

所有关系数据库都使用SQL来处理表中的数据。但是,更早之前,这些数据库中的每个数据库过去都是借助特定于数据库类型的Python模块与Python应用程序连接的。

因此,它们之间缺乏兼容性。如果用户想要更改为其他数据库产品,那将是困难的。通过提出“ Python增强建议(PEP 248)”以建议与关系数据库(称为DB-API)的一致接口来解决此不兼容问题。最新建议称为DB-API版本2.0。 (PEP 249)

Python的标准库由sqlite3模块组成,该模块是DB-API兼容模块,用于通过Python程序处理SQLite数据库。本章介绍Python与SQLite数据库的连接。

如前所述, Python以sqlite3模块的形式内置了对SQLite数据库的支持。对于其他数据库,必须在pip实用程序的帮助下安装相应的DB-API兼容的Python模块。例如,要使用MySQL数据库,我们需要安装PyMySQL模块。

pip install pymysql

建议在DB-API中执行以下步骤-

  • 使用connect()函数与数据库建立连接并获取连接对象。

  • 调用连接对象的cursor()方法以获取光标对象。

  • 形成由要执行的SQL语句组成的查询字符串。

  • 通过调用execute()方法执行所需的查询。

  • 关闭连接。

import sqlite3
db=sqlite3.connect('test.db')

此处,db是表示test.db的连接对象。请注意,如果该数据库尚不存在,则将创建该数据库。连接对象数据库具有以下方法-

Sr.No. Methods & Description
1

cursor():

Returns a Cursor object which uses this Connection.

2

commit():

Explicitly commits any pending transactions to the database.

3

rollback():

This optional method causes a transaction to be rolled back to the starting point.

4

close():

Closes the connection to the database permanently.

游标充当给定SQL查询的句柄,允许检索结果的一行或多行。使用以下语句从连接获取游标对象以执行SQL查询-

cur=db.cursor()

游标对象定义了以下方法-

Sr.No Methods & Description
1

execute()

Executes the SQL query in a string parameter.

2

executemany()

Executes the SQL query using a set of parameters in the list of tuples.

3

fetchone()

Fetches the next row from the query result set.

4

fetchall()

Fetches all remaining rows from the query result set.

5

callproc()

Calls a stored procedure.

6

close()

Closes the cursor object.

以下代码在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()方法撤消事务。

以下代码在test.db中的学生表上执行INSERT查询。

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查询的values子句中的数据,请按照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查询语法。要将name =’Anil’的’age’值更新为23,请定义以下字符串:

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()

同样,通过使用具有SQL的DELETE查询语法的字符串调用execute()方法来执行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查询。当将包含SELECT查询语法的字符串提供给execute()方法时,将返回结果集对象。游标对象有两种重要的方法,使用它们可以从结果集中检索一个或多个记录。

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特定的数据类型。同样,通过安装pyodbc模块,任何与ODBC兼容的数据库都可以与Python一起使用。