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 相关文章推荐
使用PDB简单调试Python程序简明指南
Apr 25 Python
使用Python编写简单的端口扫描器的实例分享
Dec 18 Python
Python遍历某目录下的所有文件夹与文件路径
Mar 15 Python
Django框架实现逆向解析url的方法
Jul 04 Python
python合并已经存在的sheet数据到新sheet的方法
Dec 11 Python
Python 正则表达式爬虫使用案例解析
Sep 23 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
Dec 11 Python
用什么库写 Python 命令行程序(示例代码详解)
Feb 20 Python
python编程进阶之类和对象用法实例分析
Feb 21 Python
python读取文件指定行内容实例讲解
Mar 02 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
Jan 08 Python
pytorch 计算Parameter和FLOP的操作
Mar 04 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简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
PHP中$_SERVER使用说明
2015/07/05 PHP
部署PHP时的4个配置修改说明
2015/10/19 PHP
浅析PHP7新功能及语法变化总结
2016/06/17 PHP
PHP实现的防止跨站和xss攻击代码【来自阿里云】
2018/01/29 PHP
php使用fullcalendar日历插件详解
2019/03/06 PHP
Javascript 面向对象之重载
2010/05/04 Javascript
jquery禁用右键示例
2014/04/28 Javascript
JavaScript中window.showModalDialog()用法详解
2014/12/18 Javascript
JavaScript函数使用的基本教程
2015/06/04 Javascript
fastclick插件导致日期(input[type="date"])控件无法被触发该如何解决
2015/11/09 Javascript
一个超简单的jQuery回调函数例子(分享)
2016/08/08 Javascript
jQuery手指滑动轮播效果
2016/12/22 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
2017/01/11 Javascript
select下拉框插件jquery.editable-select详解
2017/01/22 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
2017/06/02 Javascript
vue2.0 子组件改变props值,并向父组件传值的方法
2018/03/01 Javascript
微信小程序出现wx.getLocation再次授权问题的解决方法分析
2019/01/16 Javascript
微信小程序 腾讯地图SDK 获取当前地址实现解析
2019/08/12 Javascript
python leetcode 字符串相乘实例详解
2018/09/03 Python
对python 多个分隔符split 的实例详解
2018/12/20 Python
Python eval的常见错误封装及利用原理详解
2019/03/26 Python
python pyinstaller 加载ui路径方法
2019/06/10 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
CSS3制作精致的照片墙特效
2016/06/07 HTML / CSS
简述进程的启动、终止的方式以及如何进行进程的查看
2014/02/20 面试题
销售主管的自我评价分享
2014/01/03 职场文书
个人简历中的自我评价怎么写
2014/01/26 职场文书
个人查摆剖析材料
2014/02/04 职场文书
4S店售后客服自我评价
2014/04/09 职场文书
机关作风整顿个人整改措施思想汇报
2014/09/29 职场文书
公司授权委托书格式范文
2014/10/02 职场文书
MySQL5.7并行复制原理及实现
2021/06/03 MySQL
python编程实现清理微信重复缓存文件
2021/11/01 Python
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫
Web应用开发TypeScript使用详解
2022/05/25 Javascript