高级爬虫技巧:处理JavaScript渲染(Selenium)

SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式。本文将介绍如何使用SQLAlchemy ORM进行数据库操作。

目录

  1. 安装SQLAlchemy
  2. 核心概念
  3. 连接数据库
  4. 定义数据模型
  5. 创建数据库表
  6. 基本CRUD操作
  7. 查询数据
  8. 关系操作
  9. 事务管理
  10. 最佳实践

安装

bash

pip install sqlalchemy

如果需要连接特定数据库,还需安装相应的驱动程序:

bash

# PostgreSQL pip install psycopg2-binary # MySQL pip install mysql-connector-python # SQLite (Python标准库已包含,无需额外安装)

核心概念

  • Engine:数据库连接的引擎,负责与数据库通信
  • Session:数据库会话,管理所有持久化操作
  • Model:数据模型类,对应数据库中的表
  • Query:查询对象,用于构建和执行数据库查询

连接数据库

python

from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker # 创建数据库连接引擎 # SQLite示例 engine = create_engine('sqlite:///example.db', echo=True) # PostgreSQL示例 # engine = create_engine('postgresql://username:password@localhost:5432/mydatabase') # MySQL示例 # engine = create_engine('mysql+mysqlconnector://username:password@localhost:3306/mydatabase') # 创建会话工厂 SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) # 创建会话实例 session = SessionLocal()

定义数据模型

python

from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship, declarative_base # 创建基类 Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True, index=True) name = Column(String(50), nullable=False) email = Column(String(100), unique=True, index=True) # 定义一对多关系 posts = relationship("Post", back_populates="author") class Post(Base): __tablename__ = 'posts' id = Column(Integer, primary_key=True, index=True) title = Column(String(100), nullable=False) content = Column(String(500)) author_id = Column(Integer, ForeignKey('users.id')) # 定义多对一关系 author = relationship("User", back_populates="posts") # 定义多对多关系(通过关联表) tags = relationship("Tag", secondary="post_tags", back_populates="posts") class Tag(Base): __tablename__ = 'tags' id = Column(Integer, primary_key=True, index=True) name = Column(String(30), unique=True, nullable=False) posts = relationship("Post", secondary="post_tags", back_populates="tags") # 关联表(用于多对多关系) class PostTag(Base): __tablename__ = 'post_tags' post_id = Column(Integer, ForeignKey('posts.id'), primary_key=True) tag_id = Column(Integer, ForeignKey('tags.id'), primary_key=True)

创建数据库表

python

# 创建所有表 Base.metadata.create_all(bind=engine) # 删除所有表 # Base.metadata.drop_all(bind=engine)

基本CRUD操作

创建数据

python

# 创建新用户 new_user = User(name="张三", email="[email protected]") session.add(new_user) session.commit() # 批量创建 session.add_all([ User(name="李四", email="[email protected]"), User(name="王五", email="[email protected]") ]) session.commit()

读取数据

python

# 获取所有用户 users = session.query(User).all() # 获取第一个用户 first_user = session.query(User).first() # 根据ID获取用户 user = session.query(User).get(1)

更新数据

python

# 查询并更新 user = session.query(User).get(1) user.name = "张三四" session.commit() # 批量更新 session.query(User).filter(User.name.like("张%")).update({"name": "张氏"}, synchronize_session=False) session.commit()

删除数据

python

# 查询并删除 user = session.query(User).get(1) session.delete(user) session.commit() # 批量删除 session.query(User).filter(User.name == "李四").delete(synchronize_session=False) session.commit()

查询数据

基本查询

python

# 获取所有记录 users = session.query(User).all() # 获取特定字段 names = session.query(User.name).all() # 排序 users = session.query(User).order_by(User.name.desc()).all() # 限制结果数量 users = session.query(User).limit(10).all() # 偏移量 users = session.query(User).offset(5).limit(10).all()

过滤查询

python

from sqlalchemy import or_ # 等值过滤 user = session.query(User).filter(User.name == "张三").first() # 模糊查询 users = session.query(User).filter(User.name.like("张%")).all() # IN查询 users = session.query(User).filter(User.name.in_(["张三", "李四"])).all() # 多条件查询 users = session.query(User).filter( User.name == "张三", User.email.like("%@example.com") ).all() # 或条件 users = session.query(User).filter( or_(User.name == "张三", User.name == "李四") ).all() # 不等于 users = session.query(User).filter(User.name != "张三").all()

聚合查询

python

from sqlalchemy import func # 计数 count = session.query(User).count() # 分组计数 user_post_count = session.query( User.name, func.count(Post.id) ).join(Post).group_by(User.name).all() # 求和、平均值等 avg_id = session.query(func.avg(User.id)).scalar()

连接查询

python

# 内连接 results = session.query(User, Post).join(Post).filter(Post.title.like("%Python%")).all() # 左外连接 results = session.query(User, Post).outerjoin(Post).all() # 指定连接条件 results = session.query(User, Post).join(Post, User.id == Post.author_id).all()

关系操作

python

# 创建带关系的对象 user = User(name="赵六", email="[email protected]") post = Post(title="我的第一篇博客", content="Hello World!", author=user) session.add(post) session.commit() # 通过关系访问 print(f"文章 '{post.title}' 的作者是 {post.author.name}") print(f"用户 {user.name} 的所有文章:") for p in user.posts: print(f" - {p.title}") # 多对多关系操作 python_tag = Tag(name="Python") sqlalchemy_tag = Tag(name="SQLAlchemy") post.tags.append(python_tag) post.tags.append(sqlalchemy_tag) session.commit() print(f"文章 '{post.title}' 的标签:") for tag in post.tags: print(f" - {tag.name}")

事务管理

python

# 自动提交事务 try: user = User(name="测试用户", email="[email protected]") session.add(user) session.commit() except Exception as e: session.rollback() print(f"发生错误: {e}") # 使用事务上下文管理器 from sqlalchemy.orm import Session def create_user(session: Session, name: str, email: str): try: user = User(name=name, email=email) session.add(user) session.commit() return user except: session.rollback() raise # 嵌套事务 with session.begin_nested(): user = User(name="事务用户", email="[email protected]") session.add(user) # 保存点 savepoint = session.begin_nested() try: user = User(name="保存点用户", email="[email protected]") session.add(user) savepoint.commit() except: savepoint.rollback()

最佳实践

  1. 会话管理:为每个请求创建新会话,请求结束后关闭
  2. 异常处理:始终处理异常并适当回滚事务
  3. 延迟加载:注意N+1查询问题,使用 eager loading 优化
  4. 连接池:合理配置连接池大小和超时设置
  5. 数据验证:在模型层或应用层验证数据完整性

python

# 使用上下文管理器管理会话 from contextlib import contextmanager @contextmanager def get_db(): db = SessionLocal() try: yield db db.commit() except Exception: db.rollback() raise finally: db.close() # 使用示例 with get_db() as db: user = User(name="上下文用户", email="[email protected]") db.add(user)

总结

SQLAlchemy ORM提供了强大而灵活的数据库操作方式,通过本文的介绍,您应该能够:

  1. 安装和配置SQLAlchemy
  2. 定义数据模型和关系
  3. 执行基本的CRUD操作
  4. 构建复杂查询
  5. 管理数据库事务
  6. 遵循最佳实践

SQLAlchemy还有更多高级特性,如混合属性、事件监听、自定义查询等,值得进一步探索学习。

Read more

Pi0机器人VLA大模型在昇腾A2平台上的测评

Pi0机器人VLA大模型在昇腾A2平台上的测评

Pi0机器人VLA大模型在昇腾A2平台上的测评文档 * 写在最前面 🌈你好呀!我是 是Yu欸🚀 感谢你的陪伴与支持~ 欢迎添加文末好友🌌 在所有感兴趣的领域扩展知识,不定期掉落福利资讯(*^▽^*) 写在最前面 版权声明:本文为原创,遵循 CC 4.0 BY-SA 协议。转载请注明出处。 随着人工智能技术的持续神户以及人形机器人产业的快速发展,算力在提升机器人运动控制精度、实时响应能力与智能化水平方面的作用日益凸显。为实现降本增效,国产化算力代替需求不断攀升,本文基于国产化适配的 Pi0机器 VLA大模型,在昇腾 Atlas 800I A2服务器上完成部署与测试,结果表明:该模型在推理性能、推理精度及功能完整性等方面,不仅实现了与英伟达同级别硬件相当的算力表现,更在部分场景下表现出更优的运行效率。 这一成果充分表明:经过深度适配的国产大模型与国产算力平台,已具备支撑高端人形机器人智能化发展的核心技术能力。国产算力在人形机器人领域的应用场景广阔,正加速迈向自主可控、高效可靠的全新阶段。 一、测评概述 1.1 测试目的 本测评旨在验证Pi0机器人视觉

By Ne0inhk
低代码赋能培训管理:智能化管控全流程,助力企业人才成长

低代码赋能培训管理:智能化管控全流程,助力企业人才成长

在企业数字化转型浪潮中,人才成为核心竞争力,培训管理作为人才培育的关键环节,其效率与质量直接影响企业发展步伐。传统培训模式的诸多痛点,让企业迫切需要一套高效、智能的系统化解决方案,而低代码平台的出现,正为培训管理数字化升级提供了便捷路径。 人才与数字化双重诉求 企业人才发展需求 市场环境不断变化,业务持续迭代,企业对员工技能提出了更高要求。通过科学的培训管理,既能提升员工专业能力、改善工作绩效,也能为组织发展注入动力,实现人才与企业的共同成长。但传统培训模式存在资源浪费、效果难以保障、流程繁琐等问题,亟需一套系统化方案打破困境,提升培训效率与质量。 数字化转型与数据驱动 数字化转型已成为企业发展的必然趋势,培训管理作为人力资源管理的重要组成部分,数字化升级势在必行。企业需要通过数字化工具实现培训全流程管控,更需要依托数据分析精准评估培训效果、优化培训计划,为培训决策提供科学的数据支撑,让培训真正贴合业务需求。 低代码构建智能培训体系 系统简介 基于低代码平台构建的培训管理系统,专为企业实际需求设计,集成培训管理、考核评价等核心模块,实现培训全流

By Ne0inhk
2026 开源 LLM 新标杆:Nvidia Nemotron 3 Super 架构全解析,兼顾精度与效率的 Agent 原生底座

2026 开源 LLM 新标杆:Nvidia Nemotron 3 Super 架构全解析,兼顾精度与效率的 Agent 原生底座

2026 年,开源大语言模型的竞争早已脱离了 “堆参数量、刷榜单” 的粗放式增长阶段。随着 Agentic AI、本地部署、企业级私有化应用的需求全面爆发,行业的核心痛点已经发生了根本转变:开发者与企业不再需要一个 “只有精度好看,却跑不起、用不起、延迟崩” 的纸面 SOTA 模型,而是需要一个精度对标同级旗舰、推理吞吐拉满、延迟可控、硬件友好、能真正落地到生产级场景的实用型模型。 就在这样的行业背景下,Nvidia 推出了全新的开源权重大模型 Nemotron 3 Super (120B-A12B),交出了一份堪称完美的答卷。它在主流基准测试中精度完全对标同级旗舰 Qwen3.5 122B 与 GPT-OSS 120B,却实现了 NVFP4 精度下较 GPT-OSS 2.2 倍、bf16 精度下较 Qwen3.

By Ne0inhk
Spring Boot 自动配置源码解析:从 @EnableAutoConfiguration 到条件化 Bean 注册

Spring Boot 自动配置源码解析:从 @EnableAutoConfiguration 到条件化 Bean 注册

文章目录 * Spring Boot 自动配置源码解析:从 @EnableAutoConfiguration 到条件化 Bean 注册 * 一、自动配置 vs 自动装配:概念澄清 * 二、入口:@SpringBootApplication 注解解析 * 三、核心机制:AutoConfigurationImportSelector 工作流程 * 1. `selectImports()` —— 返回需导入的配置类全限定名 * 2. `getAutoConfigurationEntry()` —— 加载并过滤候选配置 * 3. `getCandidateConfigurations()` —— 从 spring.factories 读取 * 四、条件化加载:@Conditional 系列注解 * 五、代码示例:自定义 Starter 与自动配置 * 场景:开发一个 `sms-spring-boot-starter` * 步骤 1:定义自动配置类 * 步骤

By Ne0inhk