sqlalchemy 的 ORM 方式使用示例
知乎: 使用 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
sqlalchemy 的 ORM 方式使用示例的更多相关文章
- sqlalchemy 的 Core 方式使用示例
知乎: sqlalchemy 的 Core 方式操作数据是一种怎样的体验? 答: 爽! 本文基于:win 10 + python 3.4 + sqlalchemy 1.0.13 基本步骤如下: 1. ...
- 使用sqlalchemy用orm方式写pipeline将scrapy item快速存入 MySQL
传统的使用scrapy爬下来的数据存入mysql,用的是在pipeline里用pymysql存入数据库, 这种方法需要写sql语句,如果item字段数量非常多的 情况下,编写起来会造成很大的麻烦. 我 ...
- sqlalchemy 的 ORM 与 Core 混合方式使用示例
知乎: sqlalchemy 的 ORM 与 Core 混合方式操作数据库是一种怎样的体验? 答: 酸! 本文基于:win 10 + python 3.4 + sqlalchemy 1.0.13 基本 ...
- SQLAlchemy的ORM
表关系: 表之间的关系存在三种:一对一.一对多.多对多.而SQLAlchemy中的ORM也可以模拟这三种关系.因为一对一其实在SQLAlchemy中底层是通过一对多的方式模拟的,所以先来看下一对多的关 ...
- SQLAlchemy(1) -- Python的SQLAlchemy和ORM
Python的SQLAlchemy和ORM(object-relational mapping:对象关系映射) web编程中有一项常规任务就是创建一个有效的后台数据库.以前,程序员是通过写sql语句, ...
- JAVA代理方式使用示例总结
JAVA代理方式使用示例总结 一. 代理方式概括 Java的代理方式主要包含了静态代理,动态代理两种方式,其中,动态代理根据实现的方式不同,又可以划分为jdk动态代理和cglib动态代理. 二. ...
- sqlalchemy 的 raw sql 方式使用示例
#获取数据库 from sqlalchemy import create_engine db = create_engine("sqlite:///:memory:", echo= ...
- SQLAlchemy(ORM框架)
SQLAlchemy SQLAlchemy概述 2 3 4 5 6 7 8 9 10 11 12 13 MySQL-Python mysql+mysqldb://<user>:&l ...
- SQLALchemy之ORM操作
1.仍然要创建引擎 2.创建session会话 (1)方式一 engine =create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s ...
随机推荐
- Java从零开始学四十四(多线程)
一.进程与线程 1.1.进程 进程是应用程序的执行实例. 进程是程序的一次动态执行过程,它经历了从代码加载.执行到执行完毕的一个完整过程,这个过程也是进程本身从产生.发展到最终消亡的过程 特征: 动态 ...
- Android源码分析之SparseArray
本来接下来应该分析MessageQueue了,可是我这几天正好在实际开发中又再次用到了SparseArray(之前有用到过一次,那次只是 大概浏览了下源码,没做深入研究),于是在兴趣的推动下,花了些时 ...
- Effective Java 67 Avoid excessive synchronization
Principle To avoid liveness and safety failures, never cede control to the client within a synchroni ...
- 读书摘要:第七章 闩Suan锁和自旋锁
摘要: 1.闩锁就像是内存上的锁,随着越来越多的线程参与进来,他们争相访问同一块内存,导致堵塞.2.自旋锁就是闩锁,不同之处是如果访问的内存不可用,它将继续检查轮询一段时间.3.拴锁和自旋锁是我们无法 ...
- 一个SharePoint定时器 (SPJobDefinition)
需要写一个自定义的sharepoint timer job, 目的是要定时到Site Collection Images这个List里检查图片的过期日期,如果即将过期的话,需要发送email到相关的人 ...
- Java解决题目:有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生一对兔子。。。
题目:有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生一对兔子,假如兔子都不死,问M个月时兔子的数量,M为键盘读入的正整数.(请用Java语言作答) 样例输入: 3 样 ...
- Cocos2d-x解析XML文件,解决中文乱码
身处大天朝,必须学会的一项技能就是解决中文显示问题.这个字符问题还搞了我一天,以下是个人解决乱码问题的实践结果,希望可以给其他人一些帮助 读取xml文件代码: CCDictionary* messag ...
- jQuery form插件的使用--ajaxForm()和ajaxSubmit()的可选参数项对象
一.前提说明 Form Plugin API 里提供了很多有用的方法可以让你轻松的处理表单里的数据和表单的提交过程. 测试环境:部署到Tomcat中的web项目. 二.简单介绍 本文演示的是:jQue ...
- jmeter接口测试教程
一.Jmeter接口测试步骤: 1.添加线程组
- Linux系统之用户、群组和权限
一.用户管理 创建用户时,系统为用户分配一个唯一的编号UID,同时为用户创建一个同名的组,并为组分配一个编号GID,并把该用户加入该组中. 系统规定: uid: 0 特权用户 u ...