让Python更加充分的使用Sqlite3
时间:2025-11-05 16:03:55 出处:IT科技类资讯阅读(143)
我最近在涉及大量数据处理的加充项目中频繁使用 sqlite3。我最初的使用尝试根本不涉及任何数据库,所有的加充数据都将保存在内存中,包括字典查找、使用迭代和条件等查询。加充这很好,使用但可以放入内存的加充只有那么多,并且将数据从磁盘重新生成或加载到内存是使用一个繁琐又耗时的过程。
我决定试一试sqlite3。加充 因为只需打开与数据库的使用连接, 这样可以增加可处理的加充数据量,并将应用程序的使用加载时间减少到零。此外,加充我可以通过 SQL 查询替换很多Python逻辑语句。使用

我想分享一些关于这次经历的加充心得和发现。
TL;DR
使用大量操作 (又名 executemany)。 你不需要使用光标 (大部分时间)。 光标可被迭代。 使用上下文管理器。 使用编译指示 (当它有意义)。 推迟索引创建。 使用占位符来插入 python 值。1. 使用大量操作
如果你需要在数据库中一次性插入很多行,那么你真不应该使用 execute。亿华云计算sqlite3 模块提供了批量插入的方式:executemany。
而不是像这样做:
for row in iter_data(): connection.execute(INSERT INTO my_table VALUES (?), row)你可以利用这个事实,即 executemany 接受元组的生成器作为参数:
connection.executemany( INSERT INTO my_table VALUE (?), iter_data() )这不仅更简洁,而且更高效。实际上,sqlite3 在幕后利用 executemany 实现 execute,但后者插入一行而不是多行。
我写了一个小的基准测试,将一百万行插入空表(数据库在内存中):
executemany: 1.6 秒 execute: 2.7 秒2. 你不需要游标
一开始我经常搞混的事情就是,光标管理。在线示例和文档中通常如下:
connection = sqlite3.connect(:memory:) cursor = connection.cursor() # Do something with cursor但大多数情况下,你根本不需要光标,你可以直接使用连接对象。
像 execute
executemany类似的操作可以直接在连接上调用。以下是一个证明此事的示例:
import sqlite3 connection = sqlite3(:memory:) # Create a table connection.execute(CREATE TABLE events(ts, msg)) # Insert values connection.executemany( INSERT INTO events VALUES (?,?), [ (1, foo), (2, bar), (3, baz) ] ) # Print inserted rows for row in connnection.execute(SELECT * FROM events): print(row)3. 光标(Cursor)可被用于迭代
你可能经常会看到使用fetchone或fetchall来处理 SELECT 查询结果的示例。但是我发现处理这些结果的最自然的方式是直接在光标上迭代:
for row in connection.execute(SELECT * FROM events): print(row)这样一来,只要你得到足够的结果,云服务器你就可以终止查询,并且不会引起资源浪费。当然,如果事先知道你需要多少结果,可以改用 LIMIT SQL语句,但Python生成器是非常方便的,可以让你将数据生成与数据消耗分离。
4. 使用Context Managers(上下文管理器)
即使在处理SQL事务的中间,也会发生讨厌的事情。为了避免手动处理回滚或提交,你可以简单地使用连接对象作为上下文管理器。 在以下示例中,我们创建了一个表,并错误地插入了重复的值:
import sqlite3 connection = sqlite3.connect(:memory:) with connection: connection.execute( CREATE TABLE events(ts, msg, PRIMARY KEY(ts, msg))) try: with connection: connection.executemany(INSERT INTO events VALUES (?, ?), [ (1, foo), (2, bar), (3, baz), (1, foo), ]) except (sqlite3.OperationalError, sqlite3.IntegrityError) as e: print(Could not complete operation:, e) # No row was inserted because transaction failed for row in connection.execute(SELECT * FROM events): print(row) connection.close()5. 使用Pragmas
…当它真的有用时
在你的程序中有几个 pragma 可用于调整 sqlite3 的行为。特别地,其中一个可以改善性能的是 synchronous :
connection.execute(PRAGMA synchronous = OFF)你应该知道这可能是危险的。如果应用程序在事务中间意外崩溃,数据库可能会处于不一致的状态。所以请小心使用! 但是如果你要更快地插入很多行,亿华云那么这可能是一个选择。
6. 推迟索引创建
假设你需要在数据库上创建几个索引,而你需要在插入很多行的同时创建索引。把索引的创建推迟到所有行的插入之后可以导致实质性的性能改善。
7. 使用占位符插入 Python 值
使用 Python 字符串操作将值包含到查询中是很方便的。但是这样做非常不安全,而 sqlite3 给你提供了更好的方法来做到这一点:
# Do not do this! my_timestamp = 1 c.execute("SELECT * FROM events WHERE ts = %s" % my_timestamp) # Do this instead my_timestamp = (1,) c.execute(SELECT * FROM events WHERE ts = ?, my_timestamp)此外,使用Python%s(或格式或格式的字符串常量)的字符串插值对于 executemany 来说并不是总是可行。所以在此尝试没有什么真正意义!
请记住,这些小技巧可能会(也可能不会)给你带来好处,具体取决于特定的用例。你应该永远自己去尝试,决定是否值得这么做。
猜你喜欢
- Sublime Text编辑器复制代码代码如下:卸载 sublime text 命令:复制代码代码如下:复制代码代码如下:卸载 atom 命令:复制代码代码如下:sudo apt-get remove atom
- 尼康16-85全画幅镜头综合评测(高性价比的全画幅镜头推荐)
- Sitecore优势与使用指南(掌握Sitecore,提升网站管理和个性化体验能力)
- 小米5sPlus(性能强劲,拍照出色,高性价比成为人气之选)
- ubuntu安装了wine qq怎么去卸载呢?下面我们分别来演示如何卸载它们1、安装wine按ctrl+alter+T打开终端输入以下两条命令sudo apt-get updatesodo apt-get install wine安装时间有点长,请耐心的等候2、按钮选择期间有个软件包的配置图像界面,需要用户使用tab键选定ok然后下一个条出另一个框,这里移动左右键盘,选择YES。按下enter键进行安装、、、、、3、安装wine-qq下载wine-qq的网址:http://www.longene.org/download/sudo dpkg -i WineQQ2013-xxx(你下载的QQ web包)4、卸载wine-qqsudo dpkg --purge wine-qq2012-longeneteam
- 探究以iPodNano声卡的音质表现(了解iPodNano声卡的特点与性能)
- 以奇工家具怎么样(一探以奇工家具的独特魅力)
- 极客杂志(探索科技前沿,领略创新潮流,极客杂志带你进入未来世界的大门)
- 安装命令: 功能说明:检查、设定系统的各种服务。 语法:chkconfig [--add][--del][--list][系统服务]或 补充说明:这个是redhat公司遵循gpl规则所开发的程序,它可以查询操作系统在每一个执行等级(runlevel)中,会执行哪些系统服务,其中包括各种daemon。 linux os 将操作环境分为以下7个等级: 0:开机(请不要切换到此等级) 参数: --add 新增所指定的系统服务 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。 语法: chkconfig --list [name] chkconfig 没有参数运行时,显示用法。假如加上服务名,那么就检查这个服务是否在当前运行级启动。假如是,返回true,否则返回false。假如在服务名后面指定 了on,off或者reset,那么chkconfi 会改变指定服务的启动信息。On和off分别指服务被启动和停止,reset指重置服务的启动信息,无论有问题的初始化脚本指定了什么。On和off开 关,系统默认只对运行级3,4,5有效,但是reset可以对所有运行级有效。 --level选项可以指定要查看的运行级而不一定是当前运行级。 需要说明的是,对于每个运行级,只能有一个启动脚本或者停止脚本。当切换运行级时,init不会重新启动已经启动的服务,也不会再次去停止已经停止的服务。 chkconfig --list :显示所有运行级系统服务的运行状态信息(on或off)。假如指定了name,那么只显示指定的服务在不同运行级的状态。 chkconfig --add name:增加一项新的服务。Chkconfig确保每个运行级有一项启动(S)或者杀死(K)入口。如有缺少,则会从缺省的init脚本自动建立。 chkconfig --del name:删除服务,并把相关符号连接从/etc/rc[0-6].d删除。 chkconfig [--level levels] name :设置某一服务在指定的运行级是被启动,停止还是重置。例如,要在3,4,5运行级停止nfs服务,则命令如下: chkconfig --level 345 nfs off 运行级文件: 每个被chkconfig管理的服务需要在对应的init.d下的脚本加上两行或者更多行的注释。第一行告诉chkconfig缺省启动的运行级以及启动 和停止的优先级。假如某服务缺省不在任何运行级启动,那么使用 - 代替运行级。第二行对服务进行描述,可以用/ 跨行注释。 附加介绍一下Linux系统的运行级的概念: 范例: 1.查看在各种不同的执行等级中,各项服务的状况: 2.列出系统服务vsftpd在各个执行等级的启动情况: 3.在执行等级3,5时,关闭vsftpd系统服务: 4.在执行等级2,3,5时,开启 vsftpd系统服务: 5.关闭一些自己不需要的服务 ->假如没有打印机: chkconfig --level 235 cups off 假如没有局域网: chkconfig --level 235 smb off 假如不需要远程用户登录的: chkconfig --level 235 sshd off 假如不需要定时任务的: chkconfig --level 235 crond off 假如不需要添加新硬件的: chkconfig --level 235 kudzu off