diff --git a/create/README.md b/create/README.md new file mode 100644 index 0000000..5a69648 --- /dev/null +++ b/create/README.md @@ -0,0 +1,100 @@ +以下是我的工程目录组织。 +``` +. +├── LICENSE +├── README.md +├── create +│ └── create.py +├── docker-compose.yaml +├── infra +│ └── postgres +│ ├── scripts +│ │ └── db-lanuch-entrypoint.sh +│ └── sql +│ ├── 01_uuid_v7_setup.sql +│ ├── 02_create_function.sql +│ └── 03_create_table.sql +└── services + └── cn_futures_trading_records + ├── README.md + ├── dev.sh + └── src + ├── Dockerfile + ├── crud + │ └── create.go + ├── go.mod + ├── go.sum + ├── infra + │ ├── launch.go + │ ├── logger.go + │ └── postgres.go + ├── main.go + └── model + └── payload.go +``` + + + +以下是 03_create_table.sql 的内容: + +```sql +-- ========================================================= +-- table.sql (PostgreSQL 17.4+) +-- ========================================================= +\pset pager off +\timing on +\c postgres; + +CREATE EXTENSION IF NOT EXISTS "moddatetime" SCHEMA public; + +DO $$ +BEGIN + RAISE NOTICE '🚀============ 数据库表部署开始 ============🚀'; +END $$; + +-- create table logic + +DO $$ +BEGIN + RAISE NOTICE '============ 数据库表部署完成 ============'; +END $$; +``` + + + +我需要你帮我在/create/create.py 中实现一下逻辑: +1、定义一个变量参数,方便我调整表名称。 + +2、通过我定义的表名称把一下的替换以下的 `tabe_name`关键字。 + +```sql +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 + FROM information_schema.tables + WHERE table_schema = 'public' + AND table_name = 'tabe_name' + ) THEN + CREATE TABLE tabe_name ( + id UUID DEFAULT gen_random_uuid() PRIMARY KEY, -- id + payload JSONB NOT NULL, -- 数据 + deleted BOOLEAN NOT NULL DEFAULT FALSE, -- 删除状态 + created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 记录创建时间 + updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP -- 记录修改时间 + ); + + -- 3 触发器:自动刷新 updated_at + CREATE TRIGGER trg_tabe_name_at + BEFORE UPDATE ON tabe_name + FOR EACH ROW + EXECUTE FUNCTION moddatetime(updated_at); + + RAISE NOTICE 'tabe_name 表已创建'; + ELSE + RAISE NOTICE 'tabe_name 表已存在,跳过'; + END IF; +END $$; +``` + +3、拿到2中的处理结果,写入 03_create_table.sql 中,写入规则为则追加到""部署完成"日志上面。 \ No newline at end of file diff --git a/create/create.py b/create/create.py index e69de29..1027004 100644 --- a/create/create.py +++ b/create/create.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +create.py - 动态生成PostgreSQL建表SQL语句 +""" + +import os +import re + +# 1. 定义表名称变量,方便调整 +table_name = "cn_futures_trading_records" # 可以根据需要修改表名 + +# 2. 定义SQL模板 +sql_template = f"""DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 + FROM information_schema.tables + WHERE table_schema = 'public' + AND table_name = '{table_name}' + ) THEN + CREATE TABLE {table_name} ( + id UUID DEFAULT gen_random_uuid() PRIMARY KEY, -- id + payload JSONB NOT NULL, -- 数据 + deleted BOOLEAN NOT NULL DEFAULT FALSE, -- 删除状态 + created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 记录创建时间 + updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP -- 记录修改时间 + ); + + -- 3 触发器:自动刷新 updated_at + CREATE TRIGGER trg_{table_name}_at + BEFORE UPDATE ON {table_name} + FOR EACH ROW + EXECUTE FUNCTION moddatetime(updated_at); + + RAISE NOTICE '{table_name} 表已创建'; + ELSE + RAISE NOTICE '{table_name} 表已存在,跳过'; + END IF; +END $$;""" + +def update_sql_file(): + """将生成的SQL语句追加到03_create_table.sql文件中""" + + # 定义文件路径 + sql_file_path = os.path.join( + os.path.dirname(os.path.dirname(__file__)), + 'infra', + 'postgres', + 'sql', + '03_create_table.sql' + ) + + try: + # 读取现有文件内容 + with open(sql_file_path, 'r', encoding='utf-8') as f: + content = f.read() + + # 查找插入位置(在\"部署完成\"日志前) + insert_pattern = r'(DO \$\$.*?RAISE NOTICE \'🚀============ 数据库表部署开始 ============🚀\'.*?END \$\$;)(.*?)(DO \$\$.*?RAISE NOTICE \'============ 数据库表部署完成 ============\'.*?END \$\$;)' + + match = re.search(insert_pattern, content, re.DOTALL) + + if match: + # 分割内容 + before_insert = match.group(1) + existing_middle = match.group(2) + after_insert = match.group(3) + + # 组合新内容 + new_content = f"""{before_insert}\n\n{sql_template}\n{existing_middle}\n{after_insert}""" + + # 写回文件 + with open(sql_file_path, 'w', encoding='utf-8') as f: + f.write(new_content) + + print(f"✅ 成功更新 {sql_file_path}") + print(f"📋 生成的表名: {table_name}") + print(f"📝 SQL内容已追加到文件中") + + else: + print("❌ 无法找到插入位置,请检查文件格式") + + except FileNotFoundError: + print(f"❌ 文件 {sql_file_path} 不存在") + except Exception as e: + print(f"❌ 处理文件时出错: {e}") + +if __name__ == "__main__": + print(f"🚀 开始生成表 '{table_name}' 的SQL语句...") + update_sql_file() \ No newline at end of file diff --git a/create/create.sh b/create/create.sh new file mode 100644 index 0000000..1c26fcb --- /dev/null +++ b/create/create.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# create.sh - 启动Python容器执行create.py脚本 + +set -e # 遇到错误立即退出 + +echo "🚀 启动Python容器执行create.py..." + +# 获取脚本所在目录的绝对路径 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" + +# 容器名称 +CONTAINER_NAME="python-create-runner" + +# 检查是否已存在同名容器,如果存在则删除 +if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then + echo "🧹 清理已存在的容器 ${CONTAINER_NAME}..." + docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1 +fi + +# 运行Python容器 +echo "📦 启动Python容器..." +docker run --rm \ + --name "${CONTAINER_NAME}" \ + -v "${SCRIPT_DIR}:/app/create" \ + -v "${PROJECT_ROOT}/infra/postgres/sql:/app/infra/postgres/sql" \ + -w /app \ + python:3.13.7-alpine3.22 \ + bash -c " + echo '📋 容器内环境信息:' + python --version + echo '' + + echo '🔧 安装依赖(如果需要)...' + pip install --quiet --no-cache-dir psycopg2-binary >/dev/null 2>&1 || true + + echo '⚙️ 执行 create.py...' + python create/create.py + + echo '' + echo '✅ 执行完成!' + " + +echo "" +echo "🎉 create.sh 执行完成!" \ No newline at end of file diff --git a/infra/postgres/sql/03_create_table.sql b/infra/postgres/sql/03_create_table.sql index 885a5ac..b8eeef5 100644 --- a/infra/postgres/sql/03_create_table.sql +++ b/infra/postgres/sql/03_create_table.sql @@ -1,5 +1,5 @@ -- ========================================================= --- trading_records.sql (PostgreSQL 17.4+) +-- table.sql (PostgreSQL 17.4+) -- ========================================================= \pset pager off \timing on