計算機科学のブログ

ほしい物リスト

SQL - SQLite - ALTER文 - 過去の書き換え - 複数の列の追加

Head First SQL ―頭とからだで覚えるSQLの基本Lynn Beighley(著)、 佐藤 直生(監訳)、 松永 多苗子(翻訳)、 オライリージャパンの 5章(ALTER文 - 過去の書き換え)、p.213(エクササイズ)の解答を求めてみる。

proj_idproj_desccon_namephonestart_dateest_cost

fish.sql

drop table if exists project_list;
create table project_list
(
    proj_id integer primary key autoincrement,
    proj_desc text,
    con_name text
);

コード

sample3.py

#! /usr/bin/env python3

import sqlite3

con = sqlite3.connect('project.db')
cur = con.cursor()


def p():
    print('-' * 10)
    cur.execute('pragma table_info(project_list)')
    for row in cur.fetchall():
        print(row)


p()

with open('project_list.sql') as f:
    cur.executescript(f.read())

p()

# sqliteではコンマ「,」で区切って一度に複数の列を追加できないみたい
# それぞれ追加
sql = """
alter table project_list
add column phone text
"""
cur.execute(sql)
con.commit()

p()

sql = """
alter table project_list
add column start_date date
"""

cur.execute(sql)
con.commit()

p()

sql = """
alter table project_list
add column real
"""

cur.execute(sql)
con.commit()

p()

cur.close()
con.close()

入出力結果(Terminal, Zsh)

% ./sample3.py 
----------
(0, 'proj_id', 'INTEGER', 0, None, 1)
(1, 'proj_desc', 'TEXT', 0, None, 0)
(2, 'con_name', 'TEXT', 0, None, 0)
----------
(0, 'proj_id', 'INTEGER', 0, None, 1)
(1, 'proj_desc', 'TEXT', 0, None, 0)
(2, 'con_name', 'TEXT', 0, None, 0)
----------
(0, 'proj_id', 'INTEGER', 0, None, 1)
(1, 'proj_desc', 'TEXT', 0, None, 0)
(2, 'con_name', 'TEXT', 0, None, 0)
(3, 'phone', 'TEXT', 0, None, 0)
----------
(0, 'proj_id', 'INTEGER', 0, None, 1)
(1, 'proj_desc', 'TEXT', 0, None, 0)
(2, 'con_name', 'TEXT', 0, None, 0)
(3, 'phone', 'TEXT', 0, None, 0)
(4, 'start_date', 'date', 0, None, 0)
----------
(0, 'proj_id', 'INTEGER', 0, None, 1)
(1, 'proj_desc', 'TEXT', 0, None, 0)
(2, 'con_name', 'TEXT', 0, None, 0)
(3, 'phone', 'TEXT', 0, None, 0)
(4, 'start_date', 'date', 0, None, 0)
(5, 'real', '', 0, None, 0)
%