Compare commits

...

19 Commits

Author SHA1 Message Date
vipg
ba23d606a0 add 2025-12-26 17:33:33 +08:00
vipg
39e33007d2 add 2025-12-26 17:32:02 +08:00
vipg
9ead420a8a add 2025-12-26 17:31:32 +08:00
vipg
7bfc2989f9 add 2025-12-26 17:20:50 +08:00
vipg
e4f9aae108 add 2025-12-26 17:20:14 +08:00
vipg
40db3221d4 add 2025-12-26 17:09:22 +08:00
vipg
70c797e2ed add 2025-12-26 17:09:13 +08:00
vipg
f7ff71160a add 2025-12-26 17:08:48 +08:00
vipg
5f01137a3f add 2025-12-26 17:07:53 +08:00
vipg
902ef36976 add 2025-12-26 17:06:47 +08:00
vipg
22f805af62 add 2025-12-26 16:57:36 +08:00
vipg
665758fe32 add 2025-12-26 16:42:00 +08:00
vipg
4c9868a5d9 add 2025-12-26 16:40:20 +08:00
vipg
17f9c1e90f add 2025-12-26 16:38:13 +08:00
vipg
7d11501f1c add 2025-12-26 16:36:59 +08:00
vipg
118edb9a9d add 2025-12-26 16:34:36 +08:00
vipg
586ee37bf3 add 2025-12-26 16:33:11 +08:00
vipg
5cee27cb72 add 2025-12-26 16:26:23 +08:00
vipg
8565890f8f add 2025-12-26 16:23:11 +08:00
7 changed files with 570 additions and 77 deletions

View File

@@ -1,10 +1,17 @@
以下是我的工程目录组织。
```
这是最新的文件夹结构:
``` tree
.
├── LICENSE
├── README.md
├── create
── create.py
── README.md
│ ├── create.sh
│ ├── create_src.py
│ ├── create_src_dockerfile.py
│ ├── create_src_mod.py
│ └── create_table.py
├── docker-compose.yaml
├── infra
│ └── postgres
@@ -15,86 +22,236 @@
│ ├── 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 的内容
以下是当前 shell 脚本内容
```sql
-- =========================================================
-- table.sql (PostgreSQL 17.4+)
-- =========================================================
\pset pager off
\timing on
\c postgres;
``` shell
#!/bin/bash
# create.sh - 启动Python容器执行create_table.py、create_src.py和create_src_dockerfile.py脚本
CREATE EXTENSION IF NOT EXISTS "moddatetime" SCHEMA public;
set -e # 遇到错误立即退出
DO $$
BEGIN
RAISE NOTICE '🚀============ 数据库表部署开始 ============🚀';
END $$;
# 定义表名变量,可以根据需要修改
TABLE_NAME="cn_pmi_records"
-- create table logic
echo "🚀 开始创建流程,表名: ${TABLE_NAME}"
echo "=========================================="
DO $$
BEGIN
RAISE NOTICE '============ 数据库表部署完成 ============';
END $$;
# ========== 第一部分:创建数据库表 ==========
echo "📋 第一步:创建数据库表结构..."
echo "🚀 启动Python容器执行create_table.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容器执行create_table.py
echo "📦 启动Python容器执行create_table.py..."
docker run --rm \
--name "${CONTAINER_NAME}" \
-v "${SCRIPT_DIR}:/app/create" \
-v "${PROJECT_ROOT}/infra/postgres/sql:/app/infra/postgres/sql" \
-e TABLE_NAME="${TABLE_NAME}" \
-w /app \
python:3.13.7-alpine3.22 \
sh -c "
echo '📋 容器内环境信息:'
python --version
echo ''
echo '🔧 安装依赖(如果需要)...'
pip install --quiet --no-cache-dir psycopg2-binary >/dev/null 2>&1 || true
echo '⚙️ 执行 create_table.py...'
python create/create_table.py
echo ''
echo '✅ create_table.py 执行完成!'
"
# ========== 第二部分:创建服务结构 ==========
echo ""
echo "📋 第二步:创建服务文件夹结构..."
echo "🚀 执行create_src.py..."
# 运行Python容器执行create_src.py
docker run --rm \
--name "${CONTAINER_NAME}-src" \
-v "${SCRIPT_DIR}:/app/create" \
-v "${PROJECT_ROOT}/services:/app/services" \
-e TABLE_NAME="${TABLE_NAME}" \
-w /app \
python:3.13.7-alpine3.22 \
sh -c "
echo '📋 容器内环境信息:'
python --version
echo ''
echo '⚙️ 执行 create_src.py...'
python create/create_src.py
echo ''
echo '✅ create_src.py 执行完成!'
"
# ========== 第三部分更新Dockerfile ==========
echo ""
echo "📋 第三步更新Dockerfile内容..."
echo "🚀 执行create_src_dockerfile.py..."
# 运行Python容器执行create_src_dockerfile.py
docker run --rm \
--name "${CONTAINER_NAME}-dockerfile" \
-v "${SCRIPT_DIR}:/app/create" \
-v "${PROJECT_ROOT}/services:/app/services" \
-e TABLE_NAME="${TABLE_NAME}" \
-w /app \
python:3.13.7-alpine3.22 \
sh -c "
echo '📋 容器内环境信息:'
python --version
echo ''
echo '⚙️ 执行 create_src_dockerfile.py...'
python create/create_src_dockerfile.py
echo ''
echo '✅ create_src_dockerfile.py 执行完成!'
"
echo ""
echo "=========================================="
echo "🎉 所有任务执行完成!"
echo "📋 表名: ${TABLE_NAME}"
echo "📁 服务目录: ${PROJECT_ROOT}/services/${TABLE_NAME}"
echo "🐳 Dockerfile: ${PROJECT_ROOT}/services/${TABLE_NAME}/src/Dockerfile"
```
我需要你帮我在/create/create.py 中实现一下逻辑
1、定义一个变量参数方便我调整表名称。
以下是当前 create_src.py 内容
2、通过我定义的表名称把一下的替换以下的 `tabe_name`关键字。
```python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
create_src.py - 在services目录下创建服务文件夹和文件结构
"""
```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 -- 记录修改时间
);
import os
import sys
-- 3 触发器:自动刷新 updated_at
CREATE TRIGGER trg_tabe_name_at
BEFORE UPDATE ON tabe_name
FOR EACH ROW
EXECUTE FUNCTION moddatetime(updated_at);
def create_service_structure(table_name):
"""创建服务文件夹结构"""
RAISE NOTICE 'tabe_name 表已创建';
ELSE
RAISE NOTICE 'tabe_name 表已存在,跳过';
END IF;
END $$;
# 获取项目根目录
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
services_dir = os.path.join(project_root, 'services')
# 创建服务目录
service_dir = os.path.join(services_dir, table_name)
print(f"🚀 开始创建服务结构: {table_name}")
print(f"📁 目标目录: {service_dir}")
try:
# 创建主目录
os.makedirs(service_dir, exist_ok=True)
print(f"✅ 创建主目录: {service_dir}")
# 创建子目录
subdirs = ['src', 'src/crud', 'src/infra', 'src/model']
for subdir in subdirs:
dir_path = os.path.join(service_dir, subdir)
os.makedirs(dir_path, exist_ok=True)
print(f"✅ 创建子目录: {dir_path}")
# 定义要创建的文件列表
files_to_create = [
'dev.sh',
'README.md',
'src/Dockerfile',
'src/go.mod',
'src/go.sum',
'src/main.go',
'src/crud/create.go',
'src/crud/read.go',
'src/crud/update.go',
'src/crud/delete.go',
'src/infra/launch.go',
'src/infra/logger.go',
'src/infra/postgres.go',
'src/model/payload.go'
]
# 创建所有文件
for file_path in files_to_create:
full_path = os.path.join(service_dir, file_path)
os.makedirs(os.path.dirname(full_path), exist_ok=True) # 确保目录存在
# 创建空文件
with open(full_path, 'w', encoding='utf-8') as f:
f.write('') # 创建空文件
print(f"✅ 创建文件: {full_path}")
print(f"🎉 服务结构创建完成: {table_name}")
return True
except Exception as e:
print(f"❌ 创建服务结构时出错: {e}")
return False
if __name__ == "__main__":
# 从环境变量获取表名
table_name = os.environ.get('TABLE_NAME')
if not table_name:
print("❌ 错误: 未设置 TABLE_NAME 环境变量")
sys.exit(1)
print(f"📋 接收到的表名: {table_name}")
success = create_service_structure(table_name)
if success:
sys.exit(0)
else:
sys.exit(1)
```
3、拿到2中的处理结果写入 03_create_table.sql 中,写入规则为则追加到""部署完成"日志上面。
你的任务是完成 create_src_mod.py 编写,需求如下:
1、读取 create_src.py 中创建的 go.mod 文件。
2、清空文件内容后把以下 xxxxx 替换为 shell 中 TABLE_NAME 变量后写入 go.mod 中。
```go
module xxxxx
go 1.25.0
require (
)
require (
)
```
5、最后调整以下 shell 脚本逻辑,执行 create_src_dockerfile.py 成功后,立马执行 create_src_mod.py 文件。

View File

@@ -1,8 +1,16 @@
#!/bin/bash
# create.sh - 启动Python容器执行create_table.py脚本
# create.sh - 启动Python容器执行create_table.py、create_src.py、create_src_dockerfile.py和create_src_mod.py脚本
set -e # 遇到错误立即退出
# 定义表名变量,可以根据需要修改
TABLE_NAME="cn_pmi_records"
echo "🚀 开始创建流程,表名: ${TABLE_NAME}"
echo "=========================================="
# ========== 第一部分:创建数据库表 ==========
echo "📋 第一步:创建数据库表结构..."
echo "🚀 启动Python容器执行create_table.py..."
# 获取脚本所在目录的绝对路径
@@ -18,12 +26,13 @@ if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1
fi
# 运行Python容器
echo "📦 启动Python容器..."
# 运行Python容器执行create_table.py
echo "📦 启动Python容器执行create_table.py..."
docker run --rm \
--name "${CONTAINER_NAME}" \
-v "${SCRIPT_DIR}:/app/create" \
-v "${PROJECT_ROOT}/infra/postgres/sql:/app/infra/postgres/sql" \
-e TABLE_NAME="${TABLE_NAME}" \
-w /app \
python:3.13.7-alpine3.22 \
sh -c "
@@ -38,8 +47,88 @@ docker run --rm \
python create/create_table.py
echo ''
echo '✅ 执行完成!'
echo '✅ create_table.py 执行完成!'
"
# ========== 第二部分:创建服务结构 ==========
echo ""
echo "📋 第二步:创建服务文件夹结构..."
echo "🚀 执行create_src.py..."
# 运行Python容器执行create_src.py
docker run --rm \
--name "${CONTAINER_NAME}-src" \
-v "${SCRIPT_DIR}:/app/create" \
-v "${PROJECT_ROOT}/services:/app/services" \
-e TABLE_NAME="${TABLE_NAME}" \
-w /app \
python:3.13.7-alpine3.22 \
sh -c "
echo '📋 容器内环境信息:'
python --version
echo ''
echo '⚙️ 执行 create_src.py...'
python create/create_src.py
echo ''
echo '✅ create_src.py 执行完成!'
"
# ========== 第三部分更新Dockerfile ==========
echo ""
echo "📋 第三步更新Dockerfile内容..."
echo "🚀 执行create_src_dockerfile.py..."
# 运行Python容器执行create_src_dockerfile.py
docker run --rm \
--name "${CONTAINER_NAME}-dockerfile" \
-v "${SCRIPT_DIR}:/app/create" \
-v "${PROJECT_ROOT}/services:/app/services" \
-e TABLE_NAME="${TABLE_NAME}" \
-w /app \
python:3.13.7-alpine3.22 \
sh -c "
echo '📋 容器内环境信息:'
python --version
echo ''
echo '⚙️ 执行 create_src_dockerfile.py...'
python create/create_src_dockerfile.py
echo ''
echo '✅ create_src_dockerfile.py 执行完成!'
"
# ========== 第四部分更新go.mod ==========
echo ""
echo "📋 第四步更新go.mod文件..."
echo "🚀 执行create_src_mod.py..."
# 运行Python容器执行create_src_mod.py
docker run --rm \
--name "${CONTAINER_NAME}-mod" \
-v "${SCRIPT_DIR}:/app/create" \
-v "${PROJECT_ROOT}/services:/app/services" \
-e TABLE_NAME="${TABLE_NAME}" \
-w /app \
python:3.13.7-alpine3.22 \
sh -c "
echo '📋 容器内环境信息:'
python --version
echo ''
echo '⚙️ 执行 create_src_mod.py...'
python create/create_src_mod.py
echo ''
echo '✅ create_src_mod.py 执行完成!'
"
echo ""
echo "🎉 create.sh 执行完成!"
echo "=========================================="
echo "🎉 所有任务执行完成!"
echo "📋 表名: ${TABLE_NAME}"
echo "📁 服务目录: ${PROJECT_ROOT}/services/${TABLE_NAME}"
echo "🐳 Dockerfile: ${PROJECT_ROOT}/services/${TABLE_NAME}/src/Dockerfile"
echo "📦 go.mod: ${PROJECT_ROOT}/services/${TABLE_NAME}/src/go.mod"

85
create/create_src.py Normal file
View File

@@ -0,0 +1,85 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
create_src.py - 在services目录下创建服务文件夹和文件结构
"""
import os
import sys
def create_service_structure(table_name):
"""创建服务文件夹结构"""
# 获取项目根目录
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
services_dir = os.path.join(project_root, 'services')
# 创建服务目录
service_dir = os.path.join(services_dir, table_name)
print(f"🚀 开始创建服务结构: {table_name}")
print(f"📁 目标目录: {service_dir}")
try:
# 创建主目录
os.makedirs(service_dir, exist_ok=True)
print(f"✅ 创建主目录: {service_dir}")
# 创建子目录
subdirs = ['src', 'src/crud', 'src/infra', 'src/model']
for subdir in subdirs:
dir_path = os.path.join(service_dir, subdir)
os.makedirs(dir_path, exist_ok=True)
print(f"✅ 创建子目录: {dir_path}")
# 定义要创建的文件列表
files_to_create = [
'dev.sh',
'README.md',
'src/Dockerfile',
'src/go.mod',
'src/go.sum',
'src/main.go',
'src/crud/create.go',
'src/crud/read.go',
'src/crud/update.go',
'src/crud/delete.go',
'src/infra/launch.go',
'src/infra/logger.go',
'src/infra/postgres.go',
'src/model/payload.go'
]
# 创建所有文件
for file_path in files_to_create:
full_path = os.path.join(service_dir, file_path)
os.makedirs(os.path.dirname(full_path), exist_ok=True) # 确保目录存在
# 创建空文件
with open(full_path, 'w', encoding='utf-8') as f:
f.write('') # 创建空文件
print(f"✅ 创建文件: {full_path}")
print(f"🎉 服务结构创建完成: {table_name}")
return True
except Exception as e:
print(f"❌ 创建服务结构时出错: {e}")
return False
if __name__ == "__main__":
# 从环境变量获取表名
table_name = os.environ.get('TABLE_NAME')
if not table_name:
print("❌ 错误: 未设置 TABLE_NAME 环境变量")
sys.exit(1)
print(f"📋 接收到的表名: {table_name}")
success = create_service_structure(table_name)
if success:
sys.exit(0)
else:
sys.exit(1)

View File

@@ -0,0 +1,96 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
create_src_dockerfile.py - 更新Dockerfile内容
"""
import os
import sys
def update_dockerfile(table_name):
"""更新指定服务目录下的Dockerfile内容"""
# 获取项目根目录
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
services_dir = os.path.join(project_root, 'services')
# 服务目录路径
service_dir = os.path.join(services_dir, table_name)
dockerfile_path = os.path.join(service_dir, 'src', 'Dockerfile')
print(f"🚀 开始更新Dockerfile: {dockerfile_path}")
# Dockerfile内容
dockerfile_content = """# ==================== 第一阶段构建Go程序构建阶段====================
# 使用官方Go镜像作为构建基础选择与项目匹配的Go版本示例用1.25.0,可根据实际调整)
FROM golang:1.25.0-alpine3.22 AS builder
# 设置工作目录(容器内的目录,规范文件位置)
WORKDIR /app
# 复制go.mod和go.sum先复制依赖文件利用Docker缓存机制避免每次代码变动都重新下载依赖
COPY go.mod go.sum ./
# 下载项目依赖仅当go.mod/go.sum变动时才会重新执行
RUN go mod download
# 复制整个项目代码到工作目录
COPY . .
# 构建Go程序
# - CGO_ENABLED=0禁用CGO生成静态链接的二进制文件避免依赖系统库保证镜像兼容性
# - -o app指定输出二进制文件名为app
# - ./main.go指定入口文件
RUN CGO_ENABLED=0 GOOS=linux go build -o app ./main.go
# ==================== 第二阶段:运行程序(运行阶段)====================
# 使用轻量级的scratch大幅减小最终镜像体积
FROM scratch
# 设置工作目录
WORKDIR /app
# 从构建阶段复制编译好的二进制文件到当前镜像(仅复制最终产物,减小体积)
COPY --from=builder /app/app ./
# 暴露程序运行端口(与代码中一致)
EXPOSE 80
# 容器启动时执行的命令:运行二进制文件
CMD ["./app"]
"""
try:
# 检查文件是否存在
if not os.path.exists(dockerfile_path):
print(f"❌ Dockerfile不存在: {dockerfile_path}")
return False
# 清空文件内容并写入新内容
with open(dockerfile_path, 'w', encoding='utf-8') as f:
f.write(dockerfile_content)
print(f"✅ 成功更新Dockerfile: {dockerfile_path}")
print(f"📋 Dockerfile内容已完全替换")
return True
except Exception as e:
print(f"❌ 更新Dockerfile时出错: {e}")
return False
if __name__ == "__main__":
# 从环境变量获取表名
table_name = os.environ.get('TABLE_NAME')
if not table_name:
print("❌ 错误: 未设置 TABLE_NAME 环境变量")
sys.exit(1)
print(f"📋 接收到的表名: {table_name}")
success = update_dockerfile(table_name)
if success:
sys.exit(0)
else:
sys.exit(1)

59
create/create_src_mod.py Normal file
View File

@@ -0,0 +1,59 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
create_src_mod.py - 更新go.mod文件内容
"""
import os
import sys
def update_go_mod(table_name):
"""更新指定服务目录下的go.mod文件内容"""
# 获取项目根目录
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
services_dir = os.path.join(project_root, 'services')
# 服务目录路径
service_dir = os.path.join(services_dir, table_name)
go_mod_path = os.path.join(service_dir, 'src', 'go.mod')
print(f"🚀 开始更新go.mod: {go_mod_path}")
# go.mod内容模板将xxxxx替换为table_name
go_mod_content = f"""module {table_name}
"""
try:
# 检查文件是否存在
if not os.path.exists(go_mod_path):
print(f"❌ go.mod文件不存在: {go_mod_path}")
return False
# 清空文件内容并写入新内容
with open(go_mod_path, 'w', encoding='utf-8') as f:
f.write(go_mod_content)
print(f"✅ 成功更新go.mod: {go_mod_path}")
print(f"📋 模块名: {table_name}")
return True
except Exception as e:
print(f"❌ 更新go.mod时出错: {e}")
return False
if __name__ == "__main__":
# 从环境变量获取表名
table_name = os.environ.get('TABLE_NAME')
if not table_name:
print("❌ 错误: 未设置 TABLE_NAME 环境变量")
sys.exit(1)
print(f"📋 接收到的表名: {table_name}")
success = update_go_mod(table_name)
if success:
sys.exit(0)
else:
sys.exit(1)

View File

@@ -6,11 +6,18 @@ create.py - 动态生成PostgreSQL建表SQL语句
import os
import re
import sys
# 1. 定义表名称变量,方便调整
table_name = "cn_pmi_234_aaarecords" # 可以根据需要修改表名
# 从环境变量获取表名
table_name = os.environ.get('TABLE_NAME')
# 2. 定义SQL模板
if not table_name:
print("❌ 错误: 未设置 TABLE_NAME 环境变量")
sys.exit(1)
print(f"📋 接收到的表名: {table_name}")
# 定义SQL模板
sql_template = f"""DO $$
BEGIN
IF NOT EXISTS (
@@ -70,7 +77,7 @@ def update_sql_file():
content = f.read()
# 查找插入位置(在\"部署完成\"日志前)
insert_pattern = r'(DO \$\$.*?RAISE NOTICE \'🚀============ 数据库表部署开始 ============🚀\'.*?END \$\$;)(.*?)(DO \$\$.*?RAISE NOTICE \'============ 数据库表部署完成 ============\'.*?END \$\$;)'
insert_pattern = r'(DO \$\$.*?RAISE NOTICE \'🚀============ 数据库表部署开始 ============🚀\'.*?END \$\$;)(.*?)(DO \$\$.*?RAISE NOTICE \'============ 数据库表部署完成 ============\'.*?END \$\$;)'
match = re.search(insert_pattern, content, re.DOTALL)

View File

@@ -5,5 +5,5 @@ END $$;
DO $$
BEGIN
RAISE NOTICE '============ 数据库表部署完成 ============';
RAISE NOTICE '============ 数据库表部署完成 ============';
END $$;