当前位置: 首页 > article >正文

Python实战(3)-数据库操作

前面说过,可用的SQL数据库引擎有很多,它们都有相应的Python模块。这些数据库引擎大都作为服务器程序运行,连安装都需要有管理员权限。为降低Python DB API的使用门槛,我选择了一个名为SQLite的小型数据库引擎。它不需要作为独立的服务器运行,且可直接使用本地文件,而不需要集中式数据库存储机制。在较新的Python版本(从2.5开始)中,SQLite更具优势,因为标准库包含一个SQLite包装器:使用模块sqlite3实现的PySQLite。除非从源代码编译Python,否则Python很可能包含这个数据库。

如果你使用的是较旧的Python版本,必须安装PySQLite才能使用SQLite数据库,可从https://github.com/ghaering/pysqlite下载。在带包管理器系统的Linux系统中,很可能可直接从包管理器获取PySQLite和SQLite。你也可使用Python自己的包管理器pip。另外,你还可获取PySQLite和SQLite的源代码包,再自己编译它们。如果你使用的是较新的Python版本,几乎可以肯定已经有PySQLite。如果有什么缺失了,那就是数据库本身,即SQLite(但这也很可能已经有了)​。在这种情况下,可从SQLite官网(http://sqlite.org)获取源代码(务必获取执行了自动代码生成的源代码包)​。要编译SQLite,只需按README文件中的说明做即可。接着编译PySQLite时,必须确保编译进程能够访问SQLite库和include文件。如果SQLite被安装在标准位置,PySQLite发布版中的安装脚本很可能能够找到它。在这种情况下,只需执行如下命令即可:

python setup.py build
python setup.py install

你也可以只执行第二个命令,因为它将自动执行构建过程。如果这样做时出现了大量的错误消息,很可能是因为安装脚本没有找到所需的文件。请确保你知道include文件和库安装在什么地方,并显式地将这个位置提供给安装脚本。假设我在目录/home/mlh/sqlite/current中就地编译了SQLite,那么头文件可能位于/home/mlh/sqlite/current/src,而库位于/home/mlh/sqlite/current/build/lib。为了让安装进程使用这些路径,可编辑安装脚本setup.py,在其中像下面这样设置变量include_dirs和library_dirs。

            include_dirs = ['/home/mlh/sqlite/current/src']library_dirs = ['/home/mlh/sqlite/current/build/lib']

起步

要使用Python标准库中的SQLite,可通过导入模块sqlite3来导入它。然后,就可创建直接到数据库文件的连接。为此,只需提供一个文件名(可以是文件的相对路径或绝对路径)​;如果指定的文件不存在,将自动创建它。

import sqlite3
conn = sqlite3.connect('somedatabase.db')

我的源码目录原来没有somedatabase.db文件,执行后结果如下:

在这里插入图片描述

接下来可从连接获得游标。

        curs = conn.cursor()

这个游标可用来执行SQL查询。执行完查询后,如果修改了数据,务必提交所做的修改,这样才会将其保存到文件中。

          >>> conn.commit()

你可以(也应该)在每次修改数据库后都进行提交,而不是仅在要关闭连接前才这样做。要关闭连接,只需调用方法close。

          >>> conn.close()

数据库应用程序示例

作为示例,我将演示如何创建一个小型的营养成分数据库,这个数据库基于美国农业部(USDA)农业研究服务(https://www.ars.usda.gov)提供的数据。美国农业部的链接常常会有细微的变化,但只要按下面介绍的做,就应该能够找到相关的数据集。在网页https://www.ars.usda.gov中,单击下拉列表Research中的链接Databases and Datasets进入相应的页面,再单击其中的链接Nutrient Data Laboratory。在打开的页面中,应该能够找到链接USDA National Nutrient Database for Standard Reference。在单击这个链接打开的页面中有大量的数据文件,它们使用的是我们需要的纯文本(ASCII)格式。单击链接Download,并下载标题Abbreviated下链接ASCII指向的zip文件。你将获得一个zip文件,其中包含一个名为ABBREV.txt的文本文件,还有一个描述该文件内容的PDF文件。如果你找不到这个文件,也可使用其他的旧数据,只是需要相应地修改源代码。

在文件ABBREV.txt中,每行都是一条数据记录,字段之间用脱字符(^)分隔。数字字段直接包含数字,而文本字段用两个波浪字符(~)将其字符串值括起。下面是一个示例行(为简洁起见删除了部分内容)​:

07276^~HORMEL SPAM ... PORK W/ HAM MINCED CND~^ ... ^1 serving~^^~~^0

要将这样的行分解成字段,只需使用line.split(‘^’)即可。如果一个字段以波浪字符打头,你就知道它是一个字符串,因此可使用field.strip(‘~’)来获取其内容。对于其他字段(即数字字段)​,使用float(field)就能获取其内容,但字段为空时不能这样做。本节接下来将开发一个程序,将这个ASCII文件中的数据转换为SQL数据库,并让你能够执行一些有趣的查询。

创建并填充数据库表

要创建并填充数据库表,最简单的解决方案是单独编写一个一次性程序。这样只需运行这个程序一次,就可将它及原始数据源(文件ABBREV.txt)抛在脑后了,不过保留它们可能是个不错的主意。代码清单13-1所示的程序创建一个名为food的表(其中包含一些合适的字段)​;读取文件ABBREV.txt并对其进行分析(使用工具函数convert对各行进行分割并对各个字段进行转换)​;通过调用curs.execute来执行一条SQL INSERT语句,从而将字段中的值插入数据库中。注意:也可使用curs.executemany,并向它提供一个列表(其中包含从数据文件中提取的所有行)​。就这里而言,这样做速度稍有提高,但如果使用的是通过网络连接的客户/服务器SQL系统,速度将有极大的提高。

代码清单13-1 将数据导入数据库(importdata.py)

        import sqlite3def convert(value):if value.startswith('~'):return value.strip('~')if not value:value = '0'return float(value)conn = sqlite3.connect('food.db')curs = conn.cursor()curs.execute('''CREATE TABLE food (id TEXT PRIMARY KEY,desc    TEXT,water   FLOAT,kcal    FLOAT,protein FLOAT,fat      FLOAT,ash      FLOAT,carbs   FLOAT,fiber   FLOAT,sugar   FLOAT)''')query = 'INSERT INTO food VALUES (?,?,?,?,?,?,?,?,?,?)'field_count = 10for line in open('ABBREV.txt'):fields = line.split('^')vals = [convert(f) for f in fields[:field_count]]curs.execute(query, vals)conn.commit()conn.close()

当你运行这个程序时(文件ABBREV.txt和它位于同一个目录)​,它将新建一个名为food.db的文件,其中包含数据库中的所有数据。建议你多多尝试这个程序:使用不同的输入、添加print语句等

搜索并处理结果

数据库使用起来非常简单:创建一条连接并从它获取一个游标;使用方法execute执行SQL查询并使用诸如fetchall等方法提取结果。代码清单13-2是一个微型程序,它通过命令行参数接受一个SQL SELECT条件,并以记录格式将返回的行打印出来。你可在命令行中像下面这样尝试运行它:

        $ python food_query.py "kcal <= 100 AND fiber >= 10 ORDER BY sugar"

运行这个程序时,你可能发现了一个问题:第一行指出,生橘子皮(raw orange peel)好像不含任何糖分。这是因为在数据文件中缺少这个字段。你可对导入脚本进行改进,以检测这种情况,并插入None而不是0来指出缺失数据。这样,你就可使用类似于下面的条件:

        "kcal <= 100 AND fiber >= 10 AND sugar ORDER BY sugar"

这要求仅当sugar字段包含实际数据时才返回相应的行。这种策略恰好也适用于当前的数据库——上述条件将丢弃糖分为0的行。你可能想尝试使用ID搜索特定食品的条件,如使用ID 08323搜索Cocoa Pebbles。问题是SQLite处理其值的方式不那么标准,事实上,它在内部将所有的值都表示为字符串,因此在数据库和Python API之间将执行一些转换和检查。通常,这没有问题,但使用ID搜索可能会遇到麻烦。如果你提供值08323,它将被解读为数字8323,进而被转换为字符串"8323",即一个不存在的ID。在这种情况下,可能应该显示错误消息,而不是采取这种意外且毫无帮助的行为;但如果你很小心,在数据库中就将ID设置为字符串"08323",就不会出现这种问题。

代码清单13-2 食品数据库查询程序(food_query.py)

        import sqlite3, sysconn = sqlite3.connect('food.db')curs = conn.cursor()query = 'SELECT * FROM food WHERE ' + sys.argv[1]print(query)curs.execute(query)names = [f[0] for f in curs.description]for row in curs.fetchall():for pair in zip(names, row):print('{}: {}'.format(*pair))print()

警告这个程序从用户那里获取输入,并将其插入到SQL查询中。在你是用户而且不会输入太不可思议的内容时,这没有问题。然而,利用这种输入偷偷地插入恶意的SQL代码以破坏数据库是一种常见的计算机攻击方式,称为SQL注入攻击。请不要让你的数据库(以及其他任何东西)暴露在原始用户输入的“火力范围”内,除非你对这样做的后果心知肚明

相关文章:

Python实战(3)-数据库操作

前面说过&#xff0c;可用的SQL数据库引擎有很多&#xff0c;它们都有相应的Python模块。这些数据库引擎大都作为服务器程序运行&#xff0c;连安装都需要有管理员权限。为降低Python DB API的使用门槛&#xff0c;我选择了一个名为SQLite的小型数据库引擎。它不需要作为独立的…...

LeetCode 160 Intersection Of Two Linked Lists 相交链表 Java

题目&#xff1a;找到两个相交列表的起始点&#xff0c;如图c1开始为A和B两个链表的相交点 举例1&#xff1a;8为两个链表的相交点。 注意&#xff1a;相交不止是数值上的相同。 举例2&#xff1a;2为相交点 举例3&#xff1a;没有相交点 解题思路&#xff1a; 相交证明最后一…...

AI Agent中的MCP详解

一、协议定义与核心价值 MCP(Model Context Protocol,模型上下文协议)是由Anthropic公司于2024年11月推出的开放标准协议,其核心目标是通过建立统一接口规范,解决AI模型与外部系统集成效率低下的行业痛点。该协议通过标准化通信机制,使大型语言模型(LLM)能够无缝对接数…...

win系统上自动化安装配置WSL linux和各种生信工具教程

windows系统上自动化安装配置WSL linux系统和各种生信工具教程 高通量测序原始数据的上游分析模块介绍 我开发的OmicsTools软件的这些分析测序原始数据的上游处理分析模块需要使用到linux和linux系统中的一些生信工具&#xff0c;在这里我开发了在windows系统中自动化安装WSL …...

统计可重复列表中的TOP N

文章目录 方案1&#xff1a;HashMap统计 全排序实现步骤&#xff1a;代码实现&#xff1a;优缺点&#xff1a; 方案2&#xff1a;HashMap统计 最小堆&#xff08;优先队列&#xff09;实现步骤&#xff1a;代码实现&#xff1a;优缺点&#xff1a; 方案3&#xff1a;Java Str…...

PowerBI纯小白如何驾驭DAX公式一键生成:copilot for fabric

在2025年2月份更新中&#xff0c;powerbi desktop里的copilot功能还新增了一个非常强大的功能&#xff1a;一键生成多个度量值&#xff0c;并直接加载到模型。 直接上示例展示&#xff1a; 打开DAX查询视图&#xff0c;在copilot窗格中直接输入想要生成多个度量值&#xff0c…...

Pytest的夹具

1、pytest的前置后置夹具 fixture 有些内容是在每个用例执行之前都要运行操作:-- 用例前置 接口:购物车模块先登录 --登录结果 【token鉴权】 UI: 每次用例 打开浏览器 --driver 有些内容在每个用例之后都要运行操作:–用例后置 接口: 数据清除 UI:关闭浏览器 叫做用例的…...

两市总的净流出和净流入来分析情况

为了排查数据干扰&#xff0c;只从两市总的净流出和净流入来分析情况。 净流出才对应资金抽离&#xff1a;若净流入为负&#xff08;即净流出&#xff09;&#xff0c;则意味着资金从股市中撤出&#xff0c;例如主动卖出的金额超过主动买入金额。净流入反映市场信心&#xff1…...

GitHub在push推送到远程仓库的时候显示Logon failed登录失败

具体问题描述 git.exe push --progress "origin" master:master Logon failed, use ctrlc to cancel basic credential prompt. remote: Support for password authentication was removed on August 13, 2021. 这是因为Git 推送失败的原因是 GitHub 已经不支持密码认…...

如何在SQL中高效使用聚合函数、日期函数和字符串函数:实用技巧与案例解析

文章目录 聚合函数group by子句的使用实战OJ日期函数字符串函数数学函数其它函数 聚合函数 函数说明COUNT([DISTINCT] expr)返回查询到的数据的 数量SUM([DISTINCT] expr)返回查询到的数据的 总和&#xff0c;不是数字没有意义AVG([DISTINCT] expr)返回查询到的数据的 平均值&…...

AutoGen :使用 Swarm 构建自治型多智能体团队

👉👉👉本人承接各类AI相关应用开发项目(包括但不限于大模型微调、RAG、AI智能体、NLP、机器学习算法、运筹优化算法、数据分析EDA等) !!!👉👉👉 有意愿请私信!!!AutoGen 的 AgentChat 模块提供了一种强大的方法来构建多智能体协作系统。 在之前的文章中,我们探讨了…...

RK3568平台设备树文件功能解析(鸿蒙系统篇)

鸿蒙设备树驱动修改时候发现目录下有很多的rk3568 的设备树,由于对这些设备树功能不太熟悉,所以索性就整理一下不同设备树的功能 rk3568-evb1-ddr4-v10.dts rk3568-evb4-lp3-v10.dts rk3568-evb6-ddr3-v10-rk628-rgb2hdmi.dts …...

k8s-coredns-CrashLoopBackOff 工作不正常

本文作者&#xff1a; slience_me 问题描述 # 问题描述 # rootk8s-node1:/home/slienceme# kubectl get pods --all-namespaces # NAMESPACE NAME READY STATUS RESTARTS AGE # kube-flannel kube-flannel-ds-66bcs …...

【Android性能】Systrace分析

1&#xff0c;分析工具 1&#xff0c;Systrace新UI网站 Perfetto UI 2&#xff0c;Systrace抓取 可通过android sdk中自带的systrace抓取&#xff0c;路径一般如下&#xff0c;..\AppData\Local\Android\Sdk\platform-tools&#xff0c; 另外需要安装python2.7&#xff0c;…...

Unity导出WebGL,无法显示中文

问题&#xff1a;中文无法显示 默认字体无法显示中文 在编辑器中设置了中文和英文的按钮&#xff0c;中文按钮无法显示 导出后无法显示中文 解决办法&#xff1a; 自己添加字体&#xff0c;导入项目&#xff0c;并引用 示例 下载一个字体文件&#xff0c;这里使用的阿里…...

oracle事务的组成

1)数据库事务由以下的部分组成: 一个或多个DML 语句 ; 一个 DDL(Data Definition Language – 数据定义语言) 语句&#xff1b; 一个 DCL(Data Control Language – 数据控制语言)语句&#xff1b; 2)事务的执行开始&#xff1a; 以第一个 DML 语句的执行作为开始 &#xff0c;…...

【如何在OpenWebUI中使用FLUX绘画:基于硅基流动免费API的完整指南】

如何在OpenWebUI中使用FLUX绘画&#xff1a;基于硅基流动免费API的完整指南 注册并获取硅基流动秘钥OpenWebUI中使用函数配置自定义模型-提示词配置效果验证 ) FLUX绘画是一种强大的AI绘图工具&#xff0c;本文将详细介绍如何在OpenWebUI中集成并使用FLUX绘画功能&#xff0c;…...

QT 磁盘文件 教程04-创建目录、删除目录、遍历目录

【1】新建目录 bool CreateDir(QString name){QString fileName name ;QDir dir(fileName);if (dir.isEmpty()) {dir.mkdir(fileName);return true;}else{qDebug()<<"文件夹已存在";return false;} } 【2】删除目录 bool DeleteDir(QString fileName){if (…...

Event driven agentic document workflows 笔记 - 2

代理文档工作流&#xff08;ADW&#xff09;- 课程笔记 Agentic Document Workflows (ADW) 1. 课程目标 介绍 代理文档工作流&#xff08;ADW&#xff09; 背后的核心概念&#xff0c;包括&#xff1a; RAG&#xff08;检索增强生成&#xff09;代理工作流 探讨如何利用 事件…...

Facebook 如何影响元宇宙的发展趋势

Facebook 如何影响元宇宙的发展趋势 引言 元宇宙&#xff08;Metaverse&#xff09;这个概念&#xff0c;曾经只存在于科幻小说中&#xff0c;如今正逐渐成为现实。它是一个由多个 3D 虚拟世界组成的网络&#xff0c;用户可以在其中进行社交、游戏、工作等活动。Facebook&…...

1.5.7 掌握Scala内建控制结构 - 变量作用域

本次实战深入理解了Scala中变量作用域的概念&#xff0c;通过两个任务演示了作用域的基本规则。在任务1中&#xff0c;我们创建了一个名为ScopeDemo01的对象&#xff0c;展示了内部作用域能够访问外部作用域的变量。通过在if语句块中访问在外部定义的message变量&#xff0c;我…...

RAID磁盘阵列管理

一. 什么是RAID RAID是英文Redundant Array of Independent Disks的缩写&#xff0c;中文翻译过来就是“独立冗余磁盘阵列”。简单的说&#xff0c;RAID是一种把多块独立的硬盘&#xff08;物理硬盘&#xff09;按不同的方式组合起来形成一个硬盘组&#xff08;逻辑硬盘&#…...

利用ffmpeg库实现音频AAC编解码

AAC‌&#xff08;Advanced Audio Coding&#xff09;是一种音频编码技术&#xff0c;出现于1997年&#xff0c;基于MPEG-2的音频编码技术。AAC具有高效的数据压缩能力和较高的音质&#xff0c;适用于各种音频应用场景。例如&#xff0c;在智能设备中&#xff0c;AAC技术被广泛…...

微博ip属地不发微博会不会变

随着社交媒体的普及&#xff0c;微博作为其中的佼佼者&#xff0c;一直备受关注。而且微博上线了显示用户IP属地的功能&#xff0c;这一功能旨在减少冒充热点事件当事人、恶意造谣、蹭流量等不良行为&#xff0c;确保传播内容的真实性和透明度。然而&#xff0c;这也引发了一些…...

appium之Toast元素识别

Appium之Toast元素识别教程与实例 一、Toast简介 Toast是Android系统中的轻量级消息提示框&#xff0c;以浮动形式短暂显示&#xff08;通常2-3秒&#xff09;&#xff0c;无法被点击且不会获取焦点。常见于登录失败、操作提示等场景&#xff0c;如“密码错误”或“网络异常”。…...

「JavaScript深入」WebSocket:高效的双向实时通信技术

WebSocket WebSocket 的特点1. 全双工通信2. 持久连接3. 低延迟4. 二进制和文本支持5. 连接管理6. 二进制数据传输 WebSocket 协议详解1. 握手过程2. 数据帧结构 WebSocket 的实现服务器端实现&#xff08;Node.js ws库&#xff09;1. 基础服务器2. 广播功能实现3. 心跳机制客…...

C#从入门到精通(1)

目录 第一章 C#与VS介绍 第二章 第一个C#程序 &#xff08;1&#xff09;C#程序基本组成 1.命名空间 2.类 3.Main方法 4.注释 5.语句 6.标识符及关键字 &#xff08;2&#xff09;程序编写规范 1.代码编写规则 2.程序命名方法 3.元素命名规范 第三章 变量 &…...

配置阿里云yum源

配置阿里云yum源 修改默认的yum仓库&#xff0c;把原有的移动到创建的目录里&#xff08;踢出国外的yum源&#xff09; # 切换到/ect/yum.repos.d/目录下 cd /etc/yum.repos.d/ # 新建repo目录 mkdir repo # 把原有的移动到创建的目录里 mv ./*.repo ./repo/配置yum源 # 找到…...

头歌实训--Pandas合并数据集--第3关:案例:美国各州的统计数据

任务描述 本关为练习关卡&#xff0c;请按照编程要求完成任务&#xff0c;获取美国各州2010年的人口密度排名。 import pandas as pd import numpy as npdef task3():#********** Begin **********##读取三个csv文件pop pd.DataFrame(pd.read_csv("./step3/state-popula…...

仿“东方甄选”直播商城小程序运营平台

在公域直播流量红利趋于饱和、流量成本大幅攀升的当下&#xff0c;私域直播为企业开辟了新的流量聚集和转化渠道&#xff0c;特别是对于那些希望在私域流量领域取得突破的品牌商家来说&#xff0c;直播场景以其独特的高频互动氛围&#xff0c;相比其他运营方式&#xff0c;展现…...