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演示数型数据结构的教程
Apr 03 Python
Python的Django框架中TEMPLATES项的设置教程
May 29 Python
Python进程间通信用法实例
Jun 04 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
Apr 26 Python
Python 多个图同时在不同窗口显示的实现方法
Jul 07 Python
Win10系统下安装labelme及json文件批量转化方法
Jul 30 Python
使用Python的Turtle库绘制森林的实例
Dec 18 Python
如何理解python对象
Jun 21 Python
解决阿里云邮件发送不能使用25端口问题
Aug 07 Python
基于Python实现体育彩票选号器功能代码实例
Sep 16 Python
python归并排序算法过程实例讲解
Nov 04 Python
python 实现逻辑回归
Dec 30 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
探讨:如何使用PhpDocumentor生成文档
2013/06/25 PHP
5款适合PHP使用的HTML编辑器推荐
2015/07/03 PHP
javascript第一课
2007/02/27 Javascript
理解 JavaScript 预解析
2009/10/25 Javascript
jquery 模拟类搜索框自动完成搜索提示功能(改进)
2010/05/24 Javascript
js二级地域选择的实现方法
2013/06/17 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
javascript中style.left和offsetLeft的用法说明
2014/03/07 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
如何用JavaScript定义一个类
2014/09/12 Javascript
javascript结合CSS实现苹果开关按钮特效
2015/04/07 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
2016/06/12 Javascript
详解node nvm进行node多版本管理
2017/10/21 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
2018/01/26 Javascript
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
JavaScript闭包相关知识解析
2019/10/19 Javascript
Vue3+elementui plus创建项目的方法
2020/12/01 Vue.js
[43:24]VG vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
使用python开发vim插件及心得分享
2014/11/04 Python
Python3读取zip文件信息的方法
2015/05/22 Python
python检测主机的连通性并记录到文件的实例
2018/06/21 Python
Python OpenCV处理图像之滤镜和图像运算
2018/07/10 Python
5款Python程序员高频使用开发工具推荐
2019/04/10 Python
使用 Django Highcharts 实现数据可视化过程解析
2019/07/31 Python
python的Jenkins接口调用方式
2020/05/12 Python
知识竞赛主持词
2014/03/26 职场文书
最美乡村医生事迹材料
2014/06/02 职场文书
岳麓书院导游词
2015/02/03 职场文书
2015年医院护理部工作总结
2015/04/23 职场文书
工作简报怎么写
2015/07/21 职场文书
课改心得体会范文
2016/01/25 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书
vue封装数字翻牌器
2022/04/20 Vue.js
基于Redission的分布式锁实战
2022/08/14 Redis