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实现跨文件全局变量的方法
Jul 07 Python
使用wxpython实现的一个简单图片浏览器实例
Jul 10 Python
Python使用os模块和fileinput模块来操作文件目录
Jan 19 Python
以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
Jan 20 Python
Python爬虫获取整个站点中的所有外部链接代码示例
Dec 26 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
Apr 02 Python
python实现祝福弹窗效果
Apr 07 Python
Windows10下 python3.7 安装 facenet的教程
Sep 10 Python
感知器基础原理及python实现过程详解
Sep 30 Python
opencv3/python 鼠标响应操作详解
Dec 11 Python
Pycharm导入anaconda环境的教程图解
Jul 31 Python
python中如何使用虚拟环境
Oct 14 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
我的论坛源代码(二)
2006/10/09 PHP
PHP+MYSQL实现读写分离简单实战
2017/03/13 PHP
PHP实现用户登录的案例代码
2018/05/10 PHP
jQuery实现的Tab滑动选项卡及图片切换(多种效果)小结
2015/09/14 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
angularjs中ng-attr的用法详解
2016/12/31 Javascript
React快速入门教程
2017/01/17 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
2017/04/13 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
Vue代码分割懒加载的实现方法
2017/11/23 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
2020/03/05 Javascript
vue自定义指令和动态路由实现权限控制
2020/08/28 Javascript
[01:03:00]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第一局
2016/02/25 DOTA
Python实现全局变量的两个解决方法
2014/07/03 Python
python实现通过shelve修改对象实例
2014/09/26 Python
python实现闹钟定时播放音乐功能
2018/01/25 Python
python中subprocess批量执行linux命令
2018/04/27 Python
Python初学者需要注意的事项小结(python2与python3)
2018/09/26 Python
计算机二级python学习教程(2) python语言基本语法元素
2019/05/16 Python
python中栈的原理及实现方法示例
2019/11/27 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
Python判断变量是否是None写法代码实例
2020/10/09 Python
Python的collections模块真的很好用
2021/03/01 Python
IE10 Error.stack 让脚本调试更加方便快捷
2013/04/22 HTML / CSS
印度尼西亚综合购物网站:Lazada印尼
2016/09/07 全球购物
Jacques Lemans德国:奥地利钟表品牌
2019/12/26 全球购物
什么是Linux虚拟文件系统VFS
2015/08/25 面试题
总经理秘书的岗位职责
2013/12/27 职场文书
本科毕业自我鉴定
2014/03/20 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
世界红十字日活动总结
2015/02/10 职场文书
2015年度保密工作总结
2015/04/24 职场文书
python实现高效的遗传算法
2021/04/07 Python
Vue过滤器(filter)实现及应用场景详解
2021/06/15 Vue.js
纯CSS3实现div按照顺序出入效果
2021/07/15 HTML / CSS