使用python-prompt-toolkit构建SQLite交互式命令行工具教程
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)
功能扩展建议
- 多行输入支持:添加多行SQL语句支持
- 结果格式化:美化查询结果输出
- 命令历史持久化:将命令历史保存到文件
- 自定义命令:添加如
.help
、.tables
等元命令 - 语法验证:在输入时检查SQL语法
总结
通过python-prompt-toolkit,我们仅用少量代码就构建了一个功能丰富的SQLite命令行工具,具备:
- 语法高亮
- 自动补全
- 命令历史
- 自定义样式
- 错误处理
这展示了python-prompt-toolkit在构建交互式命令行工具方面的强大能力。开发者可以基于此框架快速构建各种专业级的命令行应用。
python-prompt-toolkit 项目地址: https://gitcode.com/gh_mirrors/pyt/python-prompt-toolkit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考