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字典键值对的添加和遍历方法
Sep 11 Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
python判断一个集合是否为另一个集合的子集方法
May 04 Python
django认证系统实现自定义权限管理的方法
Jul 16 Python
Python 调用PIL库失败的解决方法
Jan 08 Python
利用python实现对web服务器的目录探测的方法
Feb 26 Python
python+numpy按行求一个二维数组的最大值方法
Jul 09 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
Aug 05 Python
Python终端输出彩色字符方法详解
Feb 11 Python
Django Model中字段(field)的各种选项说明
May 19 Python
Python Merge函数原理及用法解析
Sep 16 Python
matplotlib对象拾取事件处理的实现
Jan 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
linux php mysql数据库备份实现代码
2009/03/10 PHP
PHP 小心urldecode引发的SQL注入漏洞
2011/10/27 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
juery框架写的弹窗效果适合新手
2013/11/27 Javascript
js捕获鼠标滚轮事件代码
2013/12/16 Javascript
ie8本地图片上传预览示例代码
2014/01/12 Javascript
单击某一段文字改写文本颜色
2014/06/06 Javascript
用js编写的简单的计算器代码程序
2015/08/04 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
Bootstrap一款超好用的前端框架
2017/09/25 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
2018/10/08 Javascript
Nest.js环境变量配置与序列化详解
2021/02/21 Javascript
跟老齐学Python之不要红头文件(2)
2014/09/28 Python
Python遍历numpy数组的实例
2018/04/04 Python
从django的中间件直接返回请求的方法
2018/05/30 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
HTML5中的拖放实现详解
2017/08/23 HTML / CSS
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
美国购买和销售礼品卡平台:Raise
2017/01/13 全球购物
学前教育专业毕业生自荐信
2013/10/03 职场文书
产品工艺师的岗位职责
2013/11/15 职场文书
酒店前台接待岗位职责
2013/12/03 职场文书
护士思想汇报
2014/01/12 职场文书
社区工作者感言
2014/03/02 职场文书
公司承诺书格式
2014/05/21 职场文书
导师就业推荐信范文
2014/05/22 职场文书
财务管理专业求职信
2014/06/11 职场文书
扬尘污染防治方案
2014/06/15 职场文书
活动总结新闻稿
2014/08/30 职场文书
党员个人整改方案及措施
2014/10/25 职场文书
暑假安全保证书
2015/02/28 职场文书
公司捐书倡议书
2015/04/27 职场文书
安全教育主题班会总结
2015/08/14 职场文书
微软官方消息,在 2023 年 4 月 11 日之后微软将不再为 Office 2013 和 Skype for Business 2015 提供安全更新
2022/04/21 数码科技
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers