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

314 lines
7.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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语法检查和开发能力