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 功能和特点(新手必学)
Dec 30 Python
Python随机生成带特殊字符的密码
Mar 02 Python
使用TensorFlow实现二分类的方法示例
Feb 05 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
Apr 12 Python
python 实现交换两个列表元素的位置示例
Jun 26 Python
centos7之Python3.74安装教程
Aug 15 Python
python实现简单成绩录入系统
Sep 19 Python
Python测试线程应用程序过程解析
Dec 31 Python
python实现udp聊天窗口
Mar 31 Python
Django Admin后台添加数据库视图过程解析
Apr 01 Python
python反扒机制的5种解决方法
Feb 06 Python
Python之matplotlib绘制折线图
Apr 13 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 session机制
2011/07/17 PHP
php实现复制移动文件的方法
2015/07/29 PHP
简单介绍PHP非阻塞模式
2016/03/03 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
2017/07/19 PHP
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
表头固定(利用jquery实现原理介绍)
2012/11/08 Javascript
js如何判断用户是在PC端和还是移动端访问
2014/04/24 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
2015/08/27 Javascript
JS实现的车标图片提示效果代码
2015/10/10 Javascript
jQuery定义插件的方法
2015/12/18 Javascript
js中利用tagname和id获取元素的方法
2016/01/03 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
2016/10/09 Javascript
jquery pagination分页插件使用详解(后台struts2)
2017/01/22 Javascript
jquery与js实现全选功能的区别
2017/06/11 jQuery
AngularJS 的$timeout服务示例代码
2017/09/21 Javascript
javascript input输入框模糊提示功能的实现
2017/09/25 Javascript
vue 引入公共css文件的简单方法(推荐)
2018/01/20 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
在vue项目中利用popstate处理页面返回的操作介绍
2020/08/06 Javascript
ES6中的类(Class)示例详解
2020/12/09 Javascript
用C++封装MySQL的API的教程
2015/05/06 Python
Python中zfill()方法的使用教程
2015/05/20 Python
python使用threading获取线程函数返回值的实现方法
2017/11/15 Python
Python字典生成式、集合生成式、生成器用法实例分析
2020/01/07 Python
Hanky Panky官方网站:内衣和睡衣
2019/07/25 全球购物
飞利浦西班牙官方网站:Philips西班牙
2020/02/17 全球购物
.NET面试题:什么是值类型和引用类型
2016/01/12 面试题
应用艺术毕业生的自我评价
2013/12/04 职场文书
承诺书的格式范文
2014/03/28 职场文书
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书
美容院合作经营协议书
2014/10/10 职场文书
丽江古城导游词
2015/02/03 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js
基于Redis过期事件实现订单超时取消
2021/05/08 Redis