使用python-prompt-toolkit构建SQLite交互式命令行工具教程

使用python-prompt-toolkit构建SQLite交互式命令行工具教程

python-prompt-toolkit python-prompt-toolkit 项目地址: https://gitcode.com/gh_mirrors/pyt/python-prompt-toolkit

前言

在开发数据库工具时,一个友好的命令行交互界面可以极大提升用户体验。本文将详细介绍如何使用python-prompt-toolkit库构建一个功能完善的SQLite REPL(Read-Eval-Print Loop)工具。

准备工作

首先需要安装必要的库:

pip install prompt_toolkit pygments

基础REPL实现

我们从最简单的输入输出开始:

from prompt_toolkit import prompt

def main():
    text = prompt('> ')
    print('您输入了:', text)

if __name__ == '__main__':
    main()

这段代码创建了一个最基本的命令行界面,等待用户输入并回显内容。

增强REPL功能

1. 添加循环和历史记录

真正的REL需要持续运行并记录历史命令:

from prompt_toolkit import PromptSession

def main():
    session = PromptSession()  # 自动维护命令历史
    
    while True:
        try:
            text = session.prompt('> ')
        except KeyboardInterrupt:  # 处理Ctrl+C
            continue
        except EOFError:  # 处理Ctrl+D
            break
        else:
            print('您输入了:', text)
    print('再见!')

2. 添加SQL语法高亮

使用Pygments库实现SQL语法高亮:

from prompt_toolkit.lexers import PygmentsLexer
from pygments.lexers.sql import SqlLexer

session = PromptSession(lexer=PygmentsLexer(SqlLexer))

3. 实现自动补全

为SQL关键字添加自动补全功能:

from prompt_toolkit.completion import WordCompleter

sql_completer = WordCompleter([
    'select', 'from', 'where', 'insert', 'update', 
    'delete', 'create', 'table', 'index'  # 简化的关键字列表
], ignore_case=True)

session = PromptSession(completer=sql_completer)

4. 自定义界面样式

我们可以自定义补全菜单的样式:

from prompt_toolkit.styles import Style

style = Style.from_dict({
    'completion-menu.completion': 'bg:#008888 #ffffff',
    'completion-menu.completion.current': 'bg:#00aaaa #000000',
})

session = PromptSession(style=style)

集成SQLite功能

最后,我们将REPL与SQLite数据库连接:

import sqlite3

def main(database):
    connection = sqlite3.connect(database)
    session = PromptSession(
        lexer=PygmentsLexer(SqlLexer),
        completer=sql_completer,
        style=style
    )

    while True:
        try:
            text = session.prompt('> ')
        except KeyboardInterrupt:
            continue
        except EOFError:
            break

        with connection:
            try:
                cursor = connection.execute(text)
                for row in cursor:
                    print(row)
            except Exception as e:
                print(f"错误: {e}")

完整实现

将上述所有功能整合后,我们得到一个功能完善的SQLite REPL工具:

#!/usr/bin/env python
import sys
import sqlite3
from prompt_toolkit import PromptSession
from prompt_toolkit.completion import WordCompleter
from prompt_toolkit.lexers import PygmentsLexer
from prompt_toolkit.styles import Style
from pygments.lexers.sql import SqlLexer

# SQL关键字自动补全
sql_completer = WordCompleter([
    'select', 'from', 'where', 'insert', 'update', 'delete',
    'create', 'table', 'index', 'join', 'group by', 'order by'
], ignore_case=True)

# 自定义样式
style = Style.from_dict({
    'completion-menu.completion': 'bg:#008888 #ffffff',
    'completion-menu.completion.current': 'bg:#00aaaa #000000',
})

def main(database):
    conn = sqlite3.connect(database)
    session = PromptSession(
        lexer=PygmentsLexer(SqlLexer),
        completer=sql_completer,
        style=style
    )

    print(f"连接到SQLite数据库: {database}")
    while True:
        try:
            text = session.prompt('SQL> ')
        except KeyboardInterrupt:
            print("输入Ctrl+C取消当前命令")
            continue
        except EOFError:
            print("\n退出SQLite REPL")
            break

        with conn:
            try:
                cursor = conn.execute(text)
                if text.lstrip().upper().startswith('SELECT'):
                    for row in cursor:
                        print(row)
                else:
                    print(f"执行成功: {cursor.rowcount}行受影响")
            except sqlite3.Error as e:
                print(f"SQL错误: {e}")

if __name__ == '__main__':
    db = sys.argv[1] if len(sys.argv) > 1 else ':memory:'
    main(db)

功能扩展建议

  1. 多行输入支持:添加多行SQL语句支持
  2. 结果格式化:美化查询结果输出
  3. 命令历史持久化:将命令历史保存到文件
  4. 自定义命令:添加如.help.tables等元命令
  5. 语法验证:在输入时检查SQL语法

总结

通过python-prompt-toolkit,我们仅用少量代码就构建了一个功能丰富的SQLite命令行工具,具备:

  • 语法高亮
  • 自动补全
  • 命令历史
  • 自定义样式
  • 错误处理

这展示了python-prompt-toolkit在构建交互式命令行工具方面的强大能力。开发者可以基于此框架快速构建各种专业级的命令行应用。

python-prompt-toolkit python-prompt-toolkit 项目地址: https://gitcode.com/gh_mirrors/pyt/python-prompt-toolkit

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴彬心Quenna

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值