python SQLAlchemy的Mapping与Declarative详解


Posted in Python onJuly 04, 2019

前面介绍过vSQLAlchemy中的 Engine 和 Connection,这两个对象用在row SQL (原生的sql语句)上操作,而 ORM(Object Relational Mapper)则是一种用面向对象的思维来操作表数据的技术。所谓ORM 就是Python 对象到数据表的一种映射关系。

以前 SQLAlchemy 是怎么把Python对象和数据库中表里面的每条记录进行映射的呢?通过一个mapping函数

先来看个例子:

from sqlalchemy import Table, MetaData, Column, Integer, String,
from sqlalchemy.orm import mapper

# 数据库的元数据,你可以认为它是一个容器,装载了所有的表结构
metadata = MetaData()

# 数据库中的news_article表
article = Table("news_article", metadata,
        Column("id", Integer, primary_key=True),
        Column("title", String)
        )

# 这是一个普通的Article类
class Article:
  def __init__(self, title):
    self.title = title

# 通过mapper函数进行映射关联
mapper(Article, article)

关联后怎么使用呢?看例子:

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
# 通过Artcile类来查询id==4554的记录,这完全是用面向对象的方式执行sql了
# 返回结果就是Article的实例对象
result = session.query(Article).filter(Article.id==4554).first()
print(result.id) # 4554
print(result.title) # xxxxxxxxx

mapper 函数进行映射后,通过query查询返回的结果,会自动将返回结果构造成一个Article对象,并拥有了id 属性,这就是ORM的魔力所在。

而新的ORM映射不需要手动通过mapping函数来关联table与类之间的关系,可以直接通过声明(Declarative )系统(我不知道这样翻译对不对)来定义一个类,这个类会直接映射到数据库的表,declarative 把 Table、mapper、还有类这三者放在一块进行声明,从而实现了ORM的映射。来看例子:

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Article(Base):
  __tablename__ = 'news_article'
  id = Column(Integer, primary_key=True)
  title = Column(String(50))

是不是简单很多了,没有了Table的定义,没有mapper函数,只有一个类的定义,这个类必须继承基类 Base,Base 就是我们的声明系统,这样就完成了Table与类之间的映射关系,而背后的操作都是通过一个declarative_base 工厂方法构造的声明系统完成的。

我们把 Article 又称之为映射类,这个类持有 Table 和 mapper 函数的引用。

>>> print(Article.__table__)
news_article

>>>print(Article.__mapper__)
Mapper|Article|news_article

# 前面将的metadata 可以通过 Base 获取
>>>print(Base.metadata)
MetaData(bind=None)

MetaData 有什么用的?可以通过它来创建表或者删除表。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python通过pil将图片转换成黑白效果的方法
Mar 16 Python
Python fileinput模块使用实例
May 28 Python
Python读取Excel的方法实例分析
Jul 11 Python
Python中使用支持向量机SVM实践
Dec 27 Python
python3.x上post发送json数据
Mar 04 Python
python smtplib模块实现发送邮件带附件sendmail
May 22 Python
python定向爬虫校园论坛帖子信息
Jul 23 Python
pycharm 批量修改变量名称的方法
Aug 01 Python
Python3 列表,数组,矩阵的相互转换的方法示例
Aug 05 Python
解决python 找不到module的问题
Feb 12 Python
Python Excel vlookup函数实现过程解析
Jun 22 Python
python使用建议与技巧分享(一)
Aug 17 Python
pandas分区间,算频率的实例
Jul 04 #Python
Django中信号signals的简单使用方法
Jul 04 #Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
Jul 04 #Python
pybind11和numpy进行交互的方法
Jul 04 #Python
pandas计算最大连续间隔的方法
Jul 04 #Python
python SQLAlchemy 中的Engine详解
Jul 04 #Python
Python Pandas实现数据分组求平均值并填充nan的示例
Jul 04 #Python
You might like
thinkPHP订单数字提醒功能的实现方法
2016/12/01 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
2019/03/22 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
javascript十个最常用的自定义函数(中文版)
2009/09/07 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
基于jQuery Ajax实现上传文件
2016/03/24 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
jquery.qtip提示信息插件用法简单实例
2016/06/17 Javascript
JS跨域交互(jQuery+php)之jsonp使用心得
2016/07/01 Javascript
浅谈js中对象的使用
2016/08/11 Javascript
js实现的简练高效拖拽功能示例
2016/12/21 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
jsonp跨域请求详解
2017/07/13 Javascript
使用use注册Vue全局组件和全局指令的方法
2018/03/08 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
前端vue-cli项目中使用img图片和background背景图的几种方法
2019/11/13 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
详解Python的Flask框架中生成SECRET_KEY密钥的方法
2016/06/07 Python
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
浅谈Python中的bs4基础
2018/10/21 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
2019/06/03 Python
Python实现计算对象的内存大小示例
2019/07/10 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
移动端Web页面的CSS3 flex布局快速上手指南
2016/05/31 HTML / CSS
Linden Leaves官网:新西兰纯净护肤品
2020/12/20 全球购物
秋季运动会广播稿大全
2014/02/17 职场文书
《七颗钻石》教学反思
2014/02/28 职场文书
旅游市场营销方案
2014/03/09 职场文书
2014年财务工作自我评价
2014/09/23 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
2014年幼儿园个人工作总结
2014/11/10 职场文书
2014年医德医风工作总结
2014/11/13 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
一定要知道的 25 个 Vue 技巧
2021/11/02 Vue.js
Typescript类型系统FLOW静态检查基本规范
2022/05/25 Javascript