1
0
mirror of https://github.com/apachecn/lmpythw-zh.git synced 2025-05-31 05:27:43 +00:00
lmpythw-zh/ex45.md
wizardforcel 826a0da894 ex45
2017-08-15 16:22:14 +08:00

31 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 练习 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 的书很好,会让你远远超出这个小型速成课。