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

关于Python:7. Python数据库操作

一、sqlite3(轻量级本地数据库)

sqlite3 是 Python 内置的模块,用于操作 SQLite 数据库。

  • SQLite 是一个轻量级、零配置的关系型数据库系统,整个数据库保存在一个文件中,适合小型项目和本地存储。

  • SQLite 不需要安装服务器,打开即可用,跨平台

Python 内置了 sqlite3 模块,无需安装。

1. 主要特点

特点描述
零配置不需要安装数据库服务器
跨平台Windows、Linux、Mac 通用
单文件存储数据库是一个 .db 文件
SQL 兼容性强支持大部分 SQL 语法
嵌入式可嵌入任何应用,无需联网
适合本地小项目如桌面应用、原型系统、小型管理系统

2. 基本使用流程

2.1. 导入模块 & 连接数据库

import sqlite3# 自动创建/连接数据库文件
conn = sqlite3.connect('example.db')  # 文件名可自定义

2.2. 创建游标对象(操作数据库)

cursor = conn.cursor()

2.3. 创建表(如果不存在)

cursor.execute('''
CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,age INTEGER
)
''')

2.4. 插入数据

cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Alice", 25))

使用 ? 占位符是为了防止 SQL 注入攻击。

2.5. 查询数据

cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:print(row)

2.6. 更新与删除数据

cursor.execute("UPDATE users SET age = ? WHERE name = ?", (30, "Alice"))
cursor.execute("DELETE FROM users WHERE name = ?", ("Alice",))

2.7. 提交事务 & 关闭连接

conn.commit()  # 一定要 commit 否则数据不会保存
conn.close()

3. 事务机制

SQLite 支持事务,默认处于自动提交模式,但你也可以手动控制:

conn = sqlite3.connect('example.db')
cursor = conn.cursor()try:cursor.execute("BEGIN")cursor.execute("UPDATE users SET age = age + 1")conn.commit()  # 成功就提交
except Exception as e:conn.rollback()  # 出错就回滚print("错误:", e)conn.close()

4. fetch 方法详解

fetchone()     # 获取一行结果
fetchall()     # 获取所有结果
fetchmany(n)   # 获取 n 行

5. 数据库文件位置

默认会在当前 Python 脚本目录下生成 .db 文件。你可以自定义路径:

conn = sqlite3.connect(r"C:\Users\你的目录\mydata.db")

6.  一些注意事项

问题原因/解决办法
忘记 conn.commit()改动不会保存!
多线程写冲突SQLite 本质是单线程写,慎用多线程并发写入
类型不严格SQLite 是动态类型系统,不会报类型错(如 age 可以写成 'abc')
SQL 注入风险尽量使用 ? 占位符,不拼接 SQL 字符串
同时打开多个连接会出现锁,建议用单连接或 with 语句管理资源

7. 用 with 自动关闭连接和提交事务(推荐)

with sqlite3.connect('example.db') as conn:cursor = conn.cursor()cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Tom", 22))conn.commit()

8. 高级功能

使用 row_factory 获取字典而不是元组

conn = sqlite3.connect('example.db')
conn.row_factory = sqlite3.Row
cursor = conn.cursor()cursor.execute("SELECT * FROM users")
row = cursor.fetchone()
print(dict(row))  # {'id': 1, 'name': 'Tom', 'age': 22}

导入 CSV 文件、使用索引、JOIN 多表等高级 SQL 特性,SQLite 全部支持。


二、MySQL(主流数据库)

MySQL 是目前最流行的开源关系型数据库,适用于各类 Web 项目,支持高并发、高性能访问。

Python 操作 MySQL 通常有两种主流库:

库名优点
pymysql纯 Python 实现,使用最广,轻量好用
mysql-connector-python官方提供,稳定性高

以下使用 pymysql 为主讲解。

1. 环境准备

pip install pymysql

安装 MySQL 数据库

  • Windows 可以安装 MySQL Community Edition

  • macOS 可用 brew install mysql

  • Linux 可以使用 aptyum

下载地址:https://downloads.mysql.com/archives/workbench/

确保运行后,可以通过以下方式登录:

mysql -u root -p

2. 连接数据库

import pymysqlconn = pymysql.connect(host='localhost',user='root',password='你的密码',database='testdb',port=3306,  # 默认端口charset='utf8mb4'
)cursor = conn.cursor()

3. 建表和插入数据

创建表:

cursor.execute('''
CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,age INT
)
''')

插入数据:

cursor.execute("INSERT INTO users (name, age) VALUES (%s, %s)", ("Alice", 25))
conn.commit()

4. 查询数据

查询所有:

cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()for row in rows:print(row)

查询一条:

cursor.execute("SELECT * FROM users WHERE name = %s", ("Alice",))
row = cursor.fetchone()
print(row)

5. 更新与删除

# 更新
cursor.execute("UPDATE users SET age = %s WHERE name = %s", (30, "Alice"))# 删除
cursor.execute("DELETE FROM users WHERE name = %s", ("Alice",))conn.commit()

6. 事务处理

try:cursor.execute("BEGIN")cursor.execute("UPDATE users SET age = age + 1")conn.commit()
except Exception as e:conn.rollback()print("事务回滚:", e)

7. 批量操作

data = [("Tom", 20), ("Jack", 22), ("Lily", 18)]
cursor.executemany("INSERT INTO users (name, age) VALUES (%s, %s)", data)
conn.commit()

8. 关闭资源

cursor.close()
conn.close()

或者使用 with 管理:

with pymysql.connect(...) as conn:with conn.cursor() as cursor:cursor.execute("SELECT * FROM users")

9. 常见问题

问题解决方案
报错:Access denied检查用户名、密码是否正确;用户是否有访问权限
中文乱码使用 charset='utf8mb4';建表时列加 CHARACTER SET utf8mb4
插入 SQL 注入问题使用 %s 占位符,不拼接 SQL
MySQL server has gone away长连接断了,建议短连接或设置 wait_timeout

10. 进阶功能

使用 DictCursor 获取字典而不是元组

cursor = conn.cursor(pymysql.cursors.DictCursor)
cursor.execute("SELECT * FROM users")
row = cursor.fetchone()
print(row['name'])  # 字典形式

使用连接池(推荐中大型项目)

使用 DBUtils 实现连接池:

pip install DBUtils
from DBUtils.PooledDB import PooledDBpool = PooledDB(creator=pymysql,maxconnections=5,host='localhost',user='root',password='123456',database='testdb',charset='utf8mb4'
)conn = pool.connection()
cursor = conn.cursor()

11. 项目目标:用户注册与登录系统

功能包括:

  • 用户注册(用户名+密码)
  • 用户登录(验证用户名和密码)
  • 数据存入 MySQL 数据库
  • 密码加密存储(用 hashlib)

准备工作

安装 pymysql

pip install pymysql

创建数据库和表(进入 MySQL):

CREATE DATABASE IF NOT EXISTS userdb CHARACTER SET utf8mb4;USE userdb;CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) UNIQUE NOT NULL,password_hash VARCHAR(128) NOT NULL
);

完整示例代码(含注册和登录功能)

import pymysql
import hashlib# 数据库连接参数
conn = pymysql.connect(host='localhost',user='root',password='你的MySQL密码',database='userdb',charset='utf8mb4'
)cursor = conn.cursor()# 密码加密函数(MD5 示例)
def hash_password(password):return hashlib.md5(password.encode()).hexdigest()# 注册功能
def register(username, password):cursor.execute("SELECT * FROM users WHERE username = %s", (username,))if cursor.fetchone():print("用户名已存在")returnhashed_pwd = hash_password(password)cursor.execute("INSERT INTO users (username, password_hash) VALUES (%s, %s)", (username, hashed_pwd))conn.commit()print("注册成功")# 登录功能
def login(username, password):hashed_pwd = hash_password(password)cursor.execute("SELECT * FROM users WHERE username = %s AND password_hash = %s", (username, hashed_pwd))if cursor.fetchone():print("登录成功")else:print("登录失败,用户名或密码错误")# 测试运行
while True:print("\n== 用户系统 ==")print("1. 注册")print("2. 登录")print("0. 退出")choice = input("请输入选项:")if choice == "1":u = input("用户名:")p = input("密码:")register(u, p)elif choice == "2":u = input("用户名:")p = input("密码:")login(u, p)elif choice == "0":breakelse:print("无效的选项")# 关闭连接
cursor.close()
conn.close()

运行效果:

== 用户系统 ==
1. 注册
2. 登录
0. 退出
请输入选项:1
用户名:alice
密码:123456
注册成功== 用户系统 ==
1. 注册
2. 登录
0. 退出
请输入选项:2
用户名:alice
密码:123456
登录成功

三、PostgreSQL

PostgreSQL(简称 Postgres)是一个功能强大、开源的 关系型数据库管理系统(RDBMS),以 稳定性强、功能丰富 著称,被广泛用于金融、科研、大数据等领域。

1. PostgreSQL 的核心特点

特性描述
开源免费完全开源,企业级能力,全球社区活跃维护
SQL 标准支持好支持大量 SQL 标准语法、窗口函数、CTE 等复杂查询
数据完整性强支持外键、唯一性、检查约束、触发器等
支持 JSON / XML / GIS可当半结构化数据库(文档型/地理型数据库)使用
扩展性强支持插件、扩展(如 postgispgvector
支持事务和并发完整的 ACID 特性,MVCC(多版本并发控制)确保并发性能

2. PostgreSQL 安装

Windows / macOS:
官网下载安装包:PostgreSQL: Downloads

Ubuntu:

sudo apt update
sudo apt install postgresql postgresql-contrib

默认会创建一个系统用户:postgres,初始登录:

sudo -u postgres psql

3. Python 操作 PostgreSQL —— 使用 psycopg2

安装:

pip install psycopg2

如果安装失败,可尝试:

pip install psycopg2-binary

4. 基本使用示例(增删查改)

连接数据库

import psycopg2conn = psycopg2.connect(dbname='yourdb',user='youruser',password='yourpass',host='localhost',port=5432
)cursor = conn.cursor()

创建表

cursor.execute('''
CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY,username VARCHAR(50) UNIQUE NOT NULL,age INT
)
''')
conn.commit()

插入数据

cursor.execute("INSERT INTO users (username, age) VALUES (%s, %s)", ("Alice", 23))
conn.commit()

查询数据

cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:print(row)

更新 & 删除

cursor.execute("UPDATE users SET age = %s WHERE username = %s", (30, "Alice"))
cursor.execute("DELETE FROM users WHERE username = %s", ("Alice",))
conn.commit()

关闭连接

cursor.close()
conn.close()

5. 与mysql技术对比

特性MySQLPostgreSQL
性能写入快,轻量级,适合读多写少更适合复杂查询和写多读少的情况
事务 & ACID支持(InnoDB 引擎)更严格、全面的 ACID 支持
扩展性较差,定制性低非常强,支持自定义函数、类型等
JSON 支持有但较弱原生 JSONB 支持,功能强大
GIS 支持更强,PostGIS 非常强大

四、SQLAlchemy(ORM框架)

SQLAlchemy 介绍

SQLAlchemy 是 Python 中最流行的 ORM(对象关系映射)框架,它将数据库中的数据表映射到 Python 类,并使得我们可以通过 Python 代码对数据库进行增删改查(CRUD)操作,而不必直接编写 SQL 语句。SQLAlchemy 提供了高度抽象化的 API,使得开发者在处理数据库操作时更加简洁、直观。

SQLAlchemy 主要有两个核心部分:

  1. SQLAlchemy Core:提供低级别的数据库交互 API,适合需要完全控制 SQL 生成和执行的高级用户。

  2. SQLAlchemy ORM:建立在 SQLAlchemy Core 之上,是高层的对象关系映射工具,帮助我们更轻松地通过 Python 类与数据库交互。

SQLAlchemy ORM 是大多数开发者使用的部分。

1. 核心概念

模型(Model)表(Table):在 SQLAlchemy 中,表格(Table)是数据库中的实际表,而模型(Model)是 Python 类,它通过映射将数据库表的列映射为类的属性。

Session:Session 是数据库连接的管理者,负责管理对象的生命周期和数据的持久化。通过 Session 对象,我们可以添加、删除、更新数据库中的记录,并提交(commit)这些操作。

Query:Query 对象用于执行数据库查询。通过 Query 对象,你可以过滤数据、选择字段、排序、聚合等操作。

2. 基础示例

通过一个简单的 用户管理系统 来演示如何使用 SQLAlchemy 进行操作。

1)安装 SQLAlchemy 和数据库驱动

pip install sqlalchemy
pip install psycopg2  # PostgreSQL 驱动,若使用 MySQL,换成 pymysql

2)定义模型

首先,我们定义数据库表和映射的 Python 类。

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmakerBase = declarative_base()  # 声明基础类# 定义一个 User 表对应的 Python 类
class User(Base):__tablename__ = 'users'  # 数据库中的表名id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)# 创建数据库引擎,SQLite 本地数据库
engine = create_engine('sqlite:///example.db')  # PostgreSQL/MySQL 需要替换数据库URL# 创建数据库表
Base.metadata.create_all(engine)
  • Base 是一个基类,所有的模型都应该继承它。

  • User 类表示了数据库中的一个 users 表,并定义了表的结构(字段)。

  • engine 是数据库的引擎,负责连接数据库。我们使用 sqlite:///example.db 创建了一个本地 SQLite 数据库,你可以根据需要替换为其他数据库连接字符串。

3)创建 Session 和 数据库操作

然后,我们使用 Session 来进行数据的增删改查。

# 创建 Session 类
Session = sessionmaker(bind=engine)
session = Session()# 插入数据
new_user = User(name="Alice", age=25)
session.add(new_user)
session.commit()  # 提交到数据库# 查询数据
users = session.query(User).filter_by(name="Alice").all()
print(users)# 更新数据
user_to_update = session.query(User).filter_by(name="Alice").first()
user_to_update.age = 26
session.commit()# 删除数据
user_to_delete = session.query(User).filter_by(name="Alice").first()
session.delete(user_to_delete)
session.commit()# 关闭 Session
session.close()
  • 插入数据:通过 session.add() 方法添加新用户,然后使用 session.commit() 提交到数据库。

  • 查询数据:通过 session.query() 方法查询数据,并使用 .filter_by() 过滤条件。

  • 更新数据:查询到用户后直接修改其属性,再调用 session.commit() 提交。

  • 删除数据:通过 session.delete() 删除查询到的对象。

4.)通过 SQLAlchemy 操作数据库

以上的操作都是基于 Python 类的操作,但 SQLAlchemy 会自动生成对应的 SQL 语句,如 INSERT, SELECT, UPDATE, DELETE 等。

例如,当我们执行:

users = session.query(User).filter_by(name="Alice").all()

SQLAlchemy 会将其转化为:

SELECT * FROM users WHERE name = 'Alice';

3. 复杂查询示例

SQLAlchemy 也支持复杂的查询操作,比如排序、聚合、关联查询等。

1)排序

users = session.query(User).order_by(User.age.desc()).all()  # 按照年龄降序排序

2)聚合

from sqlalchemy import funcavg_age = session.query(func.avg(User.age)).scalar()  # 获取所有用户的平均年龄
print(f"Average age: {avg_age}")

3)关联查询

假设我们有一个 Post 类和 User 类,用户可以拥有多个文章:

class Post(Base):__tablename__ = 'posts'id = Column(Integer, primary_key=True)title = Column(String)user_id = Column(Integer, ForeignKey('users.id'))user = relationship("User", back_populates="posts")User.posts = relationship("Post", order_by=Post.id, back_populates="user")

现在可以通过 SQLAlchemy 轻松进行关联查询:

# 查询某个用户的所有文章
user = session.query(User).filter_by(name="Alice").first()
for post in user.posts:print(post.title)

4. SQLAlchemy 高级特性

1)多表查询与联接

SQLAlchemy 支持内连接(JOIN)、外连接(OUTER JOIN)等操作,可以方便地处理复杂的多表查询。

session.query(User, Post).join(Post).filter(User.id == Post.user_id).all()

2)事务管理

SQLAlchemy 允许手动控制事务,使用 session.begin()session.rollback() 可以进行显式的事务控制。

try:session.begin()# 一些数据库操作session.commit()
except:session.rollback()

3)数据库迁移工具:Alembic

SQLAlchemy 本身不提供数据库迁移功能,但 Alembic 是其官方支持的迁移工具,它可以帮助我们在数据库模型发生变化时同步数据库结构。

5. 总结

  • 简化数据库操作:SQLAlchemy ORM 提供了高层次的接口来简化数据库的操作,我们可以通过 Python 类来表示数据库表,进行增删改查,避免了手写 SQL 语句。

  • 支持复杂查询:SQLAlchemy 支持排序、聚合、联接查询等复杂数据库操作,同时可以自动生成对应的 SQL 语句。

  • 跨数据库兼容性:通过 SQLAlchemy,你可以很容易地将项目从一个数据库迁移到另一个数据库(比如从 SQLite 到 MySQL、PostgreSQL)。

如果希望进行数据库操作时不想编写太多 SQL,SQLAlchemy 是一个非常合适的选择,尤其是在项目需要频繁与数据库交互时。


五、Redis(缓存数据库)

Redis(Remote Dictionary Server) 是一个开源的、基于内存的高性能 键值对(key-value) 数据库,常用于缓存、消息队列、实时统计等场景。

它具有如下特点:

  • 极快的访问速度:基于内存,读取速度可达 10 万 QPS(每秒查询数)。

  • 多种数据结构:支持字符串、列表、集合、哈希、位图、有序集合等。

  • 丰富的应用场景:分布式锁、登录状态缓存、排行榜、限流器等。

  • 支持持久化:内存数据可以保存到磁盘。

  • 主从复制、集群模式:可以实现高可用、高并发的集群部署。

1. Redis 支持的数据类型

类型示例用途特点介绍
String缓存页面内容、token、验证码最基础的类型,支持字符串、数字
List消息队列、任务队列有序列表,可从头/尾插入/弹出
Set标签系统、去重集合无序不重复元素集合
Hash存储用户信息、商品信息类似字典:key -> field -> value
ZSet排行榜、推荐系统有序集合:元素+分数(score)
Bitmap用户签到、状态记录位操作,适合大量布尔数据
HyperLogLog统计 UV/去重用户数近似去重,内存占用极低

2. Redis 安装与启动

如果是 Linux 用户:

sudo apt install redis
redis-server  # 启动服务

也可以使用 Docker 安装:

docker run -d --name redis -p 6379:6379 redis

客户端连接:

redis-cli  # 进入命令行

3. 使用 Python 操作 Redis(redis-py

1)安装 Python 客户端:

pip install redis

2)连接 Redis

import redis# 创建 Redis 连接对象
r = redis.StrictRedis(host='localhost',      # Redis 服务器地址(本地)port=6379,             # Redis 端口(默认)db=0,                  # 使用的数据库编号(0 ~ 15)decode_responses=True # 自动将 bytes 解码为 str
)

3.)字符串操作(String)

# 设置键值
r.set("username", "alice")# 获取值
print(r.get("username"))  # 输出: alice# 设置键值并指定过期时间(单位:秒)
r.setex("code", 60, "123456")  # 设置验证码,有效期60秒# 自增、自减
r.set("count", 10)
r.incr("count")  # +1
r.decr("count")  # -1

4)哈希操作(Hash)

# 设置字段
r.hset("user:1", "name", "Bob")
r.hset("user:1", "age", 25)# 获取字段
print(r.hget("user:1", "name"))  # 输出: Bob# 获取所有字段
print(r.hgetall("user:1"))       # {'name': 'Bob', 'age': '25'}

5)列表操作(List)

# 从左侧插入元素(类似栈)
r.lpush("queue", "task1", "task2")# 从右侧弹出元素
task = r.rpop("queue")
print(task)  # 输出: task1 或 task2# 获取所有元素
print(r.lrange("queue", 0, -1))

6)集合操作(Set)

# 添加元素
r.sadd("tags", "python", "redis", "flask")# 获取所有元素(无序)
print(r.smembers("tags"))# 判断是否存在某个元素
print(r.sismember("tags", "redis"))  # True or False

7)有序集合操作(ZSet)

# 添加元素和分数
r.zadd("rank", {"Alice": 90, "Bob": 95})# 获取排行榜(按分数从高到低)
print(r.zrevrange("rank", 0, -1, withscores=True))# 增加某个成员的分数
r.zincrby("rank", 5, "Alice")

8)键的通用操作

# 设置过期时间
r.expire("username", 30)  # 30秒后自动过期# 查看剩余时间
print(r.ttl("username"))# 删除键
r.delete("username")

9)事务操作(可选)

pipe = r.pipeline()
pipe.set("a", 1)
pipe.set("b", 2)
pipe.execute()  # 一起提交
类型方法说明
Stringset, get, incr, setex普通键值对、计数器
Hashhset, hget, hgetall结构化字段存储
Listlpush, rpop, lrange队列 / 栈结构
Setsadd, smembers, sismember去重集合、标签系统
ZSetzadd, zrevrange, zincrby排行榜、有序存储

4. Redis 与数据库的区别

项目Redis(缓存数据库)MySQL/PostgreSQL(关系数据库)
主要用途高速缓存、统计、消息、锁、排行榜数据存储、结构化查询、事务
存储位置内存(可持久化)磁盘
查询方式按键访问,速度极快支持复杂 SQL 查询
一致性弱(默认无事务)强一致性(支持事务、ACID)
数据结构丰富(String、List、ZSet等)固定结构(表结构)

Redis 是内存级数据库,适合高性能读写 + 临时数据处理,不适合永久性存储;数据库负责业务核心数据,Redis 更像是“加速器”。

5. 举例

爬取一个网站的数据,并将这些数据缓存到 Redis 中

import redis
import requests
from bs4 import BeautifulSoup# 连接 Redis
r = redis.StrictRedis(host='localhost', port=6379, db=0, decode_responses=True)# 爬取网页
url = "https://quotes.toscrape.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')# 获取所有名言和作者
quotes = soup.find_all('div', class_='quote')
data = []for quote in quotes:text = quote.find('span', class_='text').textauthor = quote.find('small', class_='author').textdata.append({'text': text, 'author': author})# 将数据存入 Redis
for idx, quote in enumerate(data):key = f"quote:{idx+1}"r.hset(key, mapping=quote)# 查看存入 Redis 的数据
for idx in range(1, len(data)+1):key = f"quote:{idx}"print(r.hgetall(key))  # 获取整个哈希

说明

  • 爬取数据: 我们从 https://quotes.toscrape.com 网站上抓取了所有名言和作者。
  • 存储数据: 将每一条名言存储为一个 Redis 哈希对象,键是 quote:{idx},值是该名言的内容和作者。
  • Redis 操作: 使用 hset 存储数据,并通过 hgetall 获取存储的数据。

后续操作

  • 如果数据量很大,可以考虑分页抓取,存入多个 Redis 键。
  • 如果要处理更复杂的数据,可以考虑用 Redis 的列表、集合或有序集合进行存储。
  • 如果是需要缓存,可以使用 Redis 的过期时间设置,例如使用 setex 方法设置过期时间。

六、MongoDB

MongoDB 是一个开源的 NoSQL 数据库,使用文档(Document)形式存储数据,而非传统的关系数据库中的表(Table)和行(Row)。它是面向文档的数据库,广泛应用于需要高性能、大数据量的应用程序。

MongoDB 采用了文档存储结构,数据以 BSON(Binary JSON)格式存储。这使得它比关系数据库更具灵活性,可以存储复杂的嵌套数据和不同格式的数据。

特点:

  • 文档存储: 数据以 BSON 格式存储,支持嵌套数据结构,灵活性更高。

  • 高可扩展性: 支持横向扩展(sharding),可通过分片技术将数据分布在不同的服务器上。

  • 高性能: 支持高效的读写操作,适用于高吞吐量和高并发的应用。

  • 灵活的 schema: 数据库中的集合不需要固定的 schema,允许不同文档具有不同的字段。

  • 原子操作: 支持原子操作,可以对单一文档执行更新、删除等操作。

1. MongoDB 数据模型

MongoDB 使用以下数据结构:

  • 数据库(Database): 存储数据的容器,一个 MongoDB 实例可以包含多个数据库。

  • 集合(Collection): 类似于关系数据库中的表,一个数据库可以有多个集合。

  • 文档(Document): 数据的最小单位,类似于关系数据库中的行。文档是 BSON 格式的数据(类似 JSON),每个文档都有唯一的 _id 字段。

示例:MongoDB 数据模型

{"_id": ObjectId("5f45c3a735e56a3b59e4906d"),"name": "Alice","age": 25,"address": {"street": "123 Main St","city": "New York"}
}
  • _id:每个文档都有一个唯一的 _id 字段(如果没有指定,MongoDB 会自动生成)。

  • address:嵌套文档,表示地址信息。

2. MongoDB 安装与启动

安装 MongoDB

  • Linux: 可以使用包管理器(如 aptyum)安装 MongoDB。
sudo apt update
sudo apt install mongodb
  • Windows: 使用 MongoDB 官网提供的安装包,按照向导完成安装。

官网:https://www.mongodb.com/try/download/community-edition/releases/archive

  • macOS: 使用 brew 安装 MongoDB。

brew tap mongodb/brew
brew install mongodb-community@5.0

启动 MongoDB

启动 MongoDB 服务:

mongod  # 启动数据库服务器

启动 MongoDB 客户端:

mongo   # 进入 MongoDB shell

3. 使用 Python 操作 MongoDB

安装 Python MongoDB 客户端库 pymongo

pip install pymongo

1)连接 MongoDB

from pymongo import MongoClient# 连接到本地 MongoDB 服务
client = MongoClient('localhost', 27017)# 获取数据库
db = client['mydatabase']  # mydatabase 是数据库名称# 获取集合
collection = db['users']  # users 是集合名称

2)插入数据

# 插入单个文档
user = {"name": "Alice","age": 25,"address": {"street": "123 Main St","city": "New York"}
}# 插入文档到集合
collection.insert_one(user)# 插入多个文档
users = [{"name": "Bob", "age": 30},{"name": "Charlie", "age": 35}
]
collection.insert_many(users)

3)查询数据

查找单个文档

# 查找第一个匹配的文档
user = collection.find_one({"name": "Alice"})
print(user)

查找多个文档

# 查找所有年龄大于 30 的用户
users = collection.find({"age": {"$gt": 30}})
for user in users:print(user)

使用条件查询(例如,年龄大于 30 且地址为 New York)

# 使用条件查询
users = collection.find({"age": {"$gt": 30},"address.city": "New York"
})for user in users:print(user)

4)更新数据

更新单个文档

# 更新文档
collection.update_one({"name": "Alice"},  # 查询条件{"$set": {"age": 26}}  # 更新内容
)

更新多个文档

# 更新多个文档
collection.update_many({"age": {"$gt": 30}},  # 查询条件{"$set": {"status": "senior"}}  # 更新内容
)

5)删除数据

删除单个文档

# 删除一个文档
collection.delete_one({"name": "Alice"})

删除多个文档

# 删除多个文档
collection.delete_many({"age": {"$lt": 30}})

6)索引操作

为了加速查询,MongoDB 提供了索引功能。你可以为集合的字段创建索引。

# 为字段 `name` 创建索引
collection.create_index([("name", 1)])  # 1 表示升序,-1 表示降序

4. MongoDB 与 关系数据库的区别

特性MongoDB关系数据库(如 MySQL、PostgreSQL)
数据模型面向文档(BSON)面向表(行列)
数据存储灵活的 schema,可变的字段固定的 schema,字段必须预定义
扩展性水平扩展(分片)垂直扩展(增加硬件资源)
查询语言MongoDB 查询语言(MongoDB Query Language)SQL
事务支持支持事务,但不如关系数据库强(4.x 版本及以上支持多文档事务)完全支持事务(ACID)

5. 总结

MongoDB 是一个高性能、可扩展的 NoSQL 数据库,非常适合处理大量的非结构化数据。与传统的关系数据库相比,它的数据模型更加灵活,可以更轻松地存储复杂的数据类型。通过 MongoDB,开发者可以更快速地构建、扩展和维护他们的应用程序。


总结对比表

特性SQLiteMySQLPostgreSQLMongoDBRedisSQLAlchemy
类型关系型数据库关系型数据库关系型数据库NoSQL(文档数据库)内存数据结构存储(缓存数据库)ORM框架(关系型数据库)
数据模型表结构(轻量级)表结构表结构(复杂类型支持)文档(JSON/BSON)键值对(支持多种数据结构)ORM模型,抽象数据库操作
扩展性单文件,不支持横向扩展支持垂直扩展(分区支持)支持横向扩展(分区)水平扩展(分片)内存存储,支持水平扩展依赖数据库的扩展性
并发支持低并发高并发高并发高并发高并发依赖底层数据库并发支持
性能适合轻量级应用高性能,适合Web应用高性能,复杂查询优先高性能(大数据量,高吞吐量)极高性能,适合缓存和会话存储相对较低,适用于开发阶段
事务支持支持支持支持支持(较弱)支持(可选)支持事务管理
适用场景嵌入式应用,小型桌面应用Web应用,企业级应用高并发、大数据场景,地理信息动态数据,日志数据,实时数据高速缓存、实时数据分析Python开发中数据库操作封装
  • SQLite 适用于轻量级应用和单机存储,适合移动端、嵌入式设备或简单应用。

  • MySQL 是一款功能强大、性能优异的关系型数据库,适用于 Web 应用和传统的数据库应用。

  • PostgreSQL 适合复杂数据模型和高并发应用,提供更多的功能和扩展性,适用于大数据量和企业级应用。

  • MongoDB 适合需要灵活数据模型、大数据量和高扩展性的应用,常用于实时数据分析和快速开发。

  • Redis 是一个高性能的内存数据库,适合用作缓存、会话存储和实时数据分析。

  • SQLAlchemy 是一个 Python ORM 框架,适合 Python 开发者进行关系型数据库操作的抽象封装。

相关文章:

关于Python:7. Python数据库操作

一、sqlite3(轻量级本地数据库) sqlite3 是 Python 内置的模块,用于操作 SQLite 数据库。 SQLite 是一个轻量级、零配置的关系型数据库系统,整个数据库保存在一个文件中,适合小型项目和本地存储。 SQLite 不需要安装…...

修改ollama.service都可以实现什么?

通过修改 ollama.service 系统服务单元文件,可以实现以下核心配置变更: 一、网络与访问控制 监听地址与端口 通过 Environment="OLLAMA_HOST=0.0.0.0:11434" 修改服务绑定的 IP 和端口: 0.0.0.0 允许所有网络接口访问(默认仅限本地 127.0.0.1)。示例:改为 0.0.…...

k8s笔记——kubebuilder工作流程

kubebuilder工作流程 Kubebuilder 工作流程详解 Kubebuilder 是 Kubernetes 官方推荐的 Operator 开发框架,用于构建基于 Custom Resource Definitions (CRD) 的控制器。以下是其核心工作流程的完整说明: 1. 初始化项目 # 创建项目目录 mkdir my-opera…...

长江学者答辩ppt美化_特聘教授_校企联聘学者_青年长江学者PPT案例模板

WordinPPT / 持续为双一流高校、科研院所、企业等提供PPT制作系统服务。 长江学者特聘教授 “长江学者奖励计划”中的一类,是高层次人才计划的重要组成部分,旨在吸引和培养具有国际领先水平的学科带头人。特聘教授需全职在国内高校工作,是高…...

Vscode/Code-Server 安装中文包——CI/CD

前言 啊好多人问我怎么还不更新,其实本月是已经写了一篇测评的,但是鉴于过于超前会给产品带来不好的影响,所以就没有公开。那么既然这样本月就再更新一篇。 首先 声明 一点,安装中文包的初衷不是看不懂英文,也不是对…...

【信息系统项目管理师-论文真题】2012上半年论文详解(包括解题思路和写作要点)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题1:论信息系统工程的风险管理1、写作要点2、解题思路对项目风险的认识和项目风险管理的基本过程、主要方法、工具信息系统项目最主要的风险是什么试题2:论信息系统工程项目可行性研究1、写作要点2、解题思…...

PowerPC架构详解:定义、应用及特点

一、PowerPC架构的定义 PowerPC(Performance Optimization With Enhanced RISC – Performance Computing) 是一种由IBM、摩托罗拉(现NXP)和苹果于1991年联合开发的精简指令集(RISC)处理器架构&#xff0c…...

IP伪装、代理池与分布式爬虫

一、动态代理IP应用:代理池的获取、选择与使用 代理池技术的核心是通过动态切换IP地址,让爬虫看起来像不同用户在访问网站,从而规避封禁。 (一)代理池的获取途径 1. 免费代理:低成本但高风险 免费代理可…...

【Arthas】火焰图优化应用CPU(问题原因:获取调用栈)

优化场景总结归纳 1. 问题背景 现象:在公共搜索功能中,火焰图分析发现 获取Java调用栈(StackTrace) 占用了约 6%的CPU(日常流量下),系统高负载时占比更高。原因: 每次外部API调用时…...

回溯算法详解(Java实现):从组合到排列的全面解析

引言 回溯算法是一种强大的算法思想,广泛应用于解决各种组合优化问题。它通过系统性地尝试所有可能的解,并在发现当前路径无法得到解时立即回溯,从而高效地找到问题的解。在本文中,我们将深入探讨回溯算法的核心思想、三要素、通…...

【BLE】【nRF Connect】 精讲nRF Connect自动化测试套件(宏录制、XML脚本)

目录 前言 1. nRF Connect自动化测试介绍 1.1. nRF connect宏录制功能介绍 1.2. 电脑端XML方式 1.3 实际应用案例 1.3.1 BLE 稳定性测试 1.3.2 设备固件更新(DFU)测试 1.3.3 批量设备配置 1.4 操作步骤 1.5 注意事项 2. nRF Connect日志记录 2.1. 日志记录功能 …...

springboot war包tomcat中运行报错,启动过滤器异常,一个或多个筛选器启动失败。

错误信息: "level": "ERROR", "thread": "localhost-startStop-1", "class": "o.a.c.c.C.[.[localhost].[/Crmeb-admin]", …...

基于开源AI大模型与AI智能名片S2B2C商城小程序的线上活动执行优化研究

摘要:本文以开源AI大模型、AI智能名片及S2B2C商城小程序为技术载体,探讨线上活动执行阶段的效能提升路径。通过分析某科技展会案例,发现AI智能名片可将参会者信息采集效率提升60%,S2B2C商城小程序的21链动模式使活动裂变传播速度提…...

解决奥壹oelove婚恋原生小程序上架问题,彻底解决解对问题增强版旗舰版通用

现在很多客户还不了解OElove小程序上架流程!因为很多用户对技术无感!随意上架工作都是要靠官方来辅助!这样在在二开性就会失去很多主动权!本人商业用户有全新原生态小程序源码(注意:这是原生非Uniapp&#…...

Java SE(7)——类和对象(二)

1.包(package) 1.1 包的定义 在Java中,包是一种用于组织和管理类,接口和其他包的机制。主要作用是防止命名冲突,并提供一种访问控制机制 1.2 package关键字 package关键字的主要作用是声明当前类在哪个包里面。 当然,用户也可以…...

Python 装饰器优化策略模式:电商促销折扣的优雅解法

问题背景:促销策略的重复陷阱 在电商促销系统中,我们曾面临这样的痛点: promos [fidelity_promo, bulk_item_promo, large_order_promo] # 6.1节原始方案 def best_promo(order):return max(promo(order) for promo in promos)当新增new…...

redis延时队列详细介绍

Redis延时队列是一种利用Redis数据结构的功能来实现延时任务调度的方法。在Redis中,常用的数据结构包括List(列表)和Sorted Set(有序集合)。延时队列通常是通过有序集合来实现的。 具体实现步骤如下: 将延…...

PHP 开发工程师如何借助 DeepSeek 提升工作效率

在当今数字化时代,PHP 开发工程师面临着不断提高工作效率和应对复杂项目需求的挑战。DeepSeek 作为一款先进的人工智能工具,为 PHP 开发工程师提供了一系列强大的功能,能够显著助力其日常工作。从代码生成与优化,到文档撰写和知识…...

Vibe Coding 新时代:AI 辅助编程完全指南

第一章:什么是 Vibe Coding?AI 编程的新范式 在传统编程的世界里,程序员需要掌握语法、算法和框架,一行一行地编写代码。但随着人工智能的快速发展,一种全新的编程方式正在兴起——这就是 Vibe Coding(氛围编程)。 Vibe Coding 的定义 Vibe Coding 是由 AI 研究者 An…...

Oracle RAC ‘Metrics Global Cache Blocks Lost‘告警解决处理

1. 引言: 前段时间鄙人检查处理过Oracle RAC Metrics Global Cache Blocks Lost’告警,在此总结分享下针对该报警的原因分析及处理办法。 2. 具体事件 通过排查发现造成该告警的原因是共享存储控制器损坏导致的。由于发生已经有段时间了,没…...

Go语言入门基础:协程

第21章 协程 目录 21.1 启动Go协程 协程的概念与特点启动协程的方法及示例协程执行顺序的控制 21.2 通道 通道类型及表示方式21.2.1 实例化通道21.2.2 数据缓冲21.2.3 单向通道21.2.4 通道与select语句 21.3 互斥锁 协程并发访问的逻辑问题互斥锁的使用示例 21.4 WaitGroup类…...

Servlet+tomcat

serverlet 定义:是一个接口,定义了java类被浏览器(tomcat识别)的规则 所以我们需要自定义一个类,实现severlet接口复写方法 通过配置类实现路径和servlet的对应关系 执行原理 当用户在浏览器输入路径,会…...

中间件和组件

文章目录 1. 前言2. 中间件介绍3. 组件介绍4. 区别对比5. 简单类比6. 总结 中间件和组件 1. 前言 中间件和组件是软件开发中两个重要的概念,但它们的定位和作用完全不同。中间件解决的事通信、跨系统、安全等问题,组件是解决具体业务模块,提高…...

piccolo-large-zh-v2 和 bge-m3哪个效果好?

环境: piccolo-large-zh-v2 bge-m3 问题描述: piccolo-large-zh-v2 和 bge-m3哪个效果好? 解决方案: 比较Piccolo-large-zh-v2(商汤)与BGE-M3(智源)的效果时,需结合…...

《告别试错式开发:TDD的精准质量锻造术》

深度解锁TDD:应用开发的创新密钥 在应用开发的复杂版图中,如何雕琢出高质量、高可靠性的应用,始终是开发者们不懈探索的核心命题。测试驱动开发(TDD),作为一种颠覆性的开发理念与方法,正逐渐成…...

哈希函数详解(SHA-2系列、SHA-3系列、SM3国密)案例:构建简单的区块链——密码学基础

文章目录 一、密码哈希函数概述1.1 哈希函数的基本概念1.2 哈希函数在数据安全中的应用 二、SHA-2系列算法详解2.1 SHA-2的起源与发展2.2 SHA-256技术细节与实现2.3 SHA-384和SHA-512的特点2.4 SHA-2系列算法的安全性评估 三、SHA-3系列算法详解3.1 SHA-3的起源与设计理念3.2 K…...

CUDA输出“hello world”

在我们学习任何一门编程语言的时候, 无疑当我们真正用其输出“hello world”的时候, 我们已经成功入门, 接下来要做的就是从入门到放弃了😆 接下来我们通过对比C和CUDA来学习CUDA的运行逻辑: C中的hello worldCUDA中的hello world文本编辑器编写源代码, 比如vscod…...

计算机视觉与深度学习 | 视觉里程计算法综述(传统+深度)

视觉里程计算法综述 1. 算法分类与原理1.1 传统几何方法1.2 深度学习方法2. 关键公式与模型2.1 本征矩阵分解2.2 深度学习模型架构3. 代码实现与开源项目3.1 传统方法实现3.2 深度学习方法实现4. 挑战与未来方向总结传统视觉里程计算法综述1. 算法分类与核心原理1.1 特征点法1.…...

c++ 函数参数传递

C 中的值传递和地址传递 在 C 中,函数参数传递主要有两种方式:值传递和地址传递(指针传递和引用传递都属于地址传递的变体)。 1. 值传递 特点 函数接收的是实参的副本对形参的修改不会影响原始变量适用于小型数据(…...

计算机视觉与深度学习 | 什么是图像金字塔?

图像金字塔详解 图像金字塔 图像金字塔详解1. **定义**2. **原理与公式****2.1 高斯金字塔****2.2 拉普拉斯金字塔**3. **代码示例****3.1 使用OpenCV实现****3.2 手动实现高斯模糊与降采样**4. **应用场景**5. **关键点总结**1. 定义 图像金字塔是一种多尺度图像表示方法,将…...

AI超级智能体教程(五)---自定义advisor扩展+结构化json输出

文章目录 1.自定义拦截器1.2自定义Advisor1.2打断点调试过程1.3Re-reading Advisor自定义实现 2.恋爱报告开发--json结构化输出2.1原理介绍2.1代码实现2.3编写测试用例2.4结构化输出效果 1.自定义拦截器 1.2自定义Advisor spring里面的这个默认的是SimpleloggerAdvisor&#…...

ActiveMQ 集群搭建与高可用方案设计(一)

一、引言 在当今分布式系统盛行的时代,消息中间件扮演着至关重要的角色,而 ActiveMQ 作为一款开源的、功能强大的消息中间件,在众多项目中得到了广泛应用。它支持多种消息传输协议,如 JMS、AMQP、MQTT 等 ,能够方便地实…...

MySQL数据操作全攻略:DML增删改与DQL高级查询实战指南

知识点4【MySQL的DDL】 DDL:主要管理数据库、表、列等操作。 库→表(二维)→列(一维) 数据表的第一行是 列名称 数据库是由一张或多张表组成 我们先学习在数据库中创建数据表 0、常见的数据类型: 1、…...

RabbitMQ 中的六大工作模式介绍与使用

文章目录 简单队列(Simple Queue)模式配置类定义消费者定义发送消息测试消费 工作队列(Work Queues)模式配置类定义消费者定义发送消息测试消费负载均衡调优 发布/订阅(Publish/Subscribe)模式配置类定义消…...

一种基于重建前检测的实孔径雷达实时角超分辨方法——论文阅读

一种基于重建前检测的实孔径雷达实时角超分辨方法 1. 专利的研究目标与实际问题意义2. 专利提出的新方法、模型与公式2.1 重建前检测(DBR)与数据裁剪2.1.1 回波模型与检测准则2.1.2 数据裁剪效果2.2 数据自适应迭代更新2.2.1 代价函数与迭代公式2.2.2 矩阵递归更新2.3 正则化…...

代购平台如何“说本地话,穿本地衣”

当海外消费者点开一个代购商城,看到满屏机械翻译的中式文案,他们大概率会默默关闭页面。还有数据显示,不符合本地审美的页面设计会导致70%的潜在客户流失,而专业的本地化改造能让订单转化率提升3倍以上。 01 AI翻译:让…...

C++调试(叁):编译qBreakpad并使用其生成Dump文件

目录 1.前言 2.生成Dump文件的第三方库 3.第三方库下载链接 4.编译qBreakpad 5.VS中使用qBreakpad 6.qBreakpad测试程序 前言 在第二篇文章中,我主要讲解了如何使用SetUnhandledExceptionFilter函数设置程序的异常回调,在设置的回调函数中调用MiniDumpWr…...

0基础 | STM32 | TB6612电机驱动使用

TB6612介绍及使用 单片机通过驱动板连接至电机 原因:单品机I/O口输出电流I小 驱动板:从外部引入高电压,控制电机驱动 电源部分 VM:电机驱动电源输入,输入电压范围建议为3.7~12V GND:逻辑电…...

Cycleresearcher:通过自动化评审改进自动化研究

1、引言 迄今为止,整个科学发现过程自动化的挑战在很大程度上仍未解决,特别是在生成和改进符合同行评审工作高标准的研究成果方面。此外,很少有工作涉及迭代反馈的整合,这对保持学术的健全性和新奇至关重要。当前的模型往往难以适…...

深入理解Redis SDS:高性能字符串的终极设计指南

📍 文章提示 10分钟掌握Redis核心字符串设计 | 从底层结构到源码实现,揭秘SDS如何解决C字符串七大缺陷,通过20手绘图示与可运行的C代码案例,助你彻底理解二进制安全、自动扩容等核心机制,文末附实战优化技巧&#xff…...

【tcp连接windows redis】

tcp连接windows redis 修改redis.conf 修改redis.conf bind * -::*表示禁用保护模式,允许外部网络连接 protected-mode no...

【AI平台】n8n入门6:调用MCP服务(非社区节点)

前言 前边用n8n搭建一个MCP服务,现在,用n8n调用其他服务商提供的MCP服务。本文以高德地图服务为例,记录一下操作过程。 实现案例功能 MCP是啥 MCP(Model Context Protocol,模型上下文协议)是由Anthropi…...

C++负载均衡远程调用学习之 Dns-Route关系构建

目录 1.LARS-DNS-MYSQL环境搭建 2.LARSDNS-系统整体模块的简单说明 3.Lars-Dns-功能说明 4.Lars-Dns-数据表的创建 5.Lars-Dns-整体功能说明 6.Lars-DnsV0.1-Route类的单例实现 7.Lars-DnsV0.1-Route类的链接数据库方法实现 8.Lars-DnsV0.1-定义存放RouteData关系的map数…...

Linux53 百度网盘运行(下载devtoolset11后仍提示stdc++3.0.29缺失 计划用docker容器隔离运行,计划后续再看)

算了 放弃 都用到docker了 计划先看看系统服务后续再研究吧 百度网盘运行(下载devtoolset11后仍提示stdc3.0.29缺失 计划用docker容器隔离运行 但是由于系统服务未扎实,计划后续再看 重新下了el7的版本 刚才已启动成功 单输入xlock不启动 切换用户也不启动 …...

ASP.NET MVC​ 入门与提高指南八

45. 神经形态计算与 MVC 应用性能革新 45.1 神经形态计算概念 神经形态计算是借鉴生物神经系统的结构和工作原理来设计计算系统。它模仿人脑神经元和突触的工作方式,具备低功耗、高并行性和自适应学习等特性,能在处理复杂感知和认知任务时展现出卓越的…...

Python刷题:流程控制(下)

今天刷的是PythonTip的Python 入门挑战中的题,整体难度不高,适合小白练手以及巩固知识点。下面会进行详细讲解。 每日一句 在无人问津的角落里, 默默努力的人独自发光, 孤独是他们奋斗路上的常客, 却也是成就他们的…...

【Bootstrap V4系列】学习入门教程之 组件-徽章(Badge)和面包屑导航(Breadcrumb)

Bootstrap V4系列 学习入门教程之 组件-徽章(Badge)和面包屑导航(Breadcrumb) 徽章(Badge)一、示例二、根据情境改变外观三、胶囊式徽章(Pill badges)四、链接 面包屑导航&#xff0…...

结合强化学习RL和SFT各自训练优势,让模型边学边练,从而平衡Zero-RL训练中的模仿和探索!!

摘要:最近在大型推理模型(LRMs)方面的进展表明,通过简单的基于规则的奖励进行强化学习(RL),可以涌现出复杂的行为,例如多步推理和自我反思。然而,现有的零强化学习&#…...

ai之paddleOCR 识别PDF python312和paddle版本冲突 GLIBCXX_3.4.30

这里写自定义目录标题 问题一**解决方案****方法 1:使用符号链接将系统库链接到 Conda 环境** **补充说明****验证修复结果** 问题二:**问题根源****解决方案****1. 确认 TensorRT 安装状态****2. 安装 TensorRT 并配置环境变量****3. 验证 TensorRT 与 …...

C++ 单例模式详解

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。 概念解析 单例模式的核心思想是: 限制类的实例化次数,确保在整个应用程序中只有一个实例存在 提供对该实例的全局访问点 控制共享…...