天天看点

笨办法学 Python · 续 练习 43:SQL 管理练习 43:SQL 管理

练习 43:SQL 管理

原文: Exercise 43: SQL Administration 译者: 飞龙 协议: CC BY-NC-SA 4.0 自豪地采用 谷歌翻译

“管理”一词在数据库中重载了。它的意思是“确保 PostgreSQL 服务器保持运行”,或者是“为新软件的部署更改和迁移表”。在本练习中,我只介绍如何更改和迁移简单的纲要。管理完整数据库服务器不在本书的范围之内。

销毁和更改表

您已经遇到了

DROP TABLE

作为删除表的方式。我将向您展示另一种使用方式,以及如何使用

ALTER TABLE

在表中添加或删除列。

/* 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

,像这样:

$ 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

ALTER TABLE

的文档,然后访问

SQLite3 语言页面

,并且阅读文档的其余

CREATE

DROP

语句。