前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python中的ORM

Python中的ORM

原创
作者头像
软件架构师Michael
发布于 2025-06-03 03:24:19
发布于 2025-06-03 03:24:19
8800
代码可运行
举报
运行总次数:0
代码可运行

在现代Web开发中,对象关系映射(ORM)技术已成为连接应用程序与数据库的关键桥梁。Python生态提供了多种优秀的ORM框架,其中SQLAlchemy以其强大的功能和对多种数据库的支持脱颖而出。本文将深入探讨使用SQLAlchemy操作SQL ServerMySQLPostgreSQL三大主流数据库的技术实践。

一、ORM核心优势与SQLAlchemy简介

ORM的核心价值在于:

  • 将数据库表映射为Python类
  • 将表字段映射为类属性
  • 将数据库操作转化为面向对象方法
  • 提供跨数据库的兼容性

SQLAlchemy作为Python最全面的ORM工具,包含两大核心组件:

  1. Core:提供SQL表达式语言和数据库连接
  2. ORM:高级对象映射层
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 安装SQLAlchemy及数据库驱动
pip install sqlalchemy
pip install pymysql      # MySQL
pip install psycopg2     # PostgreSQL
pip install pyodbc       # SQL Server

二、跨数据库连接配置

不同数据库的连接配置差异主要体现在连接字符串上:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from sqlalchemy import create_engine

# MySQL连接配置
mysql_engine = create_engine(
    "mysql+pymysql://user:password@localhost/mydb?charset=utf8mb4"
)

# PostgreSQL连接配置
postgres_engine = create_engine(
    "postgresql+psycopg2://user:password@localhost/mydb"
)

# SQL Server连接配置
mssql_engine = create_engine(
    "mssql+pyodbc://user:password@localhost/mydb?driver=ODBC+Driver+17+for+SQL+Server"
)

三、统一数据模型定义

SQLAlchemy的数据模型在不同数据库间保持高度一致性:

代码语言:txt
AI代码解释
复制
from sqlalchemy import Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False)
    email = Column(String(100), unique=True)
    created_at = Column(DateTime, server_default='CURRENT_TIMESTAMP')
    
    def __repr__(self):
        return f"<User(name='{self.name}', email='{self.email}')>"

四、数据库操作实例

1. 创建表结构
代码语言:txt
AI代码解释
复制
def create_tables(engine):
    Base.metadata.create_all(engine)

# 为所有数据库创建表
create_tables(mysql_engine)
create_tables(postgres_engine)
create_tables(mssql_engine)
2. 增删改查操作
代码语言:txt
AI代码解释
复制
# 创建会话工厂
Session = sessionmaker(bind=mysql_engine)  # 可替换为其他引擎

def crud_operations():
    with Session() as session:
        # 创建记录
        new_user = User(name="张三", email="zhangsan@example.com")
        session.add(new_user)
        session.commit()
        
        # 查询记录
        user = session.query(User).filter_by(name="张三").first()
        print(f"查询结果: {user}")
        
        # 更新记录
        user.email = "new_email@example.com"
        session.commit()
        
        # 删除记录
        session.delete(user)
        session.commit()
3. 事务管理
代码语言:txt
AI代码解释
复制
def transaction_demo():
    try:
        with Session() as session:
            user1 = User(name="李四", email="lisi@example.com")
            session.add(user1)
            
            # 触发唯一约束异常
            user2 = User(name="王五", email="lisi@example.com")
            session.add(user2)
            
            session.commit()
    except Exception as e:
        print(f"事务失败: {str(e)}")
        session.rollback()

五、数据库特定功能处理

虽然SQLAlchemy提供统一接口,但处理数据库差异时需注意:

1. 自增字段处理
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# SQL Server需要指定IDENTITY属性
if engine.dialect.name == 'mssql':
    id = Column(Integer, primary_key=True, autoincrement=True)
else:
    id = Column(Integer, primary_key=True)
2. 分页查询差异
代码语言:txt
AI代码解释
复制
# 标准分页查询
users = session.query(User).order_by(User.id).offset(10).limit(5).all()

# SQL Server需要特殊处理
if engine.dialect.name == 'mssql':
    users = session.query(User).order_by(User.id).offset(10).fetch(5).all()
3. JSON字段支持
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.types import JSON

# PostgreSQL
if engine.dialect.name == 'postgresql':
    metadata = Column(JSONB)
# MySQL 5.7+
elif engine.dialect.name == 'mysql':
    metadata = Column(JSON)
# SQL Server 2016+
elif engine.dialect.name == 'mssql':
    metadata = Column(JSON)

六、高级查询技巧

1. 复杂条件查询
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 多条件组合
from sqlalchemy import or_

results = session.query(User).filter(
    or_(
        User.name.like('张%'),
        User.email.contains('example')
    )
).order_by(User.created_at.desc()).all()
2. 聚合查询
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from sqlalchemy import func

# 按域名分组统计
email_domain = func.substring_index(User.email, '@', -1).label('domain')
result = session.query(
    email_domain,
    func.count(User.id)
).group_by(email_domain).all()
3. 关系映射(1对多)
代码语言:txt
AI代码解释
复制
class Address(Base):
    __tablename__ = 'addresses'
    
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('users.id'))
    street = Column(String(100))
    
    user = relationship("User", back_populates="addresses")

User.addresses = relationship("Address", order_by=Address.id, back_populates="user")

七、性能优化策略

  1. 批量操作
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 批量插入
session.bulk_save_objects([
    User(name=f"user{i}", email=f"user{i}@domain.com")
    for i in range(1000)
])
session.commit()
代码语言:python
代码运行次数:0
运行
AI代码解释
复制

engine = create_engine(
    "postgresql+psycopg2://user:pass@host/db",
    pool_size=10,
    max_overflow=5,
    pool_timeout=30
)

2.查询优化

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 使用selectinload避免N+1查询
from sqlalchemy.orm import selectinload

users = session.query(User).options(selectinload(User.addresses)).all()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
大厂案例 - 通用的三方接口调用方案设计(下)
生成签名(signature) 旨在确保请求的完整性、防止篡改和重放攻击。签名的生成主要通过参数排序、拼接和哈希算法来实现。
小小工匠
2024/05/26
7150
大厂案例 - 通用的三方接口调用方案设计(下)
公司来了个大神,三方接口调用方案设计的真优雅~~
在为第三方系统提供接口的时候,肯定要考虑接口数据的安全问题,比如数据是否被篡改,数据是否已经过时,数据是否可以重复提交等问题。
程序员蜗牛
2024/04/22
2.6K0
公司来了个大神,三方接口调用方案设计的真优雅~~
使用SpringBoot RestTemplate实现第三方接口对接
实现对接第三方接口,可以使用HttpClient(年岁较久),也可以使用SpringBoot RestTemplate(新生代)。可根据个人喜好选择适当的方式进行对接,相比较HttpClient个人推荐使用SpringBoot RestTemplate。
全栈程序员站长
2022/09/02
1.1K0
使用SpringBoot RestTemplate实现第三方接口对接
java如何调用第三方接口
最近在做一个项目,因一些机制问题,需要我用java代码调用第三方接口。因其接口使用的是@RequestBody注入访问对象的,@RequestBody接受收的是一个json格式的字符串,一定是一个字符串。类似于:
全栈程序员站长
2022/09/03
1.7K0
用TCC来解决多个第三方系统数据一致性问题
对于做集成的公司来说,会集成各种第三方系统,要么是通过第三方系统的api,要么直接集成第三方系统的设备。如果是通过api集成,单次请求只调用一个三方系统没问题,同步调用就行,但如果同时要调用多个三方系统,并且需要三方系统都成功的时候才算该次请求成功调用,这种情况只要后面调用的系统发生报错,前面系统如果不删除产生的数据,就会遗留在三方系统中,产生脏数据。这种集成的三方系统,不是我方能够控制的,我们不能修改他们的代码。
阿提说说
2024/09/06
1930
用TCC来解决多个第三方系统数据一致性问题
调用第三方接口大致流程
大家好,又见面了,我是你们的朋友全栈君。下面以风控为例,业务是调用第三方接口获取支付宝报告
全栈程序员站长
2022/09/05
6180
java对接第三方接口「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133282.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/27
2.7K0
java对接第三方接口「建议收藏」
WooCommerce对接第三方支付插件开发
process_payment($order_id) -> receipt_page($order) -> generate_form($order)
IT不难
2023/11/17
1.3K0
WooCommerce对接第三方支付插件开发
Facebook第三方登录流程总结
一些国际的软件/网站支持的比较多的第三方登录是Google第三方登录、Facebook第三方登录等。这里记录下Facebook第三方登录的过程。下面是一个Facebook第三方登录流程示例:
DannyHoo
2020/04/24
31.9K3
Facebook第三方登录流程总结
Java调用第三方接口示范
【1】准备工作:在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的restTemplate来调用,上面有调用接口的方法【分为Get和Post方式的有参和无参调用】:
全栈程序员站长
2022/08/10
8950
Java调用第三方接口示范
大厂案例 - 通用的三方接口调用方案设计(上)
在为第三方系统提供接口时,关键是确保数据的完整性、安全性和防止重复提交。以下是一个基于API密钥(Access Key/Secret Key)和回调机制的设计方案,具有多层次的安全保障。
小小工匠
2024/05/26
4.5K0
大厂案例 - 通用的三方接口调用方案设计(上)
Java调用第三方接口(http总结)
如果有一些jar包找不到,(不是maven管理需要自己下载)有时候有各种问题,或者墙或者找不到之类,可以通过创建一个maven空项目,添加pom依赖,然后下载,在pom仓库里找到即可用。
全栈程序员站长
2022/08/31
3.2K0
Java Http 接口对接太繁琐?试试 UniHttp 框架吧
从企业级项目来说,如果你项目里还在用传统的编程式Http客户端比如HttpClient、Okhttp去直接对接第三方Http接口, 那么你项目一定充斥着大量的对接逻辑和代码,并且针对不同的对接渠道方需要每次封装一次调用的简化,一旦封装不好系统将会变得难以维护,难以阅读,甚至不同的开发同学会用自己的方式用不同的Http客户端用不同的封装逻辑去对接接口,这种情况一般发生于项目换了维护者,技术负责人也没把控代码质量和规范所导致
程序员皮皮林
2024/10/17
2280
Java Http 接口对接太繁琐?试试 UniHttp 框架吧
自动化接口用例从 1 到 1000 过程中的实践和思考
顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscript,
顾翔
2019/12/12
6830
自动化接口用例从 1 到 1000 过程中的实践和思考
三方接口调用设计方案
为保障三方接口的安全性,可采取多方面措施,包括使用 HTTPS 协议确保数据传输安全,利用 AK 和签名进行身份验证以及对请求验签来防止非法请求与重放攻击,还有对敏感数据进行加密传输等。不过具体实现细节会因项目需求而存在差异,并且在实际开发中,还需兼顾错误处理、异常情况处理以及日志记录等方面内容。
用户1142828
2024/12/08
2030
作为测试,你了解第三方支付吗?
在很多平台都是调用第三方支付平台,比如支付宝,微信,银联电子支付等。你是否真的了解第三方支付呢?
可可的测试小栈
2023/01/18
9520
第三方API对接如何设计接口认证?
在与第三方系统做接口对接时,往往需要考虑接口的安全性问题,本文主要分享几个常见的系统之间做接口对接时的认证方案。
陶陶技术笔记
2021/07/23
2.7K0
第三方API对接如何设计接口认证?
第三方微信授权登录APP接入_使用第三方应用打开是什么意思
在微信开放平台 https://open.weixin.qq.com/ 注册成为开发者,具体步骤略
全栈程序员站长
2022/09/20
1.5K0
第三方微信授权登录APP接入_使用第三方应用打开是什么意思
如何更优雅地对接第三方API
本文所有示例完整代码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/third
用户1148394
2019/12/31
4K0
7.Android常用第三方支付
移动支付 用户使用移动的终端完成对所购买商品或者服务的支付功能;分为近场支付(蓝牙支付,刷卡,滴卡),和远程支付(网上支付,短信支付) app支付模块 常见的支付厂商-->常见的支付方式 支付宝:阿
六月的雨
2018/05/14
1.8K0
推荐阅读
相关推荐
大厂案例 - 通用的三方接口调用方案设计(下)
更多 >
目录
  • 一、ORM核心优势与SQLAlchemy简介
  • 二、跨数据库连接配置
  • 三、统一数据模型定义
  • 四、数据库操作实例
    • 1. 创建表结构
    • 2. 增删改查操作
    • 3. 事务管理
  • 五、数据库特定功能处理
    • 1. 自增字段处理
    • 2. 分页查询差异
    • 3. JSON字段支持
  • 六、高级查询技巧
    • 1. 复杂条件查询
    • 2. 聚合查询
    • 3. 关系映射(1对多)
  • 七、性能优化策略
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档