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实现的一只从百度开始不断搜索的小爬虫
Aug 13 Python
python数据结构之二叉树的统计与转换实例
Apr 29 Python
Python内置模块turtle绘图详解
Dec 09 Python
python版本单链表实现代码
Sep 28 Python
在python中实现强制关闭线程的示例
Jan 22 Python
Python当中的array数组对象实例详解
Jun 12 Python
python调用自定义函数的实例操作
Jun 26 Python
Python的matplotlib绘图如何修改背景颜色的实现
Jul 16 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
Oct 25 Python
关于Python字符串显示u...的解决方式
Mar 06 Python
Python用dilb提取照片上人脸的示例
Oct 26 Python
Anaconda的安装与虚拟环境建立
Nov 18 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
PHP网页游戏学习之Xnova(ogame)源码解读(五)
2014/06/23 PHP
PHP curl使用实例
2015/07/02 PHP
PHP实现搜索相似图片
2015/09/22 PHP
php简单实现多语言切换的方法
2016/05/09 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
2016/10/18 PHP
PHP实现接收二进制流转换成图片的方法
2017/01/10 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
2017/05/20 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
PHP实现的支付宝支付功能示例
2019/03/26 PHP
javascript RadioButtonList获取选中值
2009/04/09 Javascript
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
js 键盘记录实现(兼容FireFox和IE)
2010/02/07 Javascript
Javascript计算时间差的函数分享
2011/07/04 Javascript
修复IE9&safari 的sort方法
2011/10/21 Javascript
Bootstrap每天必学之表单
2015/11/23 Javascript
Vue组件BootPage实现简单的分页功能
2016/09/12 Javascript
深入研究jQuery图片懒加载 lazyload.js使用方法
2017/08/16 jQuery
Angular2.0/4.0 使用Echarts图表的示例代码
2017/12/07 Javascript
webpack之devtool详解
2018/02/10 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
基于jquery实现彩色投票进度条代码解析
2020/08/26 jQuery
[01:48]帕吉至宝加入游戏,遗迹战场现“千劫神屠”
2018/04/07 DOTA
详解Python的迭代器、生成器以及相关的itertools包
2015/04/02 Python
Django接受前端数据的几种方法总结
2016/11/04 Python
python3连接MySQL数据库实例详解
2018/05/24 Python
树莓派使用USB摄像头和motion实现监控
2019/06/22 Python
python之拟合的实现
2019/07/19 Python
pytorch数据预处理错误的解决
2020/02/20 Python
基于python检查SSL证书到期情况代码实例
2020/04/04 Python
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
党支部承诺书
2015/01/20 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
画展观后感
2015/06/17 职场文书
在人间读书笔记
2015/06/30 职场文书
Python3 多线程(连接池)操作MySQL插入数据
2021/06/09 Python
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
2021/10/05 Javascript