Files
akmon/vscode_postgresql_setup.md
2026-01-20 08:04:15 +08:00

7.0 KiB
Raw Permalink Blame History

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 文件中:

{
  // 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 文件:

{
  // 项目特定的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特有操作符可以

-- 使用类型转换明确指定
SELECT metadata::jsonb->>'test_data' FROM messages;

-- 或使用函数形式
SELECT jsonb_extract_path_text(metadata, 'test_data') FROM messages;

2. UUID类型转换

-- 明确UUID类型转换
INSERT INTO table (id) VALUES ('7bf7378e-a027-473e-97ac-3460ed3f170a'::uuid);

-- 或使用函数
INSERT INTO table (id) VALUES (uuid('7bf7378e-a027-473e-97ac-3460ed3f170a'));

3. 时间间隔问题

-- 使用PostgreSQL标准语法
SELECT now() - INTERVAL '1 day';

-- 或使用字符串转换
SELECT now() - '1 day'::interval;

4. DO块和存储过程

-- 确保使用正确的DO块语法
DO $$
DECLARE
    var_name datatype;
BEGIN
    -- 您的代码
END $$;

数据库连接配置

1. 通过SQLTools连接

  1. Ctrl+Shift+P 打开命令面板
  2. 输入 "SQLTools: Add New Connection"
  3. 选择 PostgreSQL
  4. 填入连接信息

2. 连接配置示例

{
  "sqltools.connections": [
    {
      "name": "开发数据库",
      "driver": "PostgreSQL",
      "server": "localhost",
      "port": 5432,
      "database": "akmon_dev",
      "username": "postgres",
      "askForPassword": true,
      "pg": {
        "ssl": false
      }
    }
  ]
}

快捷键设置

添加到 keybindings.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 代码片段文件:

{
  "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分析查询

EXPLAIN (ANALYZE, BUFFERS) 
SELECT * FROM ak_messages 
WHERE metadata->>'test_data' = 'true';

2. 检查语法的简单方法

-- 使用简单的SELECT验证语法
SELECT 1 WHERE EXISTS (
    -- 您的复杂查询
);

3. 逐步构建复杂查询

-- 先测试简单部分
SELECT id FROM ak_messages LIMIT 1;

-- 再添加复杂条件
SELECT id FROM ak_messages 
WHERE metadata->>'test_data' = 'true' LIMIT 1;

性能优化建议

1. 索引使用

-- 为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. 查询优化

-- 使用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语法检查和开发能力