天天看點

笨辦法學 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

語句。