Python基础之SQLite数据库

news2024/12/24 21:16:58

Python与SQLite数据库

一、概述

对于非常简单的应用而言,使用文件作为持久化存储通常就足够了,但是大多数复杂的数据驱动的应用则需要全功能的关系数据库。 SQLite 的目标则是介于两者之间的中小系统。它量级轻、速度快,没有服务器,很少或不需要进行管理。虽然简单,但是由于各种原因这个库很有吸引力。首先,它不需要独立的数据库服务器,也不要求任何特定的配置,只要与数据库文件连接,就可以在程序中立即开始使用(如果它不存在,会生成一个新文件)。这个数据库也支持用于改进可靠性的事务处理(甚至在系统崩溃期间也可以),还支持lock,允许多个进程同时访问同一个数据库文件。

SQLite 正在迅速流行起来,并且它还适用于不同的平台。 Python 2.5 中引入了 SQLite 数据库适配器作为 sqlite3 模块,这是 Python 首次将数据库适配器纳入到标准库当中。

SQLite 被打包在 Python 中,并不是因为它比其他数据库和适配器更加流行,而是因为它足够简单,像 DBM 模块一样使用文件(或内存)作为其后端存储,不需要服务器,也没有许可证问题。它是 Python 中其他类似的持久化存储解决方案的一个替代品,不过除此之外,它还拥有 SQL 接口。

在标准库中拥有该模块,可以使你在 Python 中使用 SQLite 开发更加快速,并且使你在有需要时,能够更加容易地移植到更加强大的 RDBMS(比如, MySQL、 PostgreSQL、Oracle 或 SQL Server)中。如果你并不需要那些强大的数据库,那么 sqlite3 已经是一个很好的选择了。

尽管标准库中已经提供了该数据库适配器,但是你还需要自己下载这个数据库本身。当安装数据库后,就可以启动 Python(并导入适配器模块)来直接进行访问了:

20221201170245

二、模块级函数

下列函数由sqlite3模块定义:

  • connect(database [, timeout [, isolation_level [, detect_types]]])
    创建到SQLite数据库的连接。database是指定数据库文件名称的字符串。也可以是一个字符串":memory:", 此时使用内存中的数据库(注意这种数据库仅在python进程运行时存在,并在程序退出的时候丢失)。timeout参数指明,当其他连接在更新数据库时,等待内部的读写锁(reader-writer lock)释放的时间。默认情况下,timeout是5秒钟。但是INSERT或UPDATE等SQL语句时,如果一个事务没有生效,则自动开始一个新的事务。isolation_level参数是一个字符串,为用于开始这一事务底层SQL BEGIN语句提供可选修饰符,其含义与底层数据库锁相关。

    20221201171732

    当返回结果时,detect_types参数可实现某些额外类型的检测(通过对SQL查询的额外解析实现),默认值是0(意味着没有额外检测)。可以将其设置为按位,或者PARSE_DECLTYPES和PARSE_COLNAMES。如果PARSE_DECLTYPES启用,审核查询SQL类型名称(如"integer"或"number(8)")以便确定结果列的类型。 如果PARSE_COLNAMES启用,"colname[typename]"形式的特定字符串(包括双引号)可以嵌入查询,colname是列名称,typename是通过register_converter()函数注册的类型名称。这些字符串在传递到SQLite3引擎时仅转换成colname,但是当转换查询结果中的值时,将使用额外类型的说明符。例如,

    select price as "price [decimal]" from portfolio 
    

    会被解释为:

    select price as price from portfolio
    

    其结果将根据decimal转换规则进行转换。

  • register_converter(typename, func)
    注册新的类型名称,共connect()的detect_types选项使用。typename是将在查询中使用的包含类型名的字符串,func是一个函数,它接受单一的字节字符串作为输入,结果返回一个python数据类型。

    例如,如果调用sqlite3.register_converter(‘decimal’, decimal.Decimal), 那么可以通过写入查询(如 select price as “price [decimal]” from stocks)将查询中的值转换成Decimal对象。

  • register_adapter(type, func)
    为python类型type(用于在数据类型中存储该类型的值)注册一个适配器函数。func是一个函数,接受type类型的实例作为输入,结果返回一个int、float、utf-8编码的字节串、unicode字符串或者buffer。例如,如果要存储decimal对象,可以使用sqlite3.register_adapter(decimal.Decimal, float)

  • complete_statement(s)
    如果字符串s代表由分号分隔的一个或一个以上的完整SQL语句,则返回true。这也许会在编写读取来自用户的查询的交互式程序时用到。

  • enable_callback_tracebacks(flag)
    处理在转换器和适配器等用户定义回调函数中出现的异常。默认情况下,忽略异常。如果flag设置为true,回溯消息将输出到sys.stderr。

三、连接对象

由connect()函数返回的Connection对象c支持在数据库API描述的标准操作。此外,针对sqlite3模块提供下列方法。

  • c.create_function(name, num_params, func)
    创建能够炸sql语句中使用的用户定义函数。name是包含函数名称的字符串,num_params是指明参数数量的整数,func是提供实现的python函数,这里有一个简单的例子:

    def toupper(s):
      return s.upper()
    
    c.create_function("toupper", 1, toupper)
    
    查询使用样例:
    c.execute("select toupper(name), foo, bar from sometable")
    

    虽然定义了一个python函数,但是函数的参数和函数的输入只能是int、float、str、unicode buffer或none

  • c.create_aggregate(name, num_params, aggregate_class)
    创建可在sql语句中使用的用户定义聚合函数。name是包含函数名称的字符串,num_params是一个整数,说明输入的参数数量。aggregate_class是执行聚合操作的类。这个类必须支持不带参数的初始化,执行接受与num_params指明的参数数量相同的step(params)方法,并执行finalize()方法返回最后结果。这里有一个简单例子:

    class Averager():
      def __init__(self):
        self.total = 0.0
        self.count = 0
    
      def step(self, value):
        self.total += value
        self.count += 1
    
      def finalize(self):
        return self.total / self.count
    
    c.create_aggregate("myavg", 1, Averager)
    
    c.execute("select myavg(num) from sometable")
    

    通过重复调用带输入值的step()方法进行聚合,然后调用finalize()获得最终值。

  • c.create_collation(name, func)
    注册可在SQL语句中使用的用户定义校验函数。name是包含校验函数名称的字符串,func是一个函数,它接受两个输入,并根据第一个输入是小于、等于还是大于第二个输入来返回-1, 0或者1。你可以通过sql表达式(例如, “select * from table order by colname collate name”)来使用这个用户定义函数。

  • c.execute(sql [, params])
    使用c.cursor()创建游标对象,并通过params参数和sql中的sql语句执行游标execute()方法的快捷方法。

  • c.executemany(sql, [, params])
    使用c.cursor()创建游标对象,并通过params参数和sql中的sql语句执行游标的executemany()方法的快捷方法。

  • c.executescript(sql)
    使用c.cursor()创建游标对象,并通过sql中的sql语句执行游标的executescript()方法。

  • c.interrupt()
    终止正在连接上执行的查询。也就说从一个单独的线程调用。

  • c.iterdump()
    返回一个迭代器,以便将整个数据库的内容转储到一系列sql语句中,执行这些语句能够重建数据库。这可以用于任何需要导出数据库、或者需要将内存数据库转储到一个文件以便稍后进行恢复的情况。

  • c.set_authorizer(auth_callback)
    注册一个授权回调函数。它在每次访问数据中的一列数据时执行。这个回调函数必须接受5个参数,即auth_callback(code, arg1, arg2, dbname, innername)。如果允许访问,这个回调函数返回的值是SQLITE_OK, 如果SQL语句由于出错而失败,返回值是SQLITE_DENY, 如果列被处理成NULL值而忽略,返回值是SQLITE_IGNORE。第一个参数code是整数操作代码。arg1和arg2是参数,它们的值取决于code。dbname是包含数据库名的字符串(通常是"main"), innername是正在尝试访问的最内部视图或触发器的名称,如果没有视图或触发器处于激活时为None。下面的表格列出了code的值和arg1与arg2参数的含义:
    20221201225636

    20221201225659

  • c.set_progress_handler(handler, n)
    注册回调函数,每n条sqlite虚拟机指令执行一次。handler是一个没有参数的函数。

下列属性也在连接对象上定义:

  • c.row_factory
    调用这个函数来创建代表每个结果行的对象。这个函数接受两个参数,用来获得结果的游标对象和带有原始结果行的元组

  • c.text_factory
    调用这个函数来创建代表数据库中文本值的对象。这个函数只能接受utf-8编码的字节字符串参数。返回值应该是某种类型的字符串。默认情况下返回unicode字符串

  • c.total_changes
    一个整数,代表自数据库连接打开后发生更改的行数。

连接对象的最后一个功能是,它们可以与上下文管理器协议一起使用,以便自动处理事务。例如:

conn = sqlite.connect('somedb')
with conn:
  conn.execute('insert into sometable values (?, ?)', ('foo', 'bar'))

这个例子中,commit()是在所有with数据块中的语句执行完毕并且没有错误之后自动执行的,如果出现任何异常,将执行rollback()操作,再次提示异常。

四、游标和基本操作

为了在sqlite3数据库上执行基本操作,首先必须使用cursor()方法在一个连接上创建游标对象。然后使用该游标的execute(), executemany()或者executescript()方法执行sql语句。有关这些方法的常用操作,此处不再赘述。这一部分主要是展示一组常用的数据库用例和编码样例。

  • 创建新的数据库表
    下面的代码显示如何打开一个数据库并创建一个新的表:

    import sqlite3
    conn = sqlite3.connect("mydb")
    cur = conn.cursor()
    cur.execute("create table stocks (symbol text, shares integer, price real)")
    conn.commit()
    

    当定义表的时候,应使用一些原始的sqlite数据类型:text、integer、real和blob。blob类型是一个字节字符串,而text类型是utf-8编码的unicode

  • 向表中插入新的值
    下列代码示意了如何向表中插入新的项

    import sqlite3
    conn = sqlite3.connect("mydb")
    cur = conn.cursor()
    cur.execute("insert into stocks values (?, ?, ?)", ('IBM', 50, 91.10))
    conn.commit()
    

    当插入值时,应当一直像上面那样使用?替代。每个?用参数元组中的值一个值代替。
    如果需要按顺序插入数据,可以像这样使用游标的executemany()方法:

    stocks = [
      ('aaa', 12, 1.1),
      ('bbb', 23, 2.2),
      ('ccc', 34, 3.3)]
    cur.executemany("insert into stocks values (?, ?, ?)", stocks)
    
  • 更新现有行
    下面的代码示意了如何为现有行更新列值:

    cur.execute("update stocks set shares=? where symbol=?", (50, 'IBM'))
    
  • 删除行

    cur.execute("delete from stocks where symbol=?", ('MICROSOFT', ))
    
  • 执行基本查询
    下面的代码显示如何执行基本查询并获得结果:

    # 选择表中所有的列
    for row in cur.execute("select * from stocks"):
      statementes
    
    # 选择若干列
    for shares, price in cur.execute("select shares, price from stocks"):
      statements
    
    # 选择匹配行
    for row in cur.execute("select * from stocks order by shares"):
      statements
    
    # 逆向选择匹配行
    for row in cur.execute("select * from stocks order by shares desc")
      statements
    
    # 以通用列名(符号)联接表
    for row in cur.execute('''select s.symbol, s.shares, p.price 
                              from stocks as s, prices as p using(symbol)''')
      statements
    

小手一抖,点个赞再走哦~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/53687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学辅导微信小程序设计与实现的源码+文档

摘 要 网络的广泛应用给生活带来了十分的便利。所以把数学辅导管理与现在网络相结合,利用java技术建设数学辅导微信小程序,实现数学辅导的信息化。则对于进一步提高数学辅导管理发展,丰富数学辅导管理经验能起到不少的促进作用。 数学辅导微…

【python】 int、float、double与16进制字符串的互相转换

import structdef intToHex(num): # int转16进制return hex(num)[2:].upper()def hexToInt(hexString): # 16进制转intreturn int(hexString, 16)def floatToHex(floatValue): # float转16进制return struct.pack(>f, floatValue).hex().upper()def hexToFloat(hexString…

chloris.earth ——Chloris 全球生物量 2003 - 2019 数据平台

概述 Chloris 全球生物量 2003 - 2019 数据集提供了地球陆地木本植被生态系统地上生物量存量和变化的估计值。它涵盖 2003 年至 2019 年期间,按年度时间步长计算。全球数据集的空间分辨率约为 4.6 公里。 这些地图和数据集是通过结合来自星载卫星的多个遥感测量结果…

如何保证PCB孔铜高可靠?

PCB板上电路导通,都是靠线路或过孔来传导的,从PCB制造流程可以看出,PCB完成铜厚是由PCB基铜厚度加板电厚度加图电厚度三部分组成,PCB孔铜厚度,是在两个电镀流程中完成,即全板电镀孔铜的厚度加图形电镀孔铜厚…

k8s概念

文章目录k8s概念为什么叫他k8s以及谁开发的k8s是什么k8s特点时光回溯传统部署时代:虚拟化部署时代容器部署时代:容器的优点为什么需要k8s,他能做什么?Kubernetes 不是什么?k8s概念 为什么叫他k8s以及谁开发的 kubern…

EO.Web浏览器 v2023.0.18.0 for .NET -- EO.WebBrowser

.NET PDF 和 Web 浏览器从未如此简单 使用 PDF 文件生成/处理能力快速扩展您的 .NET 应用程序,或者将流行的 Chromium 浏览器引擎与广泛的自定义选项(如自定义资源加载器和 JavaScript 扩展)无缝集成用于 UI 或后台任务。 当前:v2…

steam搬砖项目,小白也能月入过万的副业项目

steam搬砖这个项目,我们做了3年了,项目很稳定。由于项目是轻资产,门槛低,按照我们的方法,只要你足够勤快,这是一个能帮你赚取人生的第一桶金的项目。 仅代表个人收益 steam项目原理就是:倒卖cs…

移动端异构运算技术 - GPU OpenCL 编程(基础篇)

一、前言 随着移动端芯片性能的不断提升,在移动端上实时进行计算机图形学、深度学习模型推理等计算密集型任务不再是一个奢望。在移动端设备上,GPU 凭借其优秀的浮点运算性能,以及良好的 API 兼容性,成为移动端异构计算中非常重要…

小巧有劲的按摩好手,能装兜里的护理工具,小鸟斗士筋膜枪体验

现在很多朋友为了身体健康,平时都会去做些简单的健身,因为之前长期不运动,所以健身后很容易有肌肉酸痛等问题,对此,筋膜枪是个很好用的工具,可以有效促进血液循环,还能够缓解久坐所导致的腰背酸…

java面试强基(16)

说说 List, Set, Queue, Map 四者的区别? List(对付顺序的好帮手): 存储的元素是有序的、可重复的。Set(注重独一无二的性质): 存储的元素是无序的、不可重复的。Queue(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是有序的、可…

壳寡糖/肉桂醛修饰乳清蛋白,乳清浓缩蛋白-羟丙基甲基纤维素复合材料

产品名称:壳寡糖修饰乳清蛋白 英文名称:Chitosan-whey protein 用途:科研 状态:固体/粉末/溶液 产品规格:1g/5g/10g 保存:冷藏 储藏条件:-20℃ 储存时间:1年 壳寡糖,又叫…

【图文详解】入职必备——SVN使用教程

一、SVN基本操作 1、进入svnbucket官网,创建一个空项目,学习svn 2、创建好测试项目后,复制对应地址 3、右键点击“SVN 检出” 4、粘贴“版本库URL”,填写“检出至目录”,最后点击“确定” 5、完善“用户名”和“密码”…

3.9、以太网交换机自学习和转发帧的流程

3.9、以太网交换机自学习和转发帧的流程 1.以太网交换机工作在数据链路层(也包括物理层) 说明:目前市场上也有包含网络层部分功能的交换机,称为三层交换机 2.以太网交换机收到帧后,在帧交换表中查找的目的MAC地址所…

cilantro 点云均值漂移算法(MeanShift)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 均值漂移算法是一种非常经典的层次聚类方式,已在二维图像中得到了广泛的应用。这里我们也已二维图像为例来阐述其整个计算过程: 算法基本思想:如下图所示,左侧为实际的图像特征的分布,右侧为基于图像特征分布计…

马斯克让猴子学会意念打字!还用人脑模型演示背后原理,电线入脑清晰可见...

杨净 Pine 发自 凹非寺量子位 | 公众号 QbitAI一鸽再鸽,马斯克Neuralink终于官宣新进展。果然不出所料,与此前大家预想的意念打字相关。不过get这项技能的不是人类,而是他们的老朋友——猴子。根据黄色提示“指哪打哪”:我可以吃点…

第 04 章_逻辑架构

第 04 章_逻辑架构1. 逻辑架构剖析1. 1 服务器处理客户端请求1.2 Connectors1.3 第 1 层:连接层1.4 第 2 层:服务层1. 5 第 3 层:引擎层1. 6 存储层1. 7 小结2. SQL执行流程2. 1 MySQL 中的 SQL执行流程3. 优化器 :4. 执行器 &…

Vue3 —— 怎样利用vite创建一个vue3项目

前言 本文主要讲解如何利用vitevue创建第一个项目以及vue3的基础知识点 一、创建一个vue3项目 这里我们主要介绍如何利用 vitevue3创建项目 1.有关vite Vite(法语意为 "快速的",发音 /vit/,发音同 "veet")是…

【目标检测】Faster R-CNN论文代码复现过程解读(含源代码)

目录:Faster R-CNN论文代码复现过程解读Faster R-CNN代码使用说明书(分享在github上)一、代码的地址二、我的配置环境三、参数值文件下载四、VOC数据集下载五、模型训练步骤(1)训练VOC0712数据集1.数据集的准备2.数据集…

做电商太难了。。

阅读本文大概需要 1.86 分钟。上周跟在杭州做电商的朋友交流了一下,发现他们太难了。前些天不还有说现在全国 65% 的快递网点都停摆了,这对电商影响非常大,最直接的就是物流快递的问题,一堆快递堆在那里发不出去。虽然直播间卖得算…

win11 右键关闭显示更多选项 修改右键菜单

建议直接使用方法三 win11右键显示更多选项怎么关闭? Win11右键显示更多选项怎么关闭?本文将为您介绍4个简单有效的解决方法,您可以根据自身实际情况来挑选一个更加适合自己的方案! 方法一:更改文件资源管理器选项恢…