本文将深入探讨SQLite数据库及其与Python的结合使用。我们将学习如何通过Python的sqlite3
库操作SQLite数据库,并最终探索sqlite3
提供的一些高级特性来简化我们的工作。
注意:在开始之前,最好熟悉SQL。如果您不熟悉,可以参考Simply SQL学习。
sqlite3
模块为SQLite提供了SQL接口,并且随Python预安装。它允许用户创建数据库、连接到数据库、创建表、插入数据和执行SQL命令。该模块还支持占位符,允许在SQL命令中进行参数替换,从而更轻松地将变量插入查询中。sqlite3
模块在执行INSERT、UPDATE、DELETE或REPLACE语句之前启动事务。用户必须调用commit()
方法来保存事务期间所做的更改,并且可以通过在连接到数据库时将isolation_level
设置为None
来显式地处理事务。SQLite的座右铭是:“小巧、快速、可靠。三选其二。”
SQLite是一个用C语言编写的嵌入式数据库库。您可能熟悉其他数据库技术,例如MySQL或PostgreSQL。这些技术使用客户端-服务器方法:数据库作为服务器安装,然后使用客户端连接到它。SQLite则不同:它被称为嵌入式数据库,因为它作为库包含在程序中。所有数据都存储在一个文件中——通常扩展名为.db——并且您可以使用函数来运行SQL语句或对数据库执行任何其他操作。
基于文件的存储解决方案还提供并发访问,这意味着多个进程或线程可以访问同一个数据库。那么,SQLite的用途是什么?它适用于任何类型的应用程序吗?
SQLite在以下几种情况下表现出色:
另一方面,有哪些不选择SQLite的原因呢?
正如我在引言中提到的,SQLite是一个C库。但是,有很多语言都编写了接口,包括Python。sqlite3
模块提供了一个SQL接口,并且至少需要SQLite 3.7.15。
令人惊奇的是,sqlite3
随Python一起提供,因此您无需安装任何内容。
是时候编写代码了!在第一部分中,我们将创建一个基本的数据库。首先要做的是创建一个数据库并连接到它:
<code class="language-python">import sqlite3 dbName = 'database.db' try: conn = sqlite3.connect(dbName) cursor = conn.cursor() print("Database created!") except Exception as e: print("Something bad happened: ", e) if conn: conn.close()</code>
在第1行,我们导入sqlite3
库。然后,在一个try/except
代码块中,我们调用sqlite3.connect()
来初始化与数据库的连接。如果一切顺利,conn
将是Connection
对象的实例。如果try
失败,我们将打印收到的异常,并关闭与数据库的连接。正如官方文档中所述,每个打开的SQLite数据库都由一个Connection
对象表示。每次我们必须执行SQL命令时,Connection
对象都有一个名为cursor()
的方法。在数据库技术中,游标是一种控制结构,它允许遍历数据库中的记录。
现在,如果我们执行这段代码,我们应该得到以下输出:
<code>> Database created!</code>
如果我们查看Python脚本所在的文件夹,应该会看到一个名为database.db
的新文件。此文件是由sqlite3
自动创建的。
此时,我们准备创建一个新表,添加第一个条目并执行SQL命令,如SELECT、UPDATE或DROP。
要创建表,我们只需要执行一个简单的SQL语句。在这个例子中,我们将创建一个students
表,其中包含以下数据:
id | name | surname |
---|---|---|
1 | John | Smith |
2 | Lucy | Jacobs |
3 | Stephan | Taylor |
在print("Database created!")
行之后,添加以下内容:
<code class="language-python">import sqlite3 dbName = 'database.db' try: conn = sqlite3.connect(dbName) cursor = conn.cursor() print("Database created!") except Exception as e: print("Something bad happened: ", e) if conn: conn.close()</code>
我们创建了一个表并调用cursor.execute()
方法,当我们想要执行单个SQL语句时使用此方法。
然后,我们为要添加的每一行执行一个INSERT操作。完成所有更改后,我们调用conn.commit()
将挂起的事务提交到数据库。如果不调用commit()
方法,对数据库的任何挂起更改都将丢失。最后,我们通过调用conn.close()
方法关闭与数据库的连接。
好的,现在让我们查询我们的数据库!我们需要一个变量来保存查询的结果,所以让我们将cursor.execute()
的结果保存到名为records
的变量中:
<code>> Database created!</code>
执行此操作后,我们将看到所有记录输出到标准输出:
<code class="language-python"># 创建操作 create_query = '''CREATE TABLE IF NOT EXISTS student( id INTEGER PRIMARY KEY, name TEXT NOT NULL, surname TEXT NOT NULL); ''' cursor.execute(create_query) print("Table created!") # 插入和读取操作 cursor.execute("INSERT INTO student VALUES (1, 'John', 'Smith')") print("Insert #1 done!") cursor.execute("INSERT INTO student VALUES (2, 'Lucy', 'Jacobs')") print("Insert #2 done!") cursor.execute("INSERT INTO student VALUES (3, 'Stephan', 'Taylor')") print("Insert #3 done!") conn.commit() conn.close()</code>
此时,您可能已经注意到,在cursor.execute()
方法中,我们放置了必须执行的SQL命令。如果我们想要执行另一个SQL命令(如UPDATE或DROP),Python语法不会发生任何变化。
cursor.execute()
方法需要一个字符串作为参数。在上一节中,我们看到了如何将数据插入到我们的数据库中,但是所有内容都是硬编码的。如果我们需要将变量中的内容存储到数据库中怎么办?为此,sqlite3
有一些称为占位符的巧妙功能。占位符允许我们使用参数替换,这将使将变量插入查询变得更容易。
让我们看看这个例子:
<code class="language-python">records = cursor.execute("SELECT * FROM student") for row in records: print(row)</code>
我们创建了一个名为insert_command()
的方法。此方法接受四个参数:第一个参数是一个Connection
实例,另外三个将在我们的SQL命令中使用。
command
变量中的每个?
都代表一个占位符。这意味着,如果您使用student_id=1
、name='Jason'
和surname='Green'
调用insert_command
函数,则INSERT语句将变为INSERT INTO student VALUES(1, 'Jason', 'Green')
。
当我们调用execute()
函数时,我们传递我们的命令和所有将被替换为占位符的变量。从现在开始,每次我们需要在student
表中插入一行时,我们都将使用所需的参数调用insert_command()
方法。
即使您不是事务定义的新手,我也会快速回顾一下它的重要性。事务是在数据库上执行的一系列操作,在逻辑上被视为一个单元。
事务最重要的优点是确保数据完整性。在我们上面介绍的示例中,它可能没有用,但是当我们处理存储在多个表中的更多数据时,事务确实会产生影响。
Python的sqlite3
模块在execute()
和executemany()
执行INSERT、UPDATE、DELETE或REPLACE语句之前启动事务。这意味着两件事:
commit()
方法。如果我们在不执行commit()
的情况下调用Connection.close()
,我们在事务期间所做的所有更改都将丢失。解决方案?显式处理事务。
如何?通过使用函数调用sqlite3.connect(dbName, isolation_level=None)
而不是sqlite3.connect(dbName)
。通过将isolation_level
设置为None
,我们强制sqlite3
永远不会隐式打开事务。
以下代码是对先前代码的重写,但显式使用了事务:
<code class="language-python">import sqlite3 dbName = 'database.db' try: conn = sqlite3.connect(dbName) cursor = conn.cursor() print("Database created!") except Exception as e: print("Something bad happened: ", e) if conn: conn.close()</code>
我希望您现在已经很好地理解了什么是SQLite,如何将其用于您的Python项目,以及其一些高级功能的工作方式。显式管理事务起初可能有点棘手,但它肯定可以帮助您充分利用sqlite3
。
相关阅读:
什么是SQLite,为什么我要将它与Python一起使用?SQLite是一个轻量级的、基于文件的关联式数据库管理系统。由于其简单性和最少的配置,它被广泛用于嵌入式数据库应用程序。将SQLite与Python一起使用提供了一种方便的方法,可以将数据库集成到Python应用程序中,而无需单独的数据库服务器。
如何在Python中连接到SQLite数据库?您可以使用sqlite3
模块(随Python预安装)连接到SQLite数据库。使用connect()
方法建立连接并获取连接对象,然后创建一个游标来执行SQL命令。
如何使用Python在SQLite数据库中创建表?您可以使用游标对象上的execute()
方法运行SQL命令。要创建表,请使用CREATE TABLE
语句。
如何使用Python将数据插入SQLite表中?使用INSERT INTO
语句将数据插入表中。占位符%s
或?
可用于参数化查询,以避免SQL注入。
如何在Python中使用SQLite事务?SQLite中的事务使用连接对象上的commit()
和rollback()
方法进行管理。将多个SQL命令放在begin
和commit
之间,以确保它们被视为单个事务处理。
以上是python的sqlite介绍的详细内容。更多信息请关注PHP中文网其他相关文章!