add
This commit is contained in:
100
create/README.md
Normal file
100
create/README.md
Normal file
@@ -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 中,写入规则为则追加到""部署完成"日志上面。
|
||||||
@@ -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()
|
||||||
45
create/create.sh
Normal file
45
create/create.sh
Normal file
@@ -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 执行完成!"
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
-- =========================================================
|
-- =========================================================
|
||||||
-- trading_records.sql (PostgreSQL 17.4+)
|
-- table.sql (PostgreSQL 17.4+)
|
||||||
-- =========================================================
|
-- =========================================================
|
||||||
\pset pager off
|
\pset pager off
|
||||||
\timing on
|
\timing on
|
||||||
|
|||||||
Reference in New Issue
Block a user