代码一: ```python #!/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) ``` 代码二: ```python #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ create.py - 动态生成PostgreSQL建表SQL语句 """ import os import re # 1. 从环境变量获取表名,如果没有设置则使用默认值 table_name = os.environ.get('TABLE_NAME', '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 normalize_blank_lines(text): """规范化空行:确保END $$;和DO $$之间只有一个空行""" # 将多个空行替换为单个空行 text = re.sub(r'\n{3,}', '\n\n', text) # 确保END $$;后面有一个空行再接DO $$ text = re.sub(r'END \$\$;(\s*)DO \$\$', r'END $$;\n\nDO $$', text) # 清理开头和结尾的多余空行 text = text.strip() + '\n' return text 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) # 规范化空行 existing_middle = normalize_blank_lines(existing_middle) # 组合新内容 new_content = f"""{before_insert}\n\n{sql_template}\n\n{existing_middle}\n{after_insert}""" # 规范化整个内容的空行 new_content = normalize_blank_lines(new_content) # 写回文件 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() ```