Python标准库88. 数据库 (sqlite3) 实践

注意:后续技术分享,第一时间更新,以及更多更及时的技术资讯和学习技术资料将在公众号CTO Plus发布,请关注公众号:CTO Plus

Python标准库系列将分享90个日常常用的内置模块,从介绍、特性和作用、使用方法以及应用场景来介绍标准库的使用,代码示例在最新的Python3.11版本上运行,其他低版本Python可能存在差异。

标准库-内置库(Standard Library):内置库是指Python自带的标准库,包含了大量常用的模块和函数,例如`os`、`sys`、`re`、`math`、`random`等。这些模块和函数可以直接import进来使用,无需下载或安装。

第三方库(Third-party Library):第三方库是指由第三方开发者编写的Python库。这些库可以通过pip或conda等包管理工具进行下载和安装,例如`numpy`、`pandas`、`matplotlib`、`django`等。即需要pip install安装后才能使用的都是第三方库。

在前面的文章《Python基础之开发必备-标准库(内置模块)汇总详细介绍》中介绍过Python有上百个标准库(内置模块),本篇的sqlite3即是常用的模块之一。其他更多的Python3标准库实践资料请关注公众号:CTO Plus查看。

查看标准库清单:https://mp.weixin.qq.com/s/E4HD4_aPWx0Ok3s-Uf28NQ

简介

Python标准库已经自带了一个轻量级的关系型数据库sqlite3模块,无需额外安装任何东西。sqlite作为后端数据库,结合SQL可以搭配Python建Web,或者制作有数据存储需求的工具,如Web框架Django默认的后端数据库使用的就是sqlite。

Python3标准库中的sqlite3是一个用于操作SQLite数据库的模块,它提供了一系列方便的方法和函数,用于在Python程序中创建、访问、修改SQLite数据库。SQLite是一个轻量级、嵌入式的数据库,它的使用非常广泛,特别是在移动开发和嵌入式系统中。sqlite3模块是Python程序员操作SQLite数据库的常用工具之一。

特点和作用

1. 提供了一系列简洁易用的API,使得建立、操作和查询SQLite数据库变得更加容易。

2. 支持使用Python中的数据结构进行数据操作和查询。

3. 可以通过Python创建、读取和修改SQLite数据库。

4. 可以通过Python进行数据的增删改查等操作。

5. 可以在Python中使用SQL语言操作数据库相关操作。

常用的方法和代码示例

1. 连接数据库

import sqlite3

# 连接数据库

conn = sqlite3.connect('example.db')

2. 创建表格

from inner_module_def_datastruct import AUTHOR
import sqlite3

# 连接数据库
conn = sqlite3.connect(AUTHOR)

# 获取游标
c = conn.cursor()

# 创建表格
c.execute('''CREATE TABLE IF NOT EXISTS users
             (id INTEGER PRIMARY KEY AUTOINCREMENT,
              name TEXT NOT NULL,
              age INTEGER,
              address TEXT);''')

# 提交更改
conn.commit()

# 关闭连接
conn.close()

则会在当前目录下生成一个名为SteveRocket的数据库文件,并创建了users表,如下图所示

3. 插入数据

from inner_module_def_datastruct import AUTHOR, AGE, WEIXIN_URL
import sqlite3

# 连接数据库
conn = sqlite3.connect(AUTHOR)

# 获取游标
c = conn.cursor()

# 插入数据
c.execute(f"INSERT INTO users (name, age, address) VALUES ('{AUTHOR}', '{AGE}', '{WEIXIN_URL}')")

# 提交更改
conn.commit()

# 关闭连接
conn.close()

查看表内容:

4. 查询数据

from inner_module_def_datastruct import AUTHOR, AGE, WEIXIN_URL
import sqlite3

# 连接数据库
conn = sqlite3.connect(AUTHOR)

# 获取游标
c = conn.cursor()

# 查询数据
c.execute("SELECT * FROM users")
result = c.fetchall()
print(result)

# 提交更改
conn.commit()

# 关闭连接
conn.close()

查询输出结果:
[(1, 'SteveRocket', 25, 'https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q'), (2, 'SteveRocket', 25, 'https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q')]

5. 更新数据

from inner_module_def_datastruct import AUTHOR, AGE, WEIXIN_URL, CSDN_URL
import sqlite3

# 连接数据库
conn = sqlite3.connect(AUTHOR)

# 获取游标
c = conn.cursor()

# 查询数据
c.execute("SELECT * FROM users")
result = c.fetchall()
print(result)

# 更新数据
c.execute("UPDATE users SET age=?,name=?,address=? WHERE id=2", (22, 'Cramer', CSDN_URL))

# 提交更改
conn.commit()

# 关闭连接
conn.close()

输出结果:
[(1, 'SteveRocket', 25, 'https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q'), (2, 'Cramer', 22, 'https://blog.csdn.net/zhouruifu2015/')]

上面示例将id为2的记录修改了name、age、address。

6. 删除数据

import sqlite3

# 连接数据库

conn = sqlite3.connect('example.db')

# 获取游标

c = conn.cursor()

# 删除数据

c.execute("DELETE FROM users WHERE name=?", ('SteveRocket',))

# 查询数据

c.execute("SELECT * FROM users")

result = c.fetchall()

print(result)

# 提交更改

conn.commit()

# 关闭连接

conn.close()

输出结果:

[(2, 'Cramer', 22, 'https://blog.csdn.net/zhouruifu2015/')]

案例:外键(foreign key)的使用

我们在上面的代码示例中创建了一个简单的关系型数据库,现在在此基础之上以一个书店的书和价格为例。数据库中包含两个表:category用于记录书籍的分类,book用于记录某本书的信息。一本书归属于某一个分类,因此book有一个外键(foreign key),指向catogory表的主键id。

创建数据库表

在使用connect()连接数据库后,我就可以通过定位指针cursor,来执行SQL命令:

from inner_module_def_datastruct import AUTHOR, AGE, WEIXIN_URL, CSDN_URL
import sqlite3
# 连接数据库
conn = sqlite3.connect(AUTHOR)

# 获取游标
c = conn.cursor()

c.execute('''CREATE TABLE IF NOT EXISTS category
      (id int primary key, sort int, name text)''')
c.execute('''CREATE TABLE IF NOT EXISTS book
      (id int primary key, 
       sort int, 
       name text, 
       price real, 
       category int,
       FOREIGN KEY (category) REFERENCES category(id))''')

conn.commit()
conn.close()

SQLite的数据库是一个磁盘上的文件,如上面的SteveRocket,因此整个数据库可以方便的移动或复制。SteveRocket一开始不存在,所以SQLite将自动创建一个新文件。上面的建表代码,利用execute()命令,执行了两个SQL命令,创建数据库中的两个表。创建完成后,保存并断开数据库连接。

 

插入数据

class BooKManager:
    def __init__(self):
        # 连接数据库
        self.conn = sqlite3.connect(AUTHOR)

        # 获取游标
        self.c = self.conn.cursor()

    def insert_data(self):
        self.c.execute("INSERT INTO category VALUES (1, 1, 'fpga')")
        self.c.execute("INSERT INTO category VALUES (?, ?, ?)", (2, 2, 'python'))

        books = [(1, 1, '基于FPGA的数字图像处理原理及应用', 53.12, 1),
                 (2, 3, 'Python技术手册(第2版)', 47.5, 2),
                 (3, 2, 'Python设计模式第2版', 63.6, 2),
                 ]

        self.c.executemany('INSERT INTO book VALUES (?, ?, ?, ?, ?)', books)

        self.conn.commit()
        self.conn.close()

if __name__ == '__main__':
    bm = BooKManager()
    bm.insert_data()

本示例定义了一个类BooKManager,以及类方法insert_data,在初始化类时连接了数据库,在方法insert_data里面进行了插入数据,同样可以使用execute()来执行完整的SQL语句。SQL语句中的参数,使用"?"作为替代符号,并在后面的参数中给出具体值。这里不能用Python的格式化字符串,如"%s",因为这一用法容易受到SQL注入攻击。

也可以用executemany()的方法来执行多次插入,增加多个记录。每个记录是表中的一个元素,如上面的books表中的元素。

查看表中的数据,如下:

查询

在执行查询语句后,Python将返回一个循环器,包含有查询获得的多个记录。循环读取,也可以使用sqlite3提供的fetchone()和fetchall()方法读取记录:

class BooKManager:
    def __init__(self):
        # 连接数据库
        self.conn = sqlite3.connect(AUTHOR)

        # 获取游标
        self.c = self.conn.cursor()

    def select_data(self):
        self.c.execute('SELECT sort,name,price FROM book ORDER BY sort')
        print(self.c.fetchone())  # 返回第一条数据:(1, '基于FPGA的数字图像处理原理及应用', 53.12)
        print(self.c.fetchone())  # 返回第二条数据:(2, 'Python设计模式第2版', 63.6)

        print(self.c.fetchall())  # 返回所有数据:[(1, '基于FPGA的数字图像处理原理及应用', 53.12), (2, 'Python设计模式第2版', 63.6), (3, 'Python技术手册(第2版)', 47.5)]

        print(self.c.fetchmany(2))  # 返回指定条数数据:[(1, '基于FPGA的数字图像处理原理及应用', 53.12), (2, 'Python设计模式第2版', 63.6)]


        self.c.execute('SELECT * FROM book WHERE book.category=2')
        print(self.c.fetchall())

        for row in self.c.execute('SELECT name, price FROM book ORDER BY sort'):
            print(row)

if __name__ == '__main__':
    bm = BooKManager()
    bm.select_data()

更新与删除

可以更新某个记录,或者删除记录:

class BooKManager:
    def __init__(self):
        # 连接数据库
        self.conn = sqlite3.connect(AUTHOR)

        # 获取游标
        self.c = self.conn.cursor()

    def update_delete_data(self):
        # 更新id为1的书籍价格为88.88
        self.c.execute('UPDATE book SET price=? WHERE id=?', (88.88, 1))
        # 删除id为2的书籍数据
        self.c.execute('DELETE FROM book WHERE id=2')

        self.conn.commit()
        self.conn.close()

        # self.c.execute('DROP TABLE book')  # 直接删除整张表

执行update_delete_data方法后表的数据变成如下

如果删除SteveRocket.db,那么整个数据库都会被删除。

应用场景

1. 客户端数据库存储:使用Python中的sqlite3模块开发客户端数据库存储,存储客户信息、订单信息等。

2. Web应用程序:使用Python中的sqlite3模块作为Web应用程序的持久化数据存储层,存储网站用户数据、日志等信息。

3. 移动应用程序:在移动应用程序中,SQLite作为本地数据库使用非常广泛,可以通过Python中的sqlite3模块快速创建和操作数据库。

总之,sqlite3模块是Python中最常用的数据库模块之一。通过sqlite3模块,Python程序员可以方便地处理SQLite数据库,进行增删改查等常见操作。无论是开发Web应用程序,还是移动应用程序,sqlite3模块都是不可或缺的。sqlite3只是一个SQLite的接口。想要熟练的使用SQLite数据库,还需要学习更多的关系型数据库的知识。

完整的Python3.11标准库代码示例,请关注公众号CTO Plus,在后台回复:py标准库

Python专栏
https://blog.csdn.net/zhouruifu2015/category_5742543


更多资料 · 微信公众号搜索【CTO Plus】关注后,获取更多,我们一起学习交流。

关于公众号的描述访问如下链接


更多精彩,关注我公号,一起学习、成长

关于Articulate“做一个知识和技术的搬运工。做一个终身学习的爱好者。做一个有深度和广度的技术圈。”一直以来都想把专业领域的技https://mp.weixin.qq.com/s?__biz=MzIyMzQ5MTY4OQ==&mid=2247484278&idx=1&sn=2b774f789b4c7a2ccf10e465a1b9def6&chksm=e81c2070df6ba966026fd7851efa824b5e2704e3fd34e76228ca4ce64d93f7964cd4abe60f2b#rd

标准库系列-推荐阅读:


推荐阅读:

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SteveRocket

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值