ホームページ >ウェブフロントエンド >jsチュートリアル >VSCode 拡張機能から TOML 構成を管理する - DBChat パート 8
Hexmos の創設者である Shrijith Venkatrama は、コードから優れた API ドキュメントをわずか数分で生成することでエンジニアリング ワークフローを合理化する非常に便利なツールである LiveAPI を構築しています。
このチュートリアル シリーズでは、AI チャットを使用してデータベースを調査および改善するためのシンプルなツールである DBChat を自分で構築します。
詳しい内容については、前の記事を参照してください:
前の記事では、DBChat VSCode 拡張機能でシンプルなチャット UI とデータベース接続フォームのフレームワークを作成しました。
この投稿では、DBChat 拡張機能が ~/.dbchat.toml 構成ファイルの [connections] セクションを操作してエントリを追加/更新/削除する方法を説明します。
記憶を更新するには、構成ファイルは次の構造になっている必要があります:
<code># DBChat 示例配置文件 # 将此文件复制到 ~/.dbchat.toml 并根据需要修改 [connections] # 格式:name = "connection_string" local = "postgresql://postgres:postgres@localhost:5432/postgres" liveapi = "postgresql://user:pwd@ip:5432/db_name" [llm] gemini_key = "the_key"</code>
DBChat 接続リスト:
DBChat 接続の追加/編集:
編集と更新の場合、エラーを避けるために確認プロンプトも表示されます。
まず、Toml 拡張機能をインストールします:
<code> npm install @iarna/toml</code>
いくつかの新しいインポートを取得します:
<code>import * as fs from 'fs/promises'; import * as path from 'path'; import * as os from 'os'; import * as TOML from '@iarna/toml';</code>
キーの構造は、3 つの操作すべてのイベントを受け取るメッセージ ハンドラーです。
<code> const messageHandler = this._view.webview.onDidReceiveMessage( async (message) => { console.log('Received message:', message); switch (message.command) { case 'saveConnection': console.log('Processing saveConnection command'); const success = await this._saveConnection(message.name, message.connectionString); if (success) { console.log('Connection saved successfully, closing form'); this._showingConnectionForm = false; this._updateView(); } else { console.log('Connection not saved, keeping form open'); } break; case 'cancel': console.log('Processing cancel command'); this._showingConnectionForm = false; this._updateView(); break; case 'editConnection': this._showingConnectionForm = true; this._editingConnection = message.name; // First update the view to show the form await this._updateView(); // Then send the prefill message after a short delay to ensure the form exists setTimeout(() => { this._view.webview.postMessage({ command: 'prefillForm', name: message.name, connectionString: message.connectionString }); }, 100); break; case 'deleteConnection': const choice = await vscode.window.showWarningMessage( `Are you sure you want to delete connection "${message.name}"?`, 'Yes', 'No' ); if (choice === 'Yes') { const deleted = await this._deleteConnection(message.name); if (deleted) { await this._updateView(); // Update view after successful deletion vscode.window.showInformationMessage(`Connection "${message.name}" deleted successfully.`); } } break; } } ); // Add message handler to subscriptions for cleanup context.subscriptions.push(messageHandler);</code>
接続の保存は簡単です:
<code> private async _saveConnection(name: string, connectionString: string): Promise<boolean> { console.log('Starting _saveConnection with:', { name, connectionString }); try { const configPath = path.join(os.homedir(), 'dbchat.toml'); console.log('Config path:', configPath); let config: any = { connections: {}, llm: {} }; console.log('Initial config structure:', config); // Read existing config if it exists try { console.log('Attempting to read existing config file...'); const fileContent = await fs.readFile(configPath, 'utf-8'); console.log('Existing file content:', fileContent); console.log('Parsing TOML content...'); config = TOML.parse(fileContent); console.log('Parsed config:', config); // Ensure connections section exists config.connections = config.connections || {}; console.log('Config after ensuring connections exist:', config); } catch (error: any) { console.log('Error reading config:', error); if (error.code !== 'ENOENT') { console.error('Unexpected error reading config:', error); throw error; } console.log('Config file does not exist, will create new one'); } // Check if connection already exists if (config.connections[name]) { console.log(`Connection "${name}" already exists, showing confirmation dialog`); const choice = await vscode.window.showWarningMessage( `Connection "${name}" already exists. Do you want to overwrite it?`, 'Yes', 'No' ); console.log('User choice for overwrite:', choice); if (choice !== 'Yes') { console.log('User declined to overwrite, returning false'); return false; } } // Update the connection config.connections[name] = connectionString; console.log('Updated config:', config); // Convert config to TOML and write back to file console.log('Converting config to TOML...'); const tomlContent = TOML.stringify(config); console.log('Generated TOML content:', tomlContent); // Preserve the header comments const finalContent = `# DBChat Sample Configuration File # Copy this file to ~/.dbchat.toml and modify as needed ${tomlContent}`; console.log('Final content to write:', finalContent); console.log('Writing to file...'); await fs.writeFile(configPath, finalContent, 'utf-8'); console.log('File written successfully'); // Update view immediately after successful file write this._showingConnectionForm = false; console.log('Form hidden, updating view'); this._updateView(); await vscode.window.showInformationMessage(`Connection "${name}" saved successfully!`, { modal: false }); return true; } catch (error) { console.error('Error in _saveConnection:', error); if (error instanceof Error) { console.error('Error stack:', error.stack); } await vscode.window.showErrorMessage(`Failed to save connection: ${error}`); return false; } } </boolean></code>
<code> private async _getConnections(): Promise { try { const configPath = path.join(os.homedir(), 'dbchat.toml'); const fileContent = await fs.readFile(configPath, 'utf-8'); const config = TOML.parse(fileContent); return config.connections || {}; } catch (error) { console.error('Error reading connections:', error); return {}; } }</code>
<code> private async _deleteConnection(name: string): Promise<boolean> { try { const configPath = path.join(os.homedir(), 'dbchat.toml'); const fileContent = await fs.readFile(configPath, 'utf-8'); const config = TOML.parse(fileContent); if (!config.connections || !config.connections[name]) { await vscode.window.showErrorMessage(`Connection "${name}" not found.`); return false; } delete config.connections[name]; const tomlContent = TOML.stringify(config); const finalContent = `# DBChat Sample Configuration File # Copy this file to ~/.dbchat.toml and modify as needed ${tomlContent}`; await fs.writeFile(configPath, finalContent, 'utf-8'); // Show message after file operations are complete vscode.window.showInformationMessage(`Connection "${name}" deleted successfully.`); return true; } catch (error) { console.error('Error deleting connection:', error); vscode.window.showErrorMessage(`Failed to delete connection: ${error}`); return false; } } </boolean></code>
この記事はここまでです。この構造を通じて、基本的なデータベース接続リスト、追加、削除、更新操作を実装します。
基本的なデータベース構成メカニズムができたので、次に、golang LSP を使用して、特定の構成への接続、スキーマの取得、データベースとのチャットなどの機能を有効にすることに取り組みます。
以上がVSCode 拡張機能から TOML 構成を管理する - DBChat パート 8の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。