Python SQLite3 教程

在本教程中,我们将使用 Python 以编程方式处理 SQLite3 数据库。

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

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

我们将使用 SQLite 版本 3 或 SQLite3,所以让我们开始吧。

 

创建连接

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

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

import sqlite3

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

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

Python SQLite3 教程

 

SQLite3 游标

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

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

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

cursorObj = con.cursor()

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

 

创建数据库

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

考虑下面的代码,其中我们使用tryexceptfinally块创建了一个数据库来处理任何异常:

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块,它在任何异常的情况下都会打印错误消息。如果没有错误,将建立连接并显示如下消息。

连接到 SQLite3 数据库

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

创建表

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

  1. 创建连接对象。
  2. 从连接对象创建一个游标对象。
  3. 使用游标对象,以创建表查询为参数调用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语句。

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

要检查我们的表是否已创建,您可以使用SQLite数据库浏览器来查看您的表。使用该程序打开 mydatabase.db 文件,您应该会看到您的表:

表已创建

 

插入表格

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

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

con.commit()

要检查数据是否已插入,请单击 DB Browser 中的 Browse Data:

插入行

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

cursorObj.execute('''INSERT INTO employees(id,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,?)',entities)
    
    con.commit()

entities = (2,'2018-02-06')

sql_insert(con,entities)

SQL 插入结果

 

更新表

要更新表,只需创建一个连接,然后使用该连接创建一个游标对象,最后在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,如下所示:

更新数据

选择语句

您可以使用 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()方法。我们将在下一节中演示这一点。

 

获取所有数据

要从数据库中获取数据,我们将执行 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 和姓名。为此,让我们用更多行填充我们的表,然后执行我们的查询。

填充表

您可以使用插入语句来填充数据,也可以在 DB 浏览器程序中手动输入它们。

现在,要获取工资大于 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)

在上面的 SELECT 语句中,我们没有使用星号 (*),而是指定了 id 和 name 属性。结果将如下所示:

选择 where 子句

 

SQLite3 行数

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

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

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

SQLite3 行数

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

rows = cursorObj.fetchall()

print len (rows)

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

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

删除后影响 Rowc 计数

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

未删除任何行

列出表格

要列出 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)

这将列出所有表,如下所示:

列出表格

 

检查表是否存在

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

为了检查表是否已经存在,我们在 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())

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

表存在

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

表不存在

 

删除表

您可以使用 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)

删除语句

SQLite3 异常

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

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

数据库错误

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

完整性错误

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

编程错误

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

操作错误

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

不支持错误

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

 

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()方法。

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

上面的代码将生成以下结果:

批量插入(多次执行)

 

关闭连接

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

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

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

#program statements

con.close()

 

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,date date)')

data = [(1,"Ridesharing",datetime.date(2017,1,2)),"Water Purifying",datetime.date(2018,3,4))]

cursorObj.executemany("INSERT INTO assignments VALUES(?,data)

con.commit()

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

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

上面的代码将生成以下输出:

SQLite3 日期时间

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

您可以在 Windows、Linux、Mac OS、Android 和 iOS 项目中使用 SQLite3 数据库,因为它们具有出色的可移植性。因此,您随项目一起发送一个文件,仅此而已。

原文地址:https://blog.csdn.net/allway2

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


SQLite架构简单,又有Json计算能力,有时会承担Json文件/RESTful的计算功能,但SQLite不能直接解析Json文件/RESTful,需要用Java代码硬写,或借助第三方类库,最后再拼成insert语句插入数据表,代码非常繁琐,这里就不展示了。参考前面的代码可知,入库的过程比较麻烦,不能只用SQL,还要借助Java或命令行。SPL是现代的数据计算语言,属于简化的面向对象的语言风格,有对象的概念,可以用点号访问属性并进行多步骤计算,但没有继承重载这些内容,不算彻底的面向对象语言。...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。本教程将告诉您如何使用 SQLite 编程,并让你迅速上手。.................................
安卓开发,利用SQLite实现登陆注册功能
相比大多数数据库而言,具有等优势,广泛应用于、等领域。
有时候,一个项目只有一个数据库,比如只有SQLite,或者MySQL数据库,那么我们只需要使用一个固定的数据库即可。但是一个项目如果写好了,有多个用户使用,但是多个用户使用不同的数据库,这个时候,我们就需要把软件设计成可以连接多个数据库的模式,用什么数据库,就配置什么数据库即可。4.Users实体类,这个实体类要和数据库一样的,形成一一对应的关系。11.Sqlite数据库,需要在代码里面创建数据库,建立表,再建立数据。8.我们开启MySQL数据库,然后进行调试,看程序的结果。2.安装SqlSugar。
基于Android的背单词软件,功能强大完整。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。说白了就是使用起来轻便简单,
Android的简单购物车案例
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库...
Qt设计较为美观好看的登录注册界面(包含SQLite数据库以及TCP通信的应用)
SQLite是用C语言开发的跨平台小型数据库,可嵌入其他开发语言,也可在单机执行。SPL是用Java开发的跨平台的数据计算语言,可嵌入Java,可在单机执行,可以数据计算服务的形式被远程调用。两者的代码都是解释执行的。...
新建库.openDATA_BASE;新建表createtableLIST_NAME(DATA);语法:NAME关键字...<用逗号分割>删除表droptableNAME;查看表.schema查看表信息新建数据insertintoLIST_NAMEvalues();语法:CLASS,PARAMETER...,CLASS是类别,PARAMETER是参数<用逗号分割新建的
importsqlite3classDemo01:def__init__(self):self.conn=sqlite3.connect("sql_demo_001.db")self.cursor1=self.conn.cursor()self.cursor1.execute("select*fromtable_001wherename=?andid=?",('ssss&#0
 在客户端配置文件<configuration>节点下,添加:<connectionStrings>      <add name="localdb" connectionString="Data Source=config/local.db;Version=3;UseUTF16Encoding=True;" providerName="System.Data.SQLite.SQLiteFactory"/&g
提到锁就不得不说到死锁的问题,而SQLite也可能出现死锁。下面举个例子:连接1:BEGIN(UNLOCKED)连接1:SELECT...(SHARED)连接1:INSERT...(RESERVED)连接2:BEGIN(UNLOCKED)连接2:SELECT...(SHARED)连接1:COMMIT(PENDING,尝试获取EXCLUSIVE锁,但还有SHARED锁未释放,返回SQLITE_BUSY)连接2:INSERT...
SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。在使用SQLite前,我们先要搞清楚几个概念:表
设计思想————首先要确定有几个页面、和每个页面的大致布局由于是入门,我也是学习了不是很长的时间,所以项目比较low。。。。第一个页面,也就是打开APP的首页面:今天这个博客,先实现添加功能!:首先对主界面进行布局:其中activity_main.xml的代码为<?xmlversion="1.0"encoding="