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实现将n个点均匀地分布在球面上的方法
Mar 12 Python
python中的break、continue、exit()、pass全面解析
Aug 05 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
uwsgi+nginx部署Django项目操作示例
Dec 04 Python
python自定义函数实现最大值的输出方法
Jul 09 Python
使用python-pptx包批量修改ppt格式的实现
Feb 14 Python
python实现飞船游戏的纵向移动
Apr 24 Python
关于keras中keras.layers.merge的用法说明
May 23 Python
使用TensorBoard进行超参数优化的实现
Jul 06 Python
Python实现删除某列中含有空值的行的示例代码
Jul 20 Python
python如何操作mysql
Aug 17 Python
用python实现一个简单的验证码
Dec 09 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手册及PHP编程标准
2006/12/17 PHP
编写安全 PHP应用程序的七个习惯深入分析
2013/06/08 PHP
PHP中创建和编辑Excel表格的方法
2018/09/13 PHP
PHP进阶学习之类的自动加载机制原理分析
2019/06/18 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
3款实用的在线JS代码工具(国外)
2012/03/15 Javascript
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
跟我学习javascript的函数调用和构造函数调用
2015/11/16 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
vue.js的computed,filter,get,set的用法及区别详解
2018/03/08 Javascript
Vue实现todolist删除功能
2018/06/26 Javascript
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
2018/08/30 Javascript
NodeJS使用Range请求实现下载功能的方法示例
2018/10/12 NodeJs
vue实现局部刷新的实现示例
2019/04/16 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
[05:01]3.19DOTA2发布会 我们都是刀塔人
2014/03/25 DOTA
pyqt4教程之messagebox使用示例分享
2014/03/07 Python
浅谈Python对内存的使用(深浅拷贝)
2018/01/17 Python
Python基于pycrypto实现的AES加密和解密算法示例
2018/04/10 Python
Tensorflow分类器项目自定义数据读入的实现
2019/02/05 Python
django drf框架中的user验证以及JWT拓展的介绍
2019/08/12 Python
python爬虫爬取笔趣网小说网站过程图解
2019/11/18 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
CSS3中动画属性transform、transition和animation属性的区别
2016/09/25 HTML / CSS
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
Java程序员常见面试题
2015/07/16 面试题
大学生自我鉴定范文
2013/12/28 职场文书
宠物店的创业计划书范文
2014/01/11 职场文书
单身联谊活动方案
2014/01/29 职场文书
初二生物教学反思
2014/02/03 职场文书
同学毕业留言寄语
2015/02/27 职场文书
汽车4S店销售经理岗位职责
2015/04/02 职场文书