💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 练习 45:创建 ORM > 原文:[Exercise 45: Creating an ORM](https://learncodethehardway.org/more-python-book/ex45.html) > 译者:[飞龙](https://github.com/wizardforcel) > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) > 自豪地采用[谷歌翻译](https://translate.google.cn/) 这本书的 SQL 部分的最后一个练习是一个很大的跳跃。你使用一个数据库知道了 SQL 语言的基础知识。你也应该精通 Python 的 OOP。现在是时候组合这两个,并创建一个对象关系管理器(ORM)。ORM 的工作是,使用简单的 Python 类,并将它们转换为数据库表中存储的行。如果你曾经使用过 Django,那么你已经使用他们的 ORM 来存储数据。在本练习中,你将尝试逆向分析如何实现它。 ## 挑战练习 在现实世界中,如果一个为我工作的程序员打算创建自己的 ORM,我会说:“没门,使用现有的。”工作环境不同于教育环境,因为有人付钱让你完成一些事情。使用你的工作时间,来创造一个不能使你的雇主受益的事情,这是不正当的。但是,你自己的个人时间全部是你的,作为初学者,你应该尝试重新创建尽可能多的经典软件。 创建一个 ORM 将会让你了解许多问题,关于面向对象概念和 SQL 之间的不一致。有许多 SQL 可以建模的东西,而类经常卡在这里。还有一个问题,SQL 中的一切都是表。尝试创建自己的 ORM 将会让你深入了解 SQL 和 OOP,我建议花费大量的时间,尽你所能制作一个最好的 ORM。 你在 ORM 中应实现的一些主要功能有: + 从外部传递字符串到 ORM 应该是安全的。如果你使用 F 字符串来制作你的 SQL,那么你就错了。原因是,如果你执行`f"SELECT * FROM {table_name}`,那么有人可以从外部将`table_name`设置为 SQL,例如`person; DROP TABLE person`。你的数据库很可能以这种方式运行,销毁所有内容或更糟。有些数据库甚至允许你在 SQL 中运行系统命令,这被称为“SQL 注入”,你不应该在 ORM 中引入它。 + 所有的 CRUD 操作,但在 Python 中实现。我建议你跳过`CREATE TABLE`部分,直到你让其他的一切正常工作。简单的`INSERT`,`SELECT`,`UPDATE`和`DELETE`是易于制作的,但是从类定义创建数据库纲要涉及到一些主流的 Python 黑魔法,使其真正有效。使用手工制作的`.sql`文件创建你的数据库,然后一旦让其他东西正常工作,你可以尝试纲要系统来替换`.sql`文件。 + 将 Python 类型匹配到 SQL 类型以及新类型,来处理 SQL 类型。你可能会发现,你必须做一些杂技,将 Python 数据类型放到 SQL 表中。也许这太痛苦了,所以你最终会自己制作数据类型。这就是 Django 做的事情。 + 事务是一个高级话题,但如果你可以实现它就试一试。 我也会说,在这个练习中,你可以从任意数量的项目借鉴功能。在设计时,请随意查看 Django 的 ORM。最后,我强烈建议你首先仅仅实现一个 ORM,它可以处理你在本书的这个部分创建的小型数据库。一旦你得到一个可以处理这个数据库的东西,就可以将其推广到任何数据库。 ## 深入学习 本书开头提到了,Joe Celko 的[《"Smarties" SQL》](http://amzn.to/1QKi5iG)将会让你了解,你需要了解的 SQL 的每一件事情。Joe 的书很好,会让你远远超出这个小型速成课。