Compare commits
19 Commits
7884c77d69
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ba23d606a0 | ||
|
|
39e33007d2 | ||
|
|
9ead420a8a | ||
|
|
7bfc2989f9 | ||
|
|
e4f9aae108 | ||
|
|
40db3221d4 | ||
|
|
70c797e2ed | ||
|
|
f7ff71160a | ||
|
|
5f01137a3f | ||
|
|
902ef36976 | ||
|
|
22f805af62 | ||
|
|
665758fe32 | ||
|
|
4c9868a5d9 | ||
|
|
17f9c1e90f | ||
|
|
7d11501f1c | ||
|
|
118edb9a9d | ||
|
|
586ee37bf3 | ||
|
|
5cee27cb72 | ||
|
|
8565890f8f |
291
create/README.md
291
create/README.md
@@ -1,10 +1,17 @@
|
|||||||
以下是我的工程目录组织。
|
|
||||||
```
|
这是最新的文件夹结构:
|
||||||
|
|
||||||
|
``` tree
|
||||||
.
|
.
|
||||||
├── LICENSE
|
├── LICENSE
|
||||||
├── README.md
|
├── README.md
|
||||||
├── create
|
├── create
|
||||||
│ └── create.py
|
│ ├── README.md
|
||||||
|
│ ├── create.sh
|
||||||
|
│ ├── create_src.py
|
||||||
|
│ ├── create_src_dockerfile.py
|
||||||
|
│ ├── create_src_mod.py
|
||||||
|
│ └── create_table.py
|
||||||
├── docker-compose.yaml
|
├── docker-compose.yaml
|
||||||
├── infra
|
├── infra
|
||||||
│ └── postgres
|
│ └── postgres
|
||||||
@@ -15,86 +22,236 @@
|
|||||||
│ ├── 02_create_function.sql
|
│ ├── 02_create_function.sql
|
||||||
│ └── 03_create_table.sql
|
│ └── 03_create_table.sql
|
||||||
└── services
|
└── 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
|
``` shell
|
||||||
-- =========================================================
|
#!/bin/bash
|
||||||
-- table.sql (PostgreSQL 17.4+)
|
# create.sh - 启动Python容器执行create_table.py、create_src.py和create_src_dockerfile.py脚本
|
||||||
-- =========================================================
|
|
||||||
\pset pager off
|
|
||||||
\timing on
|
|
||||||
\c postgres;
|
|
||||||
|
|
||||||
CREATE EXTENSION IF NOT EXISTS "moddatetime" SCHEMA public;
|
set -e # 遇到错误立即退出
|
||||||
|
|
||||||
DO $$
|
# 定义表名变量,可以根据需要修改
|
||||||
BEGIN
|
TABLE_NAME="cn_pmi_records"
|
||||||
RAISE NOTICE '🚀============ 数据库表部署开始 ============🚀';
|
|
||||||
END $$;
|
|
||||||
|
|
||||||
-- create table logic
|
echo "🚀 开始创建流程,表名: ${TABLE_NAME}"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
DO $$
|
# ========== 第一部分:创建数据库表 ==========
|
||||||
BEGIN
|
echo "📋 第一步:创建数据库表结构..."
|
||||||
RAISE NOTICE '============ 数据库表部署完成 ============';
|
echo "🚀 启动Python容器执行create_table.py..."
|
||||||
END $$;
|
|
||||||
|
# 获取脚本所在目录的绝对路径
|
||||||
|
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 中实现一下逻辑:
|
以下是当前 create_src.py 内容:
|
||||||
1、定义一个变量参数,方便我调整表名称。
|
|
||||||
|
|
||||||
2、通过我定义的表名称把一下的替换以下的 `tabe_name`关键字。
|
```python
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
create_src.py - 在services目录下创建服务文件夹和文件结构
|
||||||
|
"""
|
||||||
|
|
||||||
```sql
|
import os
|
||||||
DO $$
|
import sys
|
||||||
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
|
def create_service_structure(table_name):
|
||||||
CREATE TRIGGER trg_tabe_name_at
|
"""创建服务文件夹结构"""
|
||||||
BEFORE UPDATE ON tabe_name
|
|
||||||
FOR EACH ROW
|
# 获取项目根目录
|
||||||
EXECUTE FUNCTION moddatetime(updated_at);
|
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
|
||||||
|
|
||||||
RAISE NOTICE 'tabe_name 表已创建';
|
if __name__ == "__main__":
|
||||||
ELSE
|
# 从环境变量获取表名
|
||||||
RAISE NOTICE 'tabe_name 表已存在,跳过';
|
table_name = os.environ.get('TABLE_NAME')
|
||||||
END IF;
|
|
||||||
END $$;
|
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 文件。
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,16 @@
|
|||||||
#!/bin/bash
|
#!/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 # 遇到错误立即退出
|
set -e # 遇到错误立即退出
|
||||||
|
|
||||||
|
# 定义表名变量,可以根据需要修改
|
||||||
|
TABLE_NAME="cn_pmi_records"
|
||||||
|
|
||||||
|
echo "🚀 开始创建流程,表名: ${TABLE_NAME}"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
|
# ========== 第一部分:创建数据库表 ==========
|
||||||
|
echo "📋 第一步:创建数据库表结构..."
|
||||||
echo "🚀 启动Python容器执行create_table.py..."
|
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
|
docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 运行Python容器
|
# 运行Python容器执行create_table.py
|
||||||
echo "📦 启动Python容器..."
|
echo "📦 启动Python容器执行create_table.py..."
|
||||||
docker run --rm \
|
docker run --rm \
|
||||||
--name "${CONTAINER_NAME}" \
|
--name "${CONTAINER_NAME}" \
|
||||||
-v "${SCRIPT_DIR}:/app/create" \
|
-v "${SCRIPT_DIR}:/app/create" \
|
||||||
-v "${PROJECT_ROOT}/infra/postgres/sql:/app/infra/postgres/sql" \
|
-v "${PROJECT_ROOT}/infra/postgres/sql:/app/infra/postgres/sql" \
|
||||||
|
-e TABLE_NAME="${TABLE_NAME}" \
|
||||||
-w /app \
|
-w /app \
|
||||||
python:3.13.7-alpine3.22 \
|
python:3.13.7-alpine3.22 \
|
||||||
sh -c "
|
sh -c "
|
||||||
@@ -38,8 +47,88 @@ docker run --rm \
|
|||||||
python create/create_table.py
|
python create/create_table.py
|
||||||
|
|
||||||
echo ''
|
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 ""
|
||||||
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
85
create/create_src.py
Normal 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)
|
||||||
96
create/create_src_dockerfile.py
Normal file
96
create/create_src_dockerfile.py
Normal 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
59
create/create_src_mod.py
Normal 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)
|
||||||
@@ -6,11 +6,18 @@ create.py - 动态生成PostgreSQL建表SQL语句
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import re
|
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 $$
|
sql_template = f"""DO $$
|
||||||
BEGIN
|
BEGIN
|
||||||
IF NOT EXISTS (
|
IF NOT EXISTS (
|
||||||
@@ -70,7 +77,7 @@ def update_sql_file():
|
|||||||
content = f.read()
|
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)
|
match = re.search(insert_pattern, content, re.DOTALL)
|
||||||
|
|
||||||
|
|||||||
@@ -5,5 +5,5 @@ END $$;
|
|||||||
|
|
||||||
DO $$
|
DO $$
|
||||||
BEGIN
|
BEGIN
|
||||||
RAISE NOTICE '============ 数据库表部署完成 ============';
|
RAISE NOTICE '✅============ 数据库表部署完成 ============✅';
|
||||||
END $$;
|
END $$;
|
||||||
|
|||||||
Reference in New Issue
Block a user