sqlalchemy 的 ORM 方式使用示例
2024-10-15 20:23:19
知乎: 使用 sqlalchemy 的 orm 方式操作数据库是一种怎样的体验?
答: 酸爽!
本文基于:win10 + python3.4 + sqlAlchemy 1.0.13
先看一个图(来源):
这是 sqlalchemy 的层级图。不难发现,其中 orm 是最顶级的封装。
ORM 基本操作步骤如下:
1. 建立连接
from sqlalchemy import create_engine engine = create_engine('sqlite:///:memory:', echo=True)
2. 建立会话
from sqlalchemy.orm import Session session = Session(engine)
3. 声明基类
from sqlalchemy.ext.declarative import declarative_base Base = declarative_base()
4. 定义表(继承基类)
from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship class Parent(Base):
__tablename__ = 'parent' id = Column(Integer, primary_key=True) children = relationship("Child") def __repr__(self):
return "<Parent(id='{}', children='{}')>".format(self.id, self.children) class Child(Base):
__tablename__ = 'child' id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parent.id')) def __repr__(self):
return "<Child(id='{}', parent_id='{}')>".format(self.id, self.parent_id)
5. 生成表
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine) # 生产环境只需运行一次!!!!
6. 添加记录
session.add_all([Parent(children=[Child() for j in range(5)]) for i in range(2)])
session.commit()
7. 查询
# 懒加载 (lazyload)
# load everything, no eager loading.
for parent in session.query(Parent):
print(parent.children) # 联合加载 (joinedload)
# load everything, joined eager loading.
for parent in session.query(Parent).options(joinedload("children")):
parent.children # 子查询加载 (subqueryload)
# load everything, subquery eager loading.
for parent in session.query(Parent).options(subqueryload("children")):
parent.children
8. 完整代码
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.orm import joinedload, subqueryload # 建立连接
engine = create_engine('sqlite:///:memory:', echo=True) # 建立会话
session = Session(engine) # 声明基类
Base = declarative_base() # 定义表(继承基类)
class Parent(Base):
__tablename__ = 'parent' id = Column(Integer, primary_key=True) children = relationship("Child") def __repr__(self):
return "<Parent(id='{}', children='{}')>".format(self.id, self.children) class Child(Base):
__tablename__ = 'child' id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parent.id')) def __repr__(self):
return "<Child(id='{}', parent_id='{}')>".format(self.id, self.parent_id) # 生成表
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine) # 生产环境只需运行一次!!!! # 添加记录
session.add_all([Parent(children=[Child() for j in range(5)]) for i in range(2)])
session.commit() # 查询
# lazyload
# load everything, no eager loading.
for parent in session.query(Parent):
print(parent.children) # joinedload
# load everything, joined eager loading.
for parent in session.query(Parent).options(joinedload("children")):
parent.children # subqueryload
# load everything, subquery eager loading.
for parent in session.query(Parent).options(subqueryload("children")):
parent.children
最新文章
- 工业串口和网络软件通讯平台(SuperIO 2.1)更新发布
- GJM : 数据结构学习笔记
- 使用SSIS汇集监控数据
- HTML 学习笔记(URL)
- JAVAMAIL手动发送邮件
- Python【第一篇】基础介绍
- Scrum三头猪
- 获取Storyboard中的视图控制器
- sh脚本异常,binsh^M bad interpreter No such file or directory
- 一个优化极点的ViewHolder
- 移动端click事件300ms延迟
- Python:Day15 函数
- C++定义字符数组
- input输入框添加内部图标
- vector向量容器(常用的使用方法总结)
- NSValue的valueWithBytes:objCType:方法
- jquery ajax 传数据到后台乱码的处理方法
- Hbase 学习笔记2----概念
- Android 进阶9:进程通信之 AIDL 解析
- java instrumentation &;JVMTI
热门文章
- 找不到或无法加载主类 org.codehaus.plexus.classworlds.launcher.Launcher
- Objective-C 代码规范(Code Style)
- iOS开发之网络数据解析(一)--JSON解析简介
- 大数据公益课堂成就你高薪之梦,30W,50W,100W...
- python模块调用
- 8种Nosql数据库系统对比
- MongodbBackup Script
- ls文件与目录检视,文件内容查阅
- 动手学习TCP:TCP连接建立与终止
- NOIP2008 普及组T2 排座椅 解题报告-S.B.S