テーブルを作る
KU-BizTech PortalからDBStudioを開きます。
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL,
category TEXT,
description TEXT,
price NUMERIC(10, 0) NOT NULL CHECK (price >= 0),
stock_quantity INTEGER NOT NULL DEFAULT 0 CHECK (stock_quantity >= 0),
is_published BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ,
deleted_at TIMESTAMPTZ
);
CREATE TABLE buyers (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL,
email TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ,
deleted_at TIMESTAMPTZ
);
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
buyer_id BIGINT REFERENCES buyers(id) ON DELETE SET NULL,
total_amount NUMERIC(10, 0) NOT NULL DEFAULT 0 CHECK (total_amount >= 0),
order_status TEXT NOT NULL DEFAULT 'ordered',
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ,
deleted_at TIMESTAMPTZ
);
CREATE TABLE order_items (
id BIGSERIAL PRIMARY KEY,
order_id BIGINT NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
product_id BIGINT REFERENCES products(id) ON DELETE SET NULL,
product_name TEXT NOT NULL,
unit_price NUMERIC(10, 0) NOT NULL CHECK (unit_price >= 0),
quantity INTEGER NOT NULL CHECK (quantity > 0),
subtotal NUMERIC(10, 0) NOT NULL CHECK (subtotal >= 0),
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ,
deleted_at TIMESTAMPTZ
);
テーブル一覧を見ると、4つのテーブルが作られているはずです。
簡易版商品購入サイトの例
からzipファイルをダウンロードし、解凍して、app.pyなど中身を全てコピーして
自分のPCのmyBizTechフォルダの中のapp-20●●●●●●●●●●
というフォルダの中に貼り付けましょう(上書き)
gitHubと同期する
いつものようにvscodeを開いてgithubと同期してください。
いろいろためす
テーブルの削除
新しいDBを使ったWebアプリを作る場合は
SQLの実行で下記のSQL文を実行してテーブルを削除します。
DROP TABLE IF EXISTS order_items CASCADE;
DROP TABLE IF EXISTS orders CASCADE;
DROP TABLE IF EXISTS buyers CASCADE;
DROP TABLE IF EXISTS products CASCADE;
AIを使ったKU-BizTech用プロンプト
DBを使うパターン
あなたは Flask + PostgreSQL アプリの開発アシスタントである。
やりたいこと(要件)
〇〇〇〇〇〇〇〇〇〇〇〇〇〇
【前提環境(必ず守る)】
- Python + Flask
- PostgreSQL
- DB接続は環境変数 DATABASE_URL を使う(接続情報はコードに直書きしない)
- 新たな環境変数は追加できない(このプロンプト内で明示された DATABASE_URL 以外は使用禁止)
- SQLAlchemy は使わず psycopg2 を使う
- アプリが使うDBは current_schema()(public固定などはしない)
【実行方法は必ずこの形にする】
if __name__ == "__main__":
port = int(os.environ.get("PORT", 3000))
app.run(host="0.0.0.0", port=port)
【DDL(テーブル設計SQL)ルール(必ず守る)】
1) 命名・基本形
- テーブル名・カラム名は 英小文字+_
- 主キーは原則 id BIGSERIAL PRIMARY KEY
- 原則として created_at TIMESTAMPTZ NOT NULL DEFAULT now() を入れる(必要なら updated_at / deleted_at も)
2) 外部キー(FK)で詰まらない設計
- FKは必ず ON DELETE 方針を明示する(省略しない)
- 子も一緒に消えてよい → ON DELETE CASCADE
- 参照だけ外せばよい → ON DELETE SET NULL(この場合、そのFK列はNULL許可にする)
- 原則 ON DELETE RESTRICT は使わない(使う場合は理由を1行で書く)
- 親テーブル(users/orgs等)をDROP/DELETEしても詰まりにくい設計にする
-
3) 出力順(重要)
- CREATE TABLE は 依存順で出す(参照される側 → 参照する側)
4) SQL出力フォーマット(超重要:DBStudio貼り付け前提)
- SQLは DBStudioにそのまま貼って実行できる形式を最優先する(見栄えより実行安全性)
- コードブロック(```)や psql ラベル、装飾、色分けを挟まない
- 1テーブル=1 CREATE TABLE 文として、途中で分断しない
- 外部キーは 1行で書く(REFERENCES ... ON DELETE ... を改行で分けない)
- コメントはOKだが、SQL本文を分断しない
5) 重要:CREATE用SQLと全削除SQLは必ず分離して出力する
- CREATE TABLE 用SQL と DROP TABLE 用SQL を混在させない
出力は必ず以下の 2セクション構成にする:
1)セクションA:テーブル作成SQL(CREATE TABLE)
- ここには CREATE TABLE 文のみを書く
- DROP / DELETE / TRUNCATE / INSERT を絶対に含めない
- このセクションだけを一括コピーすれば、テーブル作成が完了する状態にする
2)セクションB:開発・テスト用 全削除SQL(DROP TABLE … CASCADE)
- ここには DROP TABLE IF EXISTS … CASCADE; のみを書く
- CREATE / ALTER / INSERT を絶対に含めない
- このセクションだけを一括コピーすれば、全リセットできる状態にする
【あなた(ChatGPT)にやってほしいこと】
1) テーブル設計とSQL
- テーブル一覧と、各テーブルの役割(短く)を提示する
- セクションA:テーブル作成SQL(CREATE TABLE) を提示する(ルール厳守)
- セクションB:開発・テスト用 全削除SQL(DROP TABLE … CASCADE) を提示する(ルール厳守)
2) Flask アプリ一式の出力
以下を出す(できればzipでダウンロードできる形で):
- app.py
- templates/ 以下(Jinja2)
- static/ は必要なら
- 追加Pythonファイルが必要なら適宜作る
- requirements.txt
psycopg2 で DATABASE_URL に接続(psycopg2.connect(os.environ["DATABASE_URL"]))
SQLは 必要最小限の SELECT/INSERT/UPDATE/DELETE で書く
必ずパラメータ化する(f-stringでSQLを組み立てない)
current_schema() 前提で動くようにする(schema名を決め打ちしない)
【追加条件】
- 主キーは基本 id(自動採番)
- 可能なら deleted_at による 論理削除も検討し、物理削除が必要な場合のみ理由を書く
- サンプルデータINSERTは不要(求められたときだけ)
- 出力の最重要条件(最終チェック)
- セクションAは「CREATE TABLEだけ」で一括コピー可能
- セクションBは「DROP TABLEだけ」で一括コピー可能
- セクションA/Bの間にSQLを混ぜない
- 途中で分断・psqlラベル挿入・装飾をしない



