创建表

要在 SQLite3 中创建表,我们可以在 execute() 方法中使用创建表查询。
考虑以下步骤:

  • 创建连接对象。
  • 从连接对象创建一个游标对象。
  • 使用游标对象,以创建表查询为参数调用execute方法。

让我们创建具有以下属性的员工:

employees (id, name, salary, department, position, hireDate)

代码将是这样的:

import sqlite3
from sqlite3 import Error
def sql_connection():
    try:
        con = sqlite3.connect('mydatabase.db')
        return con
    except Error:
        print(Error)
def sql_table(con):
    cursorObj = con.cursor()
    cursorObj.execute("CREATE TABLE employees(id integer PRIMARY KEY, name text, salary real, department text, position text, hireDate text)")
    con.commit()
con = sql_connection()
sql_table(con)

在上面的代码中,我们定义了两个方法,第一个方法建立连接,第二个方法创建一个游标对象来执行create table语句。

commit() 方法保存我们所做的所有更改。
最后,这两种方法都被调用。

要检查我们的表是否已创建,我们可以使用 SQLite 的数据库浏览器来查看表。

用程序打开 mydatabase.db 文件,你应该会看到你的表:

插入数据表

要在表中插入数据,我们使用 INSERT INTO 语句。
考虑以下代码行:

cursorObj.execute("INSERT INTO employees VALUES(1, 'John', 700, 'HR', 'Manager', '2017-01-04')")
con.commit()

我们还可以将值/参数传递给 execute() 方法中的 INSERT 语句。
我们可以使用问号 (?) 作为每个值的占位符。
INSERT 的语法如下所示:

cursorObj.execute('''INSERT INTO employees(id, name, salary, department, position, hireDate) VALUES(?, ?, ?, ?, ?, ?)''', entities)

其中实体包含占位符的值如下:

entities = (2, 'Andrew', 800, 'IT', 'Tech', '2018-02-06')

整个代码如下:

import sqlite3
con = sqlite3.connect('mydatabase.db')
def sql_insert(con, entities):
    cursorObj = con.cursor()

    cursorObj.execute('INSERT INTO employees(id, name, salary, department, position, hireDate) VALUES(?, ?, ?, ?, ?, ?)', entities)

    con.commit()
entities = (2, 'Andrew', 800, 'IT', 'Tech', '2018-02-06')
sql_insert(con, entities)

选择语句

我们可以使用 select 语句从特定表中选择数据。
如果要从表中选择数据的所有列,可以使用星号 (*)。
其语法如下:

select * from table_name

在SQLite3中,SELECT语句是在游标对象的execute方法中执行的。
比如选择employees表的所有列,运行如下代码:

cursorObj.execute('SELECT * FROM employees ')

如果要从表中选择几列,请指定如下所示的列:

select column1, column2 from tables_name

例如,

cursorObj.execute('SELECT id, name FROM employees')

select语句从数据库表中选择需要的数据,如果要获取选中的数据,则使用游标对象的fetchall()方法。
我们将在下一节中演示这一点。

SQLite3 游标

要在 Python 中执行 SQLite 语句,我们需要一个游标对象。
我们可以使用 cursor() 方法创建它。

SQLite3 游标是连接对象的一种方法。
要执行 SQLite3 语句,首先要建立连接,然后使用连接对象创建游标对象,如下所示:

con = sqlite3.connect('mydatabase.db')
cursorObj = con.cursor()

现在我们可以使用游标对象调用 execute() 方法来执行任何 SQL 查询。

获取所有数据

要从数据库中获取数据,我们将执行 SELECT 语句,然后使用游标对象的 fetchall() 方法将值存储到变量中。
之后,我们将遍历变量并打印所有值。

代码将是这样的:

import sqlite3
con = sqlite3.connect('mydatabase.db')
def sql_fetch(con):
    cursorObj = con.cursor()
    cursorObj.execute('SELECT * FROM employees')
    rows = cursorObj.fetchall()
    for row in rows:
        print(row)
sql_fetch(con)

我们还可以在一行中使用 fetchall() ,如下所示:

[print(row) for row in cursorObj.fetchall()]

如果要从数据库中获取特定数据,可以使用 WHERE 子句。
例如,我们想要获取工资大于 800 的员工的 id 和姓名。
为此,让我们用更多行填充我们的表,然后执行我们的查询。

现在,要获取工资大于 800 的人的 id 和姓名:

import sqlite3
con = sqlite3.connect('mydatabase.db')
def sql_fetch(con):
    cursorObj = con.cursor()
    cursorObj.execute('SELECT id, name FROM employees WHERE salary > 800.0')
    rows = cursorObj.fetchall()
    for row in rows:
        print(row)
sql_fetch(con)
Python SQLite3 教程(数据库编程)

SQLite 通常是一种无服务器数据库,我们可以在包括 Python 在内的几乎所有编程语言中使用它。
无服务器意味着无需安装单独的服务器来使用 SQLite,因此我们可以直接与数据库连接。

SQLite 是一个轻量级数据库,它可以提供零配置的关系数据库管理系统,因为无需配置或者设置任何东西即可使用它。

删除表

我们可以使用 DROP 语句删除/删除表。
DROP 语句的语法如下:

drop table table_name

要删除表,该表应存在于数据库中。
因此,建议在 drop 语句中使用“if exists”,如下所示:

drop table if exists table_name

例如,

import sqlite3
con = sqlite3.connect('mydatabase.db')
def sql_fetch(con):
    cursorObj = con.cursor()
    cursorObj.execute('DROP table if exists employees')
    con.commit()
sql_fetch(con)

关闭连接

使用完数据库后,最好关闭连接。
我们可以使用 close() 方法关闭连接。

要关闭连接,请使用连接对象并调用 close() 方法,如下所示:

con = sqlite3.connect('mydatabase.db')
#program statements
con.close()

SQLite3 异常

异常是运行时错误。
在 Python 编程中,所有异常都是从 BaseException 派生的类的实例。

在 SQLite3 中,我们有以下主要的 Python 异常:

数据库错误

与数据库相关的任何错误都会引发 DatabaseError。

完整性错误

IntegrityError 是 DatabaseError 的子类,在出现数据完整性问题时会引发。
例如,所有表中的外部数据都没有更新,导致数据不一致。

编程错误

当存在语法错误或者未找到表或者使用错误数量的参数/参数调用函数时,将引发异常 ProgrammingError。

操作错误

当数据库操作失败时会引发此异常,例如异常断开连接。
这不是程序员的错。

不支持错误

当我们使用某些数据库未定义或者不支持的方法时,将引发 NotSupportedError 异常。

SQLite3 行数

SQLite3 rowcount 用于返回最近执行的 SQL 查询影响或者选择的行数。

当我们在 SELECT 语句中使用 rowcount 时,将返回 -1,因为在全部提取之前,选择了多少行是未知的。
考虑下面的例子:

print(cursorObj.execute('SELECT * FROM employees').rowcount)

因此,要获取行数,需要获取所有数据,然后获取结果的长度:

rows = cursorObj.fetchall()
print len (rows)

当我们使用不带任何条件(where 子句)的 DELETE 语句时,将删除表中的所有行,并返回行计数中已删除行的总数。

print(cursorObj.execute('DELETE FROM employees').rowcount)

如果没有行被删除,它将返回零。

SQLite3 日期时间

在 Python SQLite3 数据库中,我们可以通过导入 datatime 模块轻松存储日期或者时间。
以下格式是可用于日期时间的最常见格式:

YYYY-MM-DD
YYYY-MM-DD HH:MM
YYYY-MM-DD HH:MM:SS
YYYY-MM-DD HH:MM:SS.SSS
HH:MM
HH:MM:SS
HH:MM:SS.SSS
now

考虑以下代码:

import sqlite3
import datetime
con = sqlite3.connect('mydatabase.db')
cursorObj = con.cursor()
cursorObj.execute('create table if not exists assignments(id integer, name text, date date)')
data = [(1, "Ridesharing", datetime.date(2017, 1, 2)), (2, "Water Purifying", datetime.date(2018, 3, 4))]
cursorObj.executemany("INSERT INTO assignments VALUES(?, ?, ?)", data)
con.commit()

在这段代码中,我们首先导入了 datetime 模块,并创建了一个名为 assignments 的表,其中包含三列。

第三列的数据类型是日期。
为了在列中插入日期,我们使用了 datetime.date。
同样,我们可以使用 datetime.time 来处理时间。

SQLite3 数据库的巨大灵活性和移动性使其成为任何开发人员使用它并将其与任何产品一起发布的首选。

创建连接

要在 Python 中使用 SQLite3,首先,我们必须导入 sqlite3 模块,然后创建一个连接对象,它将我们连接到数据库并让我们执行 SQL 语句。

我们可以使用 connect() 函数创建连接对象:

import sqlite3
con = sqlite3.connect('mydatabase.db')

这将创建一个名为“mydatabase.db”的新文件。

更新表

要更新表,只需创建一个连接,然后使用该连接创建一个游标对象,最后在 execute() 方法中使用 UPDATE 语句。

假设我们要更新 id 等于 2 的员工的姓名。
为了更新,我们将使用 UPDATE 语句和 id 等于 2 的员工。
我们将使用 WHERE 子句作为选择该员工的条件。

考虑以下代码:

import sqlite3
con = sqlite3.connect('mydatabase.db')
def sql_update(con):
    cursorObj = con.cursor()
    cursorObj.execute('UPDATE employees SET name = "Rogers" where id = 2')
    con.commit()
sql_update(con)

这会将名称从 Andrew 更改为 Rogers,如下所示:

创建数据库

当我们创建与 SQLite 的连接时,如果它不存在,它将自动创建一个数据库文件。
这个数据库文件是在磁盘上创建的;我们还可以使用 :memory: 和 connect 函数在 内存 中创建数据库。
该数据库称为内存数据库。

考虑下面的代码,我们其中创建了一个带有 try、except 和 finally 块来处理任何异常的数据库:

import sqlite3
from sqlite3 import Error
def sql_connection():
    try:
        con = sqlite3.connect(':memory:')
        print("Connection is established: Database is created in memory")
    except Error:
        print(Error)
    finally:
        con.close()
sql_connection()

首先,我们导入 sqlite3 模块,然后我们定义一个函数 sql_connection。
在这个函数内部,我们有一个 try 块,connect() 函数在建立连接后返回一个连接对象。

然后我们有 except 块,它在任何异常的情况下都会打印错误消息。
如果没有错误,将建立连接并显示如下消息。

之后,我们在 finally 块中关闭了我们的连接。
关闭连接是可选的,但这是一种很好的编程习惯,因此我们可以从任何未使用的资源中释放内存。

检查表是否存在

创建表时,我们应该确保该表不存在。
同样,删除/删除表时,该表应该存在。

为了检查表是否已经存在,我们在 CREATE TABLE 语句中使用“if not exists”,如下所示:

create table if not exists table_name (column1, column2, …, columnN)

例如:

import sqlite3
con = sqlite3.connect('mydatabase.db')
def sql_fetch(con):
    cursorObj = con.cursor()
    cursorObj.execute('create table if not exists projects(id integer, name text)')
    con.commit()
sql_fetch(con)

同样,为了在删除时检查表是否存在,我们在 DROP TABLE 语句中使用“if exists”,如下所示:

drop table if exists table_name

例如,

cursorObj.execute('drop table if exists projects')

我们还可以通过执行以下查询来检查我们要访问的表是否存在:

cursorObj.execute('SELECT name from sqlite_master WHERE type = "table" AND name = "employees"')
print(cursorObj.fetchall())

如果员工表存在,它将返回其名称。

如果我们指定的表名不存在,将返回一个空数组。

SQLite3 Executemany(批量插入)

我们可以使用 executemany 语句一次插入多行。

考虑以下代码:

import sqlite3
con = sqlite3.connect('mydatabase.db')
cursorObj = con.cursor()
cursorObj.execute('create table if not exists projects(id integer, name text)')
data = [(1, "Ridesharing"), (2, "Water Purifying"), (3, "Forensics"), (4, "Botany")]
cursorObj.executemany("INSERT INTO projects VALUES(?, ?)", data)
con.commit()

这里我们创建了一个有两列的表,“data”每列有四个值。
我们将变量与查询一起传递给 executemany() 方法。

请注意,我们使用了占位符来传递值。

列出表格

要列出 SQLite3 数据库中的所有表,我们应该查询 sqlite_master 表,然后使用 fetchall() 从 SELECT 语句中获取结果。

sqlite_master 是 SQLite3 中的主表,存储所有表。

import sqlite3
con = sqlite3.connect('mydatabase.db')
def sql_fetch(con):
    cursorObj = con.cursor()
    cursorObj.execute('SELECT name from sqlite_master where type= "table"')
    print(cursorObj.fetchall())
sql_fetch(con)
日期:2020-07-15 11:16:26 来源:oir作者:oir