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 ...
随机推荐
- iOS开发笔记7:Text、UI交互细节、两个动画效果等
Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...
- javascript 如何访问 action或者controller 传给 jsp 页面的值
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...
- 关于nginx的限速模块
nginx 使用 ngx_http_limit_req_module和ngx_http_limit_conn_module 来限制对资源的请求 这种方法,对于CC攻击(Challenge Collap ...
- hdu 1542 Atlantis(线段树,扫描线)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 汇编中call printf参数压栈时错误理解
EAX, ECX,EDX,EBX均可以32bit,16bit,8bit访问,如下所示: <-------------------EAX------------------------>|& ...
- Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收
很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...
- cri-o 创建非infra容器
1.// cri-o/server/container.go // CreateContainer creates a new container in specified PodSandbox fu ...
- 基于go-ceph创建CEPH块设备及快照
一.代码执行前准备 1.系统中安装了CEPH集群 2.GOPATH目录下存在src/github.com/noahdesu/go-ceph代码库 3.在ubuntu 14.04下还需apt-get l ...
- 【读书笔记《Android游戏编程之从零开始》】17.游戏开发基础(游戏适屏的简述和作用、让游戏主角动起来)
1.游戏适屏的简述和作用 由于市面上安装 Android 系统的手机不断增多,出现了各种分辨率.各种屏幕尺寸的Android 系统手机.为了保证一个游戏或者一个软件能在所有的 Android 手机上正 ...
- 2014 Super Training #1 C Ice-sugar Gourd 模拟,扫描线
原题 HDU 3363 http://acm.hdu.edu.cn/showproblem.php?pid=3363 给你一个串,串中有H跟T两种字符,然后切任意刀,使得能把H跟T各自分为原来的一半. ...