1
0
mirror of https://github.com/apachecn/lmpythw-zh.git synced 2025-05-28 12:02:19 +00:00
lmpythw-zh/ex43.md
wizardforcel 91629f8daf ex43
2017-08-15 15:22:45 +08:00

128 lines
5.1 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.

# 练习 43SQL 管理
> 原文:[Exercise 43: SQL Administration](https://learncodethehardway.org/more-python-book/ex43.html)
> 译者:[飞龙](https://github.com/wizardforcel)
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻译](https://translate.google.cn/)
“管理”一词在数据库中重载了。它的意思是“确保 PostgreSQL 服务器保持运行”,或者是“为新软件的部署更改和迁移表”。在本练习中,我只介绍如何更改和迁移简单的纲要。管理完整数据库服务器不在本书的范围之内。
## 销毁和更改表
您已经遇到了`DROP TABLE`作为删除表的方式。我将向您展示另一种使用方式,以及如何使用`ALTER TABLE`在表中添加或删除列。
```sql
/* Only drop table if it exists. */
DROP TABLE IF EXISTS person;
/* Create again to work with it. */
CREATE TABLE person (
id INTEGER PRIMARY KEY,
first_name TEXT,
last_name TEXT,
age INTEGER
);
/* Rename the table to peoples. */
ALTER TABLE person RENAME TO peoples;
/* Add a hatred column to peoples. */
ALTER TABLE peoples ADD COLUMN hatred INTEGER;
/* Rename peoples back to person. */
ALTER TABLE peoples RENAME TO person;
.schema person
/* We don't need that. */
DROP TABLE person;
```
我正在对表进行一些虚假更改,来演示这些命令,但使用`ALTER TABLE``DROP TABLE`语句,这是你可以在 SQLite3 中执行的一切事情。我会讲解它,让你了解发生了什么:
`ex21.sql:2`
使用`IF EXISTS`修饰符,仅当表已经存在时,才会丢弃。当你在没有表的新的数据库上运行你的`.sql`脚本时,这抑制了错误。
`ex21.sql:5`
仅仅重新创建表来处理它。
`ex21.sql:13`
使用`ALTER TABLE`来将其重命名为`peoples`
`ex21.sql:16`
向新命名的表`peoples`中添加新的一列`hatred`,它是个`INTEGER`
`ex21.sql:19`
`peoples`重命名回到`person`,因为这对于表来说是个愚蠢的名称。
`ex21.sql:21`
转储`person`的纲要,所以你可以看到,它拥有新的`hatred`列。
`ex21.sql:24`
在这个练习之后,丢弃这个表来打扫干净。
## 迁移和演化数据
我们来应用您学到的一些技巧。我会让你选取你的数据库,并将纲要“演进”成不同的形式。你需要确保你很好地了解了以前的练习,并且让你的`code.sql`正常工作。如果你没有完成每一个这些东西,那么回去把所有东西都弄清楚。
为了确保你在正确的状态中尝试这个练习,当你运行你的`code.sql`,你应该可以运行`.schema`,像这样:
```sql
$ sqlite3 ex13.db < code.sql
$ sqlite3 ex13.db .schema
CREATE TABLE person (
id INTEGER PRIMARY KEY,
first_name TEXT,
last_name TEXT,
age INTEGER
);
CREATE TABLE person_pet (
person_id INTEGER,
pet_id INTEGER
);
CREATE TABLE pet (
id INTEGER PRIMARY KEY,
name TEXT,
breed TEXT,
age INTEGER,
dead INTEGER,
dob DATETIME
);
```
确保你的表像我的表。并且如果不是,返回去并且移除任何命令,它们在上一个练习之后执行`ALTER TABLE`或者任何东西。
## 挑战性练习
您所要完成的任务是数据库更改的以下列表:
+ 向`person`添加`dead`列,就像`pets`中那样。
+ 向`person`添加`phone_number`列。
+ 向`person`添加`salary`列,它是`float`
+ 向`person``pet`添加`dob`列,它是`DATETIME`
+ 向`person_pet`添加`purchased_on`列,它是`DATETIME`
+ 向`pet`添加`parent`列,它是`INTEGER`,并且持有它父母的`id`
+ 使用`UPDATE`语句,使用新的列数据更新现有的数据库记录。不要忘记`person_pet`关系表中的`purchased_on`列,来表明这个人什么时候购买这个宠物。
+ 再增加四个人和五个宠物,并为它们分配从属关系,以及哪个宠物是父母。在最后一部分,请记住,您获取父母的 ID然后将其设置在`parent`列中。
+ 写一个查询,寻找 2004 年以后购买的所有宠物及其所有者的名字。关键是基于`purchased_on`列将`person_pet`映射到`pet``parent`
+ 写一个查询,寻找给定宠物的父母。再次查看`pet.parent`来实现它。实际上很简单,所以不要小题大做。
+ 更新你的`code.sql`文件,你已经把所有的代码放了进去,让它使用`DROP TABLE IF EXISTS`语法。
+ 使用`ALTER TABLE`,向`person`添加`height``weight`列,并将其放在你的`code.sql`文件中。
+ 运行新的`code.sql`脚本来重置数据库,你应该没有错误。
您应该通过编写一个`ex13.sql`文件来实现,文件里面是这些新的东西。然后通过使用`code.sql`重置数据库来测试它,然后运行`ex13.sql`来更改数据库,并执行`SELECT`查询来确认您进行了正确的更改。
## 深入学习
继续阅读[`DROP TABLE`](https://sqlite.org/lang_droptable.html)和[`ALTER TABLE`](https://sqlite.org/lang_altertable.html)的文档,然后访问 [SQLite3 语言页面](https://sqlite.org/lang的.html),并且阅读文档的其余`CREATE``DROP`语句。