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发送邮件实例讲解(python发邮件附件可以使用email模块实现)
Dec 03 Python
python监控网卡流量并使用graphite绘图的示例
Apr 27 Python
Python的subprocess模块总结
Nov 07 Python
virtualenv实现多个版本Python共存
Aug 21 Python
python 遍历目录(包括子目录)下所有文件的实例
Jul 11 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
Nov 14 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
Jun 18 Python
使用python实现unix2dos和dos2unix命令的例子
Aug 13 Python
python图的深度优先和广度优先算法实例分析
Oct 26 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
Mar 09 Python
Python Django中的STATIC_URL 设置和使用方式
Mar 27 Python
Python求解排列中的逆序数个数实例
May 03 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
mysql数据库差异比较的PHP代码
2012/02/05 PHP
析构函数与php的垃圾回收机制详解
2013/10/28 PHP
一个图片地址分解程序(用于PHP小偷程序)
2014/08/23 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
PHP扩展框架之Yaf框架的安装与使用
2016/05/18 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
javascript工具库代码
2012/03/29 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
JS实现仿QQ效果的三级竖向菜单
2015/09/25 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
2016/10/14 Javascript
探究JavaScript中的五种事件处理程序方式
2016/12/07 Javascript
jQuery实现图片滑动效果
2017/03/08 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
2018/09/07 Javascript
NodeJS加密解密及node-rsa加密解密用法详解
2018/10/12 NodeJs
vue-cli脚手架引入弹出层layer插件的几种方法
2019/06/24 Javascript
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
wxPython中listbox用法实例详解
2015/06/01 Python
利用Python破解斗地主残局详解
2017/06/30 Python
python解析xml简单示例
2019/06/21 Python
如何更优雅地写python代码
2019/07/02 Python
对Django中内置的User模型实例详解
2019/08/16 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
tensorboard实现同时显示训练曲线和测试曲线
2020/01/21 Python
python如何通过闭包实现计算器的功能
2020/02/22 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
2020/03/13 Python
HTML5轻松实现全屏视频背景的示例
2018/04/23 HTML / CSS
Tory Burch英国官方网站:美国时尚生活品牌
2017/12/06 全球购物
自动化专业毕业生自荐信
2013/11/01 职场文书
注册资产评估专业求职信
2014/07/16 职场文书
我们的节日春节活动方案
2014/08/22 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
2014党员整改措施思想汇报
2014/10/07 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
幼儿园班级工作总结2015
2015/05/25 职场文书
汽车车尾标语大全
2015/08/11 职场文书