314 lines
7.0 KiB
Markdown
314 lines
7.0 KiB
Markdown
# 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语法检查和开发能力!
|