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格式化压缩后的JS文件的方法
Mar 05 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
Nov 14 Python
django使用LDAP验证的方法示例
Dec 10 Python
详解DeBug Python神级工具PySnooper
Jul 03 Python
Python队列RabbitMQ 使用方法实例记录
Aug 05 Python
Python 动态导入对象,importlib.import_module()的使用方法
Aug 28 Python
python修改FTP服务器上的文件名
Sep 11 Python
python树的同构学习笔记
Sep 14 Python
python django中8000端口被占用的解决
Dec 17 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
python 基于DDT实现数据驱动测试
Feb 18 Python
再谈python_tkinter弹出对话框创建
Mar 20 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下载文件名中解决乱码的问题
2013/06/20 PHP
PHP面向对象程序设计之接口用法
2014/08/20 PHP
PHP实现的购物车类实例
2015/06/17 PHP
WordPress分页伪静态加html后缀
2016/06/08 PHP
php常用字符函数实例小结
2016/12/29 PHP
动态载入/删除/更新外部 JavaScript/Css 文件的代码
2010/07/03 Javascript
Extjs优化(二)Form表单提交通用实现
2013/04/15 Javascript
js中document.write的那点事
2014/12/12 Javascript
用模版生成HTML的的框架jquery.tmpl使用详解
2015/01/07 Javascript
jQuery实现tab选项卡效果的方法
2015/07/08 Javascript
jquery模拟进度条实现方法
2015/08/03 Javascript
AngularJS ng-blur 指令详解及简单实例
2016/07/30 Javascript
JavaScript中的对象和原型(一)
2016/08/12 Javascript
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
prototype.js简单实现ajax功能示例
2017/10/18 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
Pyhton中防止SQL注入的方法
2015/02/05 Python
python基于隐马尔可夫模型实现中文拼音输入
2016/04/01 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
Python字符串格式化的方法(两种)
2017/09/19 Python
利用Tkinter(python3.6)实现一个简单计算器
2017/12/21 Python
Python unittest 简单实现参数化的方法
2018/11/30 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
2020/01/20 Python
Mysql数据库反向生成Django里面的models指令方式
2020/05/18 Python
详解python百行有效代码实现汉诺塔小游戏(简约版)
2020/10/30 Python
英国文胸专家:AmpleBosom.com
2018/02/06 全球购物
法国在线药房:Shop Pharmacie
2019/11/26 全球购物
组织关系转移介绍信
2014/01/16 职场文书
喷漆工的岗位职责
2014/03/17 职场文书
群众路线教育党课主持词
2014/04/01 职场文书
园艺师求职信
2014/04/27 职场文书
离婚财产分配协议书
2014/10/21 职场文书
幼儿教师年度个人总结
2015/02/05 职场文书
同事欢送会致辞
2015/07/31 职场文书
TS 类型兼容教程示例详解
2022/09/23 Javascript