# VS Code PostgreSQL 语法检查器配置指南 ## 推荐扩展安装 ### 1. 核心PostgreSQL扩展 - **PostgreSQL (ms-ossdata.vscode-pgsql)** - 微软官方PostgreSQL扩展 - **pgFormatter (bradymholt.pgformatter)** - PostgreSQL代码格式化工具 - **SQLTools (mtxr.sqltools)** - 通用数据库管理工具 - **SQLTools PostgreSQL Driver (mtxr.sqltools-driver-pg)** - PostgreSQL驱动 ### 2. 可选扩展 - **Database Client (cweijan.vscode-postgresql-client2)** - PostgreSQL客户端 - **SQL tagged template literals (frigus02.vscode-sql-tagged-template-literals)** - 模板字符串语法高亮 ## VS Code 配置设置 将以下配置添加到您的 `settings.json` 文件中: ```json { // PostgreSQL 文件关联 "files.associations": { "*.sql": "postgres", "*.pgsql": "postgres", "*.psql": "postgres" }, // PostgreSQL 语法高亮 "[postgres]": { "editor.defaultFormatter": "bradymholt.pgformatter", "editor.formatOnSave": true, "editor.tabSize": 2, "editor.insertSpaces": true, "editor.wordWrap": "on" }, // SQL 语法高亮 "[sql]": { "editor.defaultFormatter": "bradymholt.pgformatter", "editor.formatOnSave": true, "editor.tabSize": 2, "editor.insertSpaces": true }, // pgFormatter 配置 "pgFormatter.spaces": 2, "pgFormatter.commaBreak": true, "pgFormatter.noSpaceFunction": false, "pgFormatter.functionCase": 1, "pgFormatter.keywordCase": 2, "pgFormatter.maxLineLength": 120, "pgFormatter.noComment": false, "pgFormatter.formatType": false, // SQLTools 配置 "sqltools.useNodeRuntime": true, "sqltools.telemetry": false, "sqltools.format": { "language": "postgresql" }, // 错误检查配置 "postgres.showSmartIntelliSense": true, "postgres.enableIntelliSense": true, "postgres.format.keywordCase": "upper", // 文件类型检测 "files.exclude": { "**/*.sqlc": false }, // 语言服务器配置 "postgres.enableConnectionPooling": true, "postgres.maxNumberOfProblems": 100, // 自动完成配置 "editor.suggest.insertMode": "replace", "editor.acceptSuggestionOnCommitCharacter": false, "editor.suggest.showWords": false } ``` ## 项目级配置 在您的项目根目录创建 `.vscode/settings.json` 文件: ```json { // 项目特定的PostgreSQL配置 "files.associations": { "*.sql": "postgres", "message_system.sql": "postgres", "message_test_data.sql": "postgres" }, // 数据库连接配置(示例) "sqltools.connections": [ { "name": "PostgreSQL Local", "driver": "PostgreSQL", "server": "localhost", "port": 5432, "database": "your_database_name", "username": "your_username", "password": "", "connectionTimeout": 30 } ], // 代码片段和智能提示 "postgres.defaultDatabase": "your_database_name", "postgres.enableCodeLens": true } ``` ## 语法检查功能 ### 1. 实时语法检查 - 安装扩展后,VS Code会自动检查PostgreSQL语法错误 - 错误会在编辑器中用红色波浪线标出 - 鼠标悬停可查看详细错误信息 ### 2. 智能代码完成 - 自动完成SQL关键字 - 表名和列名自动完成(需要连接数据库) - 函数名自动完成 ### 3. 代码格式化 - 使用 `Shift + Alt + F` 格式化SQL代码 - 支持自定义格式化规则 ### 4. 错误诊断 - 语法错误检测 - 类型检查 - 未定义变量/表检测 ## 解决常见语法检查问题 ### 1. JSONB操作符问题 如果您的SQL中使用了 `->>`、`?` 等PostgreSQL特有操作符,可以: ```sql -- 使用类型转换明确指定 SELECT metadata::jsonb->>'test_data' FROM messages; -- 或使用函数形式 SELECT jsonb_extract_path_text(metadata, 'test_data') FROM messages; ``` ### 2. UUID类型转换 ```sql -- 明确UUID类型转换 INSERT INTO table (id) VALUES ('7bf7378e-a027-473e-97ac-3460ed3f170a'::uuid); -- 或使用函数 INSERT INTO table (id) VALUES (uuid('7bf7378e-a027-473e-97ac-3460ed3f170a')); ``` ### 3. 时间间隔问题 ```sql -- 使用PostgreSQL标准语法 SELECT now() - INTERVAL '1 day'; -- 或使用字符串转换 SELECT now() - '1 day'::interval; ``` ### 4. DO块和存储过程 ```sql -- 确保使用正确的DO块语法 DO $$ DECLARE var_name datatype; BEGIN -- 您的代码 END $$; ``` ## 数据库连接配置 ### 1. 通过SQLTools连接 1. 按 `Ctrl+Shift+P` 打开命令面板 2. 输入 "SQLTools: Add New Connection" 3. 选择 PostgreSQL 4. 填入连接信息 ### 2. 连接配置示例 ```json { "sqltools.connections": [ { "name": "开发数据库", "driver": "PostgreSQL", "server": "localhost", "port": 5432, "database": "akmon_dev", "username": "postgres", "askForPassword": true, "pg": { "ssl": false } } ] } ``` ## 快捷键设置 添加到 `keybindings.json`: ```json [ { "key": "ctrl+shift+e", "command": "sqltools.executeQuery", "when": "editorLangId == postgres" }, { "key": "f5", "command": "sqltools.executeQuery", "when": "editorLangId == postgres" }, { "key": "ctrl+shift+f", "command": "editor.action.formatDocument", "when": "editorLangId == postgres" } ] ``` ## 代码片段 创建 `.vscode/postgres.json` 代码片段文件: ```json { "Create Table": { "prefix": "table", "body": [ "CREATE TABLE ${1:table_name} (", " id uuid PRIMARY KEY DEFAULT gen_random_uuid(),", " ${2:column_name} ${3:data_type}${4: NOT NULL},", " created_at TIMESTAMP WITH TIME ZONE DEFAULT now(),", " updated_at TIMESTAMP WITH TIME ZONE DEFAULT now()", ");" ], "description": "Create a PostgreSQL table" }, "Insert with JSONB": { "prefix": "insertjson", "body": [ "INSERT INTO ${1:table_name} (", " ${2:columns}", ") VALUES (", " ${3:values},", " '${4:json_data}'::jsonb", ");" ], "description": "Insert with JSONB data" } } ``` ## 调试技巧 ### 1. 使用EXPLAIN分析查询 ```sql EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM ak_messages WHERE metadata->>'test_data' = 'true'; ``` ### 2. 检查语法的简单方法 ```sql -- 使用简单的SELECT验证语法 SELECT 1 WHERE EXISTS ( -- 您的复杂查询 ); ``` ### 3. 逐步构建复杂查询 ```sql -- 先测试简单部分 SELECT id FROM ak_messages LIMIT 1; -- 再添加复杂条件 SELECT id FROM ak_messages WHERE metadata->>'test_data' = 'true' LIMIT 1; ``` ## 性能优化建议 ### 1. 索引使用 ```sql -- 为JSONB字段创建GIN索引 CREATE INDEX idx_messages_metadata_gin ON ak_messages USING gin(metadata); -- 为特定JSONB路径创建索引 CREATE INDEX idx_messages_test_data ON ak_messages USING btree((metadata->>'test_data')) WHERE metadata ? 'test_data'; ``` ### 2. 查询优化 ```sql -- 使用EXISTS而不是IN SELECT * FROM ak_messages m WHERE EXISTS ( SELECT 1 FROM ak_message_recipients mr WHERE mr.message_id = m.id ); ``` 通过以上配置,您的VS Code将具备强大的PostgreSQL语法检查和开发能力!