利用DeepSeek實現rust調用duckdb動態鏈接庫的duckdb CLI

提示詞:請用rust調用duckdb-rs實現一個duckdb CLI,支持語法突出顯示和計時,還支持命令行管道輸入輸出
Cargo.toml

[package]
name = "duckdb-cli"
version = "0.1.0"
edition = "2024"[dependencies]
duckdb = "1.3.1"
syntect = "5.0"
atty = "0.2"
rustyline = "12.0"

main.rs

use std::{error::Error,io::{self, BufRead, Write},time::Instant,
};use duckdb::{params, Connection};
use rustyline::{completion::Completer,highlight::Highlighter,hint::Hinter,validate::Validator,Helper, history::History,
};
use syntect::{easy::HighlightLines,highlighting::{Style, ThemeSet},parsing::SyntaxSet,util::{as_24_bit_terminal_escaped, LinesWithEndings},
};fn main() -> Result<(), Box<dyn Error>> {// 初始化DuckDB連接let conn = Connection::open_in_memory()?;// 檢查是否是管道輸入if atty::isnt(atty::Stream::Stdin) {// 管道模式:從stdin讀取SQL并執行let stdin = io::stdin();let mut stdout = io::stdout();for line in stdin.lock().lines() {let sql = line?;if sql.trim().is_empty() {continue;}let start_time = Instant::now();let mut stmt = conn.prepare(&sql)?;let rows = stmt.query_map(params![], |row| Ok(row.get::<_, String>(0)?))?;for row in rows {writeln!(stdout, "{}", row?)?;}eprintln!("Query executed in {:?}", start_time.elapsed());}} else {// 交互模式:println!("DuckDB CLI (v{})", env!("CARGO_PKG_VERSION"));println!("Enter SQL commands or .exit to quit");let mut rl = rustyline::Editor::<SQLHelper, rustyline::history::DefaultHistory>::new()?;loop {match rl.readline("duckdb> ") {Ok(line) => {let line = line.trim();if line.eq_ignore_ascii_case(".exit") {break;}if line.is_empty() {continue;}// 執行并計時let start_time = Instant::now();let mut stmt = conn.prepare(line)?;let rows = stmt.query_map(params![], |row| Ok(row.get::<_, String>(0)?))?;// 輸出結果let mut count = 0;for row in rows {println!("{}", row?);count += 1;}println!("\n{} row{} in {:?}",count,if count == 1 { "" } else { "s" },start_time.elapsed());rl.add_history_entry(line);}Err(_) => break,}}}Ok(())
}struct SQLHelper {ps: SyntaxSet,ts: ThemeSet,
}impl SQLHelper {fn new() -> Self {Self {ps: SyntaxSet::load_defaults_newlines(),ts: ThemeSet::load_defaults(),}}
}impl Highlighter for SQLHelper {fn highlight<'l>(&self, line: &'l str, _pos: usize) -> std::borrow::Cow<'l, str> {let syntax = self.ps.find_syntax_by_extension("sql").unwrap();let mut h = HighlightLines::new(syntax, &self.ts.themes["base16-ocean.dark"]);let mut highlighted = String::new();for line in LinesWithEndings::from(line) {let ranges = h.highlight_line(line, &self.ps).unwrap();highlighted.push_str(&as_24_bit_terminal_escaped(&ranges[..], false));}std::borrow::Cow::Owned(highlighted)}fn highlight_prompt<'b, 's: 'b, 'p: 'b>(&'s self,prompt: &'p str,_default: bool,) -> std::borrow::Cow<'b, str> {std::borrow::Cow::Borrowed(prompt)}fn highlight_hint<'h>(&self, hint: &'h str) -> std::borrow::Cow<'h, str> {std::borrow::Cow::Borrowed(hint)}fn highlight_candidate<'c>(&self,candidate: &'c str,_completion: rustyline::CompletionType,) -> std::borrow::Cow<'c, str> {std::borrow::Cow::Borrowed(candidate)}fn highlight_char(&self, _line: &str, _pos: usize) -> bool {false}
}impl Completer for SQLHelper {type Candidate = String;fn complete(&self,_line: &str,_pos: usize,_ctx: &rustyline::Context<'_>,) -> rustyline::Result<(usize, Vec<Self::Candidate>)> {Ok((0, Vec::new()))}
}impl Hinter for SQLHelper {type Hint = String;
}impl Validator for SQLHelper {}impl Helper for SQLHelper {}

目前的功能很簡單,就是輸入查詢語句,輸出結果和計時信息,以及退出。讓他實現帶語法高亮的REPL,但實際上沒有實現。(你看到了是因為csdn的代碼渲染結果)
程序還有限制,只能輸出字符類型,其他類型要用::轉換,否則報錯。
交互模式

 ./duckdb-cli
DuckDB CLI (v0.1.0)
Enter SQL commands or .exit to quit
duckdb> select 1 a;
Error: InvalidColumnType(0, "a", Int)./duckdb-cli
DuckDB CLI (v0.1.0)
Enter SQL commands or .exit to quit
duckdb> select 'xyz' a;
xyz1 row in 1.01681ms
duckdb> create table t(i int);0 rows in 3.20001ms
duckdb> insert into t select 1;
Error: InvalidColumnType(0, "Count", BigInt)

命令行管道模式

echo "select 'a'" |./duckdb-cli
a
Query executed in 1.03702msecho "select sum(i)::varchar from range(10000000)t(i)" |./duckdb-cli
49999995000000
Query executed in 127.35006ms

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88639.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88639.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88639.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++,從匯編角度看《虛擬繼承的邪惡》

刷到一篇文章&#xff1a; 作者&#xff1a; 原文&#xff1a;虛擬繼承的邪惡 討論到這樣的一個程序&#xff0c;最終輸出什么&#xff1f;&#xff1f;&#xff1f; 代碼有簡化命名 using namespace std;class A { public:A(int a 0) : v(a) {};int v; };template <type…

多 Agent 強化學習實踐指南(一):CTDE PPO 在合作捕食者-獵物游戲中的應用詳解

我們來詳細講解如何在合作捕食者-獵物游戲中結合 PPO (Proximal Policy Optimization) 算法。我們將聚焦于 CTDE&#xff08;Centralized Training, Decentralized Execution&#xff0c;集中訓練、分散執行&#xff09; 模式&#xff0c;因為這是處理合作多 Agent 任務的常用且…

Web應用文件上傳安全設計指南

引言 在當今的Web應用中&#xff0c;文件上傳功能已成為基礎且必要的服務能力&#xff0c;但不當的設計可能帶來目錄遍歷、代碼注入、服務端資源耗盡等安全風險。本文從威脅模型、安全設計原則、技術實現三個維度&#xff0c;系統闡述安全文件上傳架構的設計要點。 一、威脅模型…

用 React Three Fiber 實現 3D 城市模型的擴散光圈特效

本文介紹了如何使用 React Three Fiber&#xff08;R3F&#xff09;和 Three.js 實現一個從中心向外擴散的光圈特效&#xff08;DiffuseAperture 組件&#xff09;&#xff0c;并將其集成到城市 3D 模型&#xff08;CityModel 組件&#xff09;中。該特效通過動態調整圓柱幾何體…

【牛客刷題】COUNT數字計數

文章目錄 一、題目介紹二、題解思路三、算法實現四、復雜度分析五 、關鍵步驟解析5.1 數字分解5.2 三種情況處理5.2.1 情況1: d < c u r d < cur d<cur(完整周期)5.2.2 情況2: d = c u r d = cur d=cur(混合周期)5.2.3 情況3: d > c u r d > cur d>cu…

AGV穿梭不“迷路”CCLinkIE轉Modbus TCP的銜接技巧

在AGV控制系統集成中&#xff0c;工程師常面臨一個現實難題&#xff1a;如何讓CCLinkIE總線與Modbus TCP設備實現高效通信&#xff1f;這種跨協議的連接需求&#xff0c;往往需要耗費大量時間調試。本文將通過實際案例解析&#xff0c;為制造行業工程師提供可復用的解決方案。【…

【代碼隨想錄】刷題筆記——哈希表篇

目錄 242. 有效的字母異位詞 349. 兩個數組的交集 202. 快樂數 1. 兩數之和 454. 四數相加 II 383. 贖金信 15. 三數之和 18. 四數之和 242. 有效的字母異位詞 思路 代碼 class Solution {public boolean isAnagram(String s, String t) {if (s.length() ! t.length()…

Python爬蟲實戰:研究messytables庫相關技術

1. 引言 在當今數字化時代,互聯網上存在著大量有價值的數據。然而,這些數據通常以不規則的格式存在,尤其是表格數據,可能包含復雜的表頭、合并單元格、不規則布局等問題。傳統的數據處理工具往往難以應對這些挑戰。 網絡爬蟲技術可以幫助我們從網頁上自動提取數據,而 mes…

Vue3的組件通信方式

通信方式適用層級數據流向復雜度Props/Emits父子組件單向/雙向★☆☆v-model父子組件雙向★☆☆Provide/Inject跨層級組件自上而下★★☆事件總線任意組件任意方向★★★Pinia/Vuex全局狀態任意方向★★☆Refs模板引用父子組件父→子★☆☆作用域插槽父子組件子→父★★☆Web W…

創客匠人:大健康創始人IP如何用“社會責任”構建品牌護城河

一、商業與責任的失衡困局部分大健康IP將利潤置于首位&#xff0c;甚至犧牲用戶利益&#xff0c;導致品牌形象脆弱。某保健品公司因夸大宣傳被曝光后&#xff0c;盡管銷量曾達千萬&#xff0c;卻因缺乏社會認同&#xff0c;一夜之間崩塌&#xff0c;證明沒有社會責任支撐的商業…

AI:機器人未來的形態是什么?

機器人未來的形態將受到技術進步、應用場景需求和社會接受度的綜合影響&#xff0c;以下是對未來機器人形態的預測&#xff0c;涵蓋技術趨勢、設計方向和應用場景&#xff1a; 1. 形態多樣化與通用化 人形機器人&#xff08;Humanoid Robots&#xff09;&#xff1a; 趨勢&…

創建 UIKit 項目教程

一、打開 XCode&#xff0c;選擇 iOS 下的 App&#xff0c;然后點 Next二、Interface 選擇 Storyboard&#xff0c;然后點 Next三、刪掉 Main.storyboard四、刪掉 SceneDelegate.swift五、AppDelegate.swift 只保留第一個函數六、在 AppDelegate.swift 文件里的 application 函…

防爬蟲君子協定 Robots.txt 文件

1.什么是robots.txt ? robots.txt是一個位于網站根目錄的文本文件,用于指導搜索引擎爬蟲如何訪問和抓取網站內容。它遵循特定的語法規則,是網站與爬蟲通信的重要工具。當搜索引擎訪問一個網站時,它首先會檢查該網站的根域下是否有一個叫做robots.txt的純文本文件。Robots.…

淺談 Python 中的 yield——生成器對象與函數調用的區別

我們來看這么一個例子&#xff1a; def greeter():name yield "你是誰&#xff1f;"yield f"你好&#xff0c;{name}"g greeter() print(next(g)) # → "你是誰&#xff1f;" print(g.send("張三")) # → "你好&#xf…

云端docker小知識

1、docker的三個關鍵概念image、container、dockerfile2、docker的container3、dockerfile4、docker制作image5、linux&#xff08;ubuntu&#xff09;安裝docker&#xff08;步驟1和4&#xff09;6、docker基本命令docker images 查看全部鏡像docker rmi -f 1e5f3c5b981a 刪除…

【Elasticsearch】昂貴算法與廉價算法

在 Elasticsearch 里&#xff0c;“昂貴”并不單指“CPU 時間”&#xff0c;而是綜合了 **CPU、內存、磁盤 I/O、網絡傳輸** 以及 **實現復雜度** 的代價。下面把常見“昂貴算法”拆開說&#xff1a;1. **高計算密度的文本算法** ? **match_phrase slop**&#xff08;帶跨距…

深度學習-多分類

?開頭摘要??&#xff1a; 本文將深入探討如何使用PyTorch實現基于Softmax回歸的MNIST手寫數字識別系統。從多分類問題的核心概念出發&#xff0c;詳細解析??One-Hot編碼??技術如何將類別標簽向量化&#xff0c;剖析??交叉熵損失函數??的數學原理及其在訓練中的優化機…

JVM 類加載過程

一、加載&#xff08;Loading&#xff09;目標&#xff1a;把字節碼文件&#xff08;.class&#xff09;“讀入 JVM”&#xff0c;生成類的 “半成品”&#xff08;Class 對象&#xff09;。Bootstrap ClassLoader&#xff08;啟動類加載器&#xff09;&#xff1a;負責加載 JV…

通俗范疇論13 雞與蛋的故事番外篇

通俗范疇論13 雞與蛋的故事番外篇 在上一篇中,我們得到了雞與蛋的Set局部小范疇如下: 雞與蛋 SetSetSet 局部小范疇 如上圖所示,每個雞來自于一個蛋,每個蛋來自于一只雞,如此循環,以至于無窮… 是的,假設雞與蛋兩個對象代表的集合,都是無窮集合,這個系統就沒有問題…

記錄跟隨recyclerview滑動的指示器

老早之前做的一個功能&#xff0c;橫向recyclerview滑動時&#xff0c;底部做跟隨滑動指示器。今天代碼不用了&#xff0c;記錄下代碼。<LinearLayoutandroid:layout_width"match_parent"android:layout_height"wrap_content"android:layout_marginTop&…