尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Python学习日记11
数据库支持13.1 数据库概述13.1.1 为什么需要数据库当程序需要存储和管理大量结构化数据时普通文件如 CSV、JSON存在明显局限13.1.2 Python 数据库 APIDB APIPython 提供了统一的数据库接口规范DB API 2.0PEP 249不同数据库的 Python 模块遵循相同的 API让代码可以更容易地切换数据库。# 统一的使用模式不因数据库类型而变 import sqlite3 # 或 psycopg2, MySQLdb 等 conn connect(database.db) # 连接数据库 curs conn.cursor() # 获取游标 curs.execute(SELECT * FROM table) # 执行 SQL rows curs.fetchall() # 获取结果 conn.commit() # 提交事务 conn.close() # 关闭连接13.1.3 常见数据库13.2 SQLite 快速入门13.2.1 连接数据库import sqlite3 # 连接到数据库文件不存在时会自动创建 conn sqlite3.connect(mydatabase.db) # 连接内存数据库临时程序结束即消失 conn sqlite3.connect(:memory:) # 关闭连接 conn.close()13.2.2 游标Cursor游标用于执行 SQL 语句和获取查询结果。import sqlite3 conn sqlite3.connect(mydatabase.db) curs conn.cursor() # 执行 SQL 语句 curs.execute(CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)) # 获取结果 rows curs.fetchall() conn.close()13.3 创建表和插入数据13.3.1 创建表import sqlite3 conn sqlite3.connect(mydatabase.db) curs conn.cursor() # 创建用户表 curs.execute( CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, email TEXT UNIQUE ) ) conn.commit() # 提交更改 conn.close()SQLite 数据类型常用约束13.3.2 插入数据三种方式方式1直接拼接字符串不安全不推荐# 危险容易遭受 SQL 注入攻击 name Alice; DROP TABLE users; -- curs.execute(fINSERT INTO users (name) VALUES ({name}))方式2使用参数化查询推荐# 使用 ? 占位符 name Alice age 25 curs.execute(INSERT INTO users (name, age) VALUES (?, ?), (name, age)) # 使用命名占位符 curs.execute(INSERT INTO users (name, age) VALUES (:name, :age), {name: Bob, age: 30})方式3批量插入users [ (Charlie, 35), (Diana, 28), (Eve, 42), ] curs.executemany(INSERT INTO users (name, age) VALUES (?, ?), users)13.3.3 提交事务conn.commit() # 提交所有更改 # 如果不提交关闭连接时更改会丢失13.4 查询数据13.4.1 基本查询import sqlite3 conn sqlite3.connect(mydatabase.db) curs conn.cursor() # 执行查询 curs.execute(SELECT * FROM users) # 获取所有行返回列表 all_rows curs.fetchall() print(all_rows) # [(1, Alice, 25, None), (2, Bob, 30, None), ...] # 获取一行 one_row curs.fetchone() # 获取多行指定数量 few_rows curs.fetchmany(5) conn.close()13.4.2 参数化查询# 查询特定年龄的用户 curs.execute(SELECT * FROM users WHERE age ?, (25,)) # 查询名字包含特定字符的用户 curs.execute(SELECT * FROM users WHERE name LIKE ?, (A%,)) # 使用命名参数 curs.execute(SELECT * FROM users WHERE name :name, {name: Alice})13.4.3 使用字典游标默认返回元组可以使用字典游标获取带列名的结果。conn sqlite3.connect(mydatabase.db) conn.row_factory sqlite3.Row # 设置为 Row 工厂 curs conn.cursor() curs.execute(SELECT * FROM users) # 结果可以像字典一样访问 for row in curs.fetchall(): print(row[name], row[age]) # 或者转换为普通字典 rows [dict(row) for row in curs.fetchall()]13.4.4 获取列名curs.execute(SELECT * FROM users) col_names [description[0] for description in curs.description] print(col_names) # [id, name, age, email]13.5 更新和删除13.5.1 更新数据# 更新特定用户 curs.execute(UPDATE users SET age ? WHERE name ?, (26, Alice)) # 批量更新所有用户年龄加1 curs.execute(UPDATE users SET age age 1) conn.commit()13.5.2 删除数据# 删除特定用户 curs.execute(DELETE FROM users WHERE name ?, (Eve,)) # 删除所有数据保留表结构 curs.execute(DELETE FROM users) conn.commit()13.6 事务处理13.6.1 事务的概念事务是一组数据库操作的集合要么全部成功提交要么全部失败回滚。13.6.2 事务示例import sqlite3 conn sqlite3.connect(bank.db) curs conn.cursor() try: # 开始事务自动开始 curs.execute(UPDATE accounts SET balance balance - 100 WHERE id 1) curs.execute(UPDATE accounts SET balance balance 100 WHERE id 2) # 提交事务 conn.commit() print(转账成功) except Exception as e: # 发生错误回滚所有更改 conn.rollback() print(转账失败已回滚:, e) finally: conn.close()13.6.3 自动提交模式# 默认情况下sqlite3 使用隐式事务 # 可以启用自动提交每个操作立即生效 conn sqlite3.connect(mydatabase.db, isolation_levelNone)13.7 综合示例营养成分数据库下面是一个从数据文件导入到 SQLite 数据库并进行查询的完整示例。13.7.1 数据结构假设有一个名为ABBREV.txt的数据文件字段用^分隔字符串字段用~包围。~07276~^~HORMEL SPAM...PORK W/ HAM MINCED CND~^...^~1 serving~^^~~^013.7.2 导入数据import sqlite3 def convert(value): 转换字段值 if value.startswith(~): return value.strip(~) # 字符串 if not value: return 0 # 空值转为0 return float(value) # 数字 def import_data(filenameABBREV.txt): conn sqlite3.connect(food.db) curs conn.cursor() # 创建表 curs.execute( CREATE TABLE IF NOT EXISTS food ( id TEXT PRIMARY KEY, desc TEXT, water REAL, kcal REAL, protein REAL, fat REAL, ash REAL, carbs REAL, fiber REAL, sugar REAL ) ) # 插入数据 field_count 10 query INSERT INTO food VALUES ( ,.join([?]*10) ) with open(filename, r, encodingutf-8) as f: for line in f: fields line.split(^) vals [convert(f) for f in fields[:field_count]] curs.execute(query, vals) conn.commit() conn.close() print(f数据导入完成)13.7.3 查询数据def query_food(condition): 根据条件查询食品数据 conn sqlite3.connect(food.db) conn.row_factory sqlite3.Row curs conn.cursor() query fSELECT * FROM food WHERE {condition} curs.execute(query) # 获取列名 col_names [desc[0] for desc in curs.description] # 打印结果 for row in curs.fetchall(): for name in col_names: print(f{name}: {row[name]}) print() conn.close() # 使用示例查找低热量高纤维的食品 query_food(kcal 100 AND fiber 10 ORDER BY sugar)13.8 SQL 注入防护重要13.8.1 什么是 SQL 注入SQL 注入是攻击者通过构造恶意输入来执行非预期的 SQL 语句从而破坏数据库的攻击方式。# 危险代码 user_input Alice; DROP TABLE users; -- curs.execute(fSELECT * FROM users WHERE name {user_input}) # 实际执行SELECT * FROM users WHERE name Alice; DROP TABLE users; -- # ↑ 恶意代码被注入并执行13.8.2 防护方法永远使用参数化查询# 安全方式使用参数化查询 user_input Alice; DROP TABLE users; -- curs.execute(SELECT * FROM users WHERE name ?, (user_input,)) # 参数被当作普通字符串处理不会执行恶意代码13.9 本章知识点速查表
RELATED

相关推荐

Vue 3面试核心知识:响应式原理与Composition API全解析

Vue 3面试核心知识:响应式原理与Composition API全解析

2023年整个前端面试市场有一个很有意思的现象:Vue 3 已经不是"要不要学"的问题,而是"问得多深"的问题。我参加过几轮面试,也帮团队面过候选人,发现 Vite 构建、Composition API、响应式原理、Pinia 状态管理这…

📅 2026/11/8 11:44:09
从0.3%到10%:DeepSeek V4-Pro与Claude Code的真实工程差距与接入实践

从0.3%到10%:DeepSeek V4-Pro与Claude Code的真实工程差距与接入实践

这几天 AI 编程圈最热闹的话题,不是哪个模型又刷了榜,而是一句来自开发者的吐槽:融资材料里写的“V4-Pro 编程能力仅差 Claude 旗舰 0.3%”,被负责 DeepSeek Harness 的同事直接定性为“吹过头”。紧接着还补了一刀:前…

📅 2026/10/8 23:41:16
FPGA应用开发和仿真【1.9】

FPGA应用开发和仿真【1.9】

2.14 接口初学者可跳过此节,当觉得在很多模块中写一模一样的长长的端口定义很烦琐时,可再来学习本节。接口用来将多个相关的端口组织在一起,为了说明接口的作用,先考虑下面代码:代码2-40 存储器及其测试第一个模块mem…

📅 2026/11/6 0:17:13
MORE NEWS

更多资讯

📰

工地太忙根本没时间复习考试?磁卡电工证样子与上岗必备的真相

工地太忙根本没时间复习考试?磁卡电工证样子与上岗必备的真相 工地太忙根本没时间复习考试?你不是一个人。作为南阳卧龙区市政公用工程一线的电工,我知道你每天要面对的不只是线路检修和设备安装,还有不断变动的施工进度、临时调度和高强度作业。但不管你…

📰

电工证速考真实经历:找工作前必须搞懂的几个问题

电工证速考真实经历:找工作前必须搞懂的几个问题 我昨天刚帮驻马店的一个劳务班组办完低压电工证,他们急着要上岗,但对流程一窍不通,差点因为不了解政策耽误了工期。这种“急需特种作业证才能上岗找工作”的情况,每天都在发生,尤其是在建筑、制造业这些…

📰

临沂河东办理电工证怎么考?网上查询最靠谱,速看报考指南

临沂河东办理电工证怎么考?网上查询最靠谱,速看报考指南 急需特种作业证才能上岗找工作,这事儿别拖!最近在临沂河东区找工作,不少电工同行都提到, 临沂河东办理电工证…

📰

过期电工证激活流程继续教育学时要求

电工证过期怎么激活?学历不高也能考!在哪考一目了然 你是不是也遇到过这种情况:手里有个电工证,结果一不小心就过期了,现在想找份工作,发现证书失效,干着急却不知道咋办? 学历不高怕报不上名…

📰

顺德哪有考电工证,官方报名入口怎么找才靠谱

顺德哪有考电工证,官方报名入口怎么找才靠谱 你是不是也遇到过这样的问题:顺德哪有考电工证?跑了好几家机构,不是价格虚高就是培训质量差,甚至还有被中介坑了钱还考不下来的情况?其实,只要找到 官方报名入口…

📰

在荆州考电工证在哪考?电工证不办就别想上岗了

在荆州考电工证在哪考?电工证不办就别想上岗了 你是不是也遇到过这种情况:干了三个月电工,单位说你没证,不能上岗?别急,这种情况在荆州特别常见, 在荆州考电工证…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬