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函数返回多个值的示例方法
Dec 04 Python
Python3学习urllib的使用方法示例
Nov 29 Python
python列表,字典,元组简单用法示例
Jul 11 Python
python 判断三个数字中的最大值实例代码
Jul 24 Python
Python中断多重循环的思路总结
Oct 04 Python
Python for循环及基础用法详解
Nov 08 Python
详解PyQt5信号与槽的几种高级玩法
Mar 24 Python
django 实现手动存储文件到model的FileField
Mar 30 Python
Python使用configparser读取ini配置文件
May 25 Python
Numpy 多维数据数组的实现
Jun 18 Python
Python计算矩阵的和积的实例详解
Sep 10 Python
Python实现自动装机功能案例分析
Oct 22 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模型详解
2015/07/27 PHP
刷新PHP缓冲区为你的站点加速
2015/10/10 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
Yii框架页面渲染操作实例详解
2019/07/19 PHP
Aster vs KG BO3 第一场2.18
2021/03/10 DOTA
用js实现的检测浏览器和系统的函数
2009/04/09 Javascript
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
JavaScript 变量作用域分析
2011/07/04 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
nodejs命令行参数处理模块commander使用实例
2014/09/17 NodeJs
js实现九宫格图片半透明渐显特效的方法
2015/02/16 Javascript
jQuery unbind 删除绑定事件详解
2016/05/24 Javascript
JavaScript实现256色转灰度图
2017/02/22 Javascript
jQuery初级教程之网站品牌列表效果
2017/08/02 jQuery
webpack学习笔记之优化缓存、合并、懒加载
2017/08/24 Javascript
JS实现图片手风琴效果
2020/04/17 Javascript
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
vue中如何实现后台管理系统的权限控制的方法示例
2018/09/19 Javascript
JavaScript实现的拼图算法分析
2019/02/13 Javascript
解决ele ui 表格表头太长问题的实现
2019/11/13 Javascript
[50:17]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
简单介绍Python中的readline()方法的使用
2015/05/24 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
Python实现爬取马云的微博功能示例
2019/02/16 Python
使用Python将Mysql的查询数据导出到文件的方法
2019/02/25 Python
python3使用matplotlib绘制散点图
2019/03/19 Python
在django admin中配置搜索域是一个外键时的处理方法
2020/05/20 Python
如何快速理解python的垃圾回收机制
2020/09/01 Python
scrapy结合selenium解析动态页面的实现
2020/09/28 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
Wiggle新西兰:自行车、跑步、游泳
2020/05/06 全球购物
党员活动总结
2015/02/04 职场文书
永远是春天观后感
2015/06/12 职场文书
校园安全主题班会
2015/08/12 职场文书
情侣餐厅的创业计划书范本!
2019/07/26 职场文书