Flask 实战:32、ORM 魔法

本贴最后更新于 2128 天前,其中的信息可能已经渤澥桑田

在 Web 应用里使用原生 SQL 语句操作数据库主要存在下面两类问题:

  • 手动编写 SQL 语句比较乏味,而且视图函数中加入太多 SQL 语句会降低代码的易读性。另外还会容易出现安全问题,比如 SQL 注入。

  • 常见的开发模式是在开发时使用简单的 SQLite,而在部署时切换到 MySQL 等更健壮的 DBMS。但是对于不同的 DBMS,我们需要使用不同的 Python 接口库,这让 DBMS 的切换变得不太容易。

注意
尽管使用 ORM 可以避免 SQL 注入问题,但你仍然需要对传入的查询参数进行验证。另外,在执行原生 SQL 语句时也要注意避免使用字符串拼接或字符串格式化的方式传入参数。

使用 ORM 可以很大程度上解决这些问题。它会自动帮你处理查询参数的转义,尽可能地避免 SQL 注入的发生。另外,它为不同的 DBMS 提供统一的接口,让切换工作变得非常简单。ORM 扮演翻译的角色,能够将我们的 Python 语言转换为 DBMS 能够读懂的 SQL 指令,让我们能够使用 Python 来操控数据库。

附注
尽管 ORM 非常方便,但如果你对 SQL 相当熟悉,那么自己编写 SQL 代码可以获得更大的灵活性和性能优势。就像是使用 IDE 一样,ORM 对初学者来说非常方便,但进阶以后你也许会想要自己掌控一切。

ORM 把底层的 SQL 数据实体转化成高层的 Python 对象,这样一来,你甚至不需要了解 SQL,只需要通过 Python 代码即可完成数据库操作,ORM 主要实现了三层映射关系:

  • 表 →Python 类。

  • 字段(列)→ 类属性。

  • 记录(行)→ 类实例。

比如,我们要创建一个 contacts 表来存储留言,其中包含用户名称和电话号码两个字段。在 SQL 中,下面的代码用来创建这个表:

CREATE TABLE contacts( name varchar(100) NOT NULL, phone_number varchar(32), );

如果使用 ORM,我们可以使用类似下面的 Python 类来定义这个表:

from foo_orm import Model, Column, String class Contact(Model): __tablename__ = 'contacts' name = Column(String(100), nullable=False) phone_number = Column(String(32))

要向表中插入一条记录,需要使用下面的 SQL 语句:

INSERT INTO contacts(name, phone_number) VALUES('Grey Li', '12345678');

使用 ORM 则只需要创建一个 Contact 类的实例,传入对应的参数表示各个列的数据即可。下面的代码和使用上面的 SQL 语句效果相同:

contact = Contact(name='Grey Li', phone_number='12345678')

除了便于使用,ORM 还有下面这些优点:

  • 灵活性好。你既能使用高层对象来操作数据库,又支持执行原生 SQL 语句。

  • 提升效率。从高层对象转换成原生 SQL 会牺牲一些性能,但这微不足道的性能牺牲换取的是巨大的效率提升。

  • 可移植性好。ORM 通常支持多种 DBMS,包括 MySQL、PostgreSQL、Oracle、SQLite 等。你可以随意更换 DBMS,只需要稍微改动少量配置。

使用 Python 实现的 ORM 有 SQLAlchemy、Peewee、PonyORM 等。其中 SQLAlchemy 是 Python 社区使用最广泛的 ORM 之一,我们将介绍如何在 Flask 程序中使用它。SQL-Alchemy,直译过来就是 SQL 炼金术,下一节我们会见识到 SQLAlchemy 的神奇力量。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 240 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 367 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 5 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 106 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 2 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    7 引用 • 28 回帖 • 1 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 680 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 185 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    186 引用 • 1021 回帖
  • danl
    179 关注
  • 创业

    你比 99% 的人都优秀么?

    81 引用 • 1395 回帖 • 1 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    100 引用 • 905 回帖
  • 笔记

    好记性不如烂笔头。

    311 引用 • 794 回帖
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 223 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 71 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    61 引用 • 29 回帖 • 10 关注
  • AWS
    11 引用 • 28 回帖 • 6 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 281 关注
  • 996
    13 引用 • 200 回帖
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1062 引用 • 3455 回帖 • 152 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 112 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    441 引用 • 1238 回帖 • 599 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    151 引用 • 257 回帖 • 1 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 51 关注