Python如何制作并查询sql数据库

打印 上一主题 下一主题

主题 979|帖子 979|积分 2947

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我不停在探索如何让Python快速地检索数据,除了把数据装在py文件里,一起打包之外,我还实验过把数据放到json文件里或CSV文件里,这样就可以快速地检索到我们想要的数据。思量到检索数据库sql格式的文件,我还没有做过,今天就请出DeepSeek,让它来帮我把我的数据转化为一个sql文件,然后用python生成一个tkinter框架的UI界面,效果发现查询速度飞快。以下的工具的截图。


一、功能介绍

这个工具,可以快速地读取指定的sql格式文件,找到单词的多个变形,或者输入变形来查找它的本相。其主要特别是检索速度快,图形界面,多个检索模式。采取数据库来存储文件。
二、制作过程

1. 收集数据,明白使命

找到en_lemma.py格式的文件,把里面存储的数据写入到xlsx当中。文件内容如下:


en_lemma.py内容

我请DeepSeek为我生成了一段代码如下:
  1. from openpyxl import Workbook
  2. from en_lemma import lemmas  # 导入字典数据
  3. # 创建新工作簿并获取活动工作表
  4. wb = Workbook()
  5. ws = wb.active
  6. # 遍历字典的键值对
  7. for key, values in lemmas.items():
  8.     # 构造行数据:键作为第一列,后面接列表元素
  9.     row_data = [key] + values
  10.     # 将数据写入工作表
  11.     ws.append(row_data)
  12. # 保存Excel文件
  13. wb.save("lemmas_data.xlsx")
复制代码
2. 修改xlsx文件,生成sql数据库

我们利用Python中的pandas包和sqlite3包把这个lemmas_data.xlsx转化为sql数据库,代码如下:
  1. import pandas as pd
  2. import sqlite3
  3. # 1. 读取 Excel 文件
  4. excel_file = "en_lemmas.xlsx"  # Excel 文件路径
  5. sheet_name = "Sheet1"  # Excel 工作表名称
  6. df = pd.read_excel(excel_file, sheet_name=sheet_name)
  7. # 2. 创建 SQLite 数据库
  8. sqlite_db = "verb_forms.db"  # SQLite 数据库文件路径
  9. conn = sqlite3.connect(sqlite_db)
  10. cursor = conn.cursor()
  11. # 3. 创建表
  12. create_table_query = """
  13. CREATE TABLE IF NOT EXISTS verb_forms (
  14.     id INTEGER PRIMARY KEY AUTOINCREMENT,
  15.     base_form TEXT NOT NULL,
  16.     variant TEXT NOT NULL
  17. );
  18. """
  19. cursor.execute(create_table_query)
  20. # 4. 将数据插入 SQLite 表
  21. for index, row in df.iterrows():
  22.     base_form = row["BaseForm"]  # 假设 A 列是 BaseForm
  23.    
  24.     # 遍历 B、C、D 列(Variant1, Variant2, Variant3)
  25.     for col in ["Variant1", "Variant2", "Variant3", "Variant4", "Variant5", "Variant6"]:
  26.         variant = row[col]
  27.         
  28.         # 检查是否为有效值(非空)
  29.         if pd.notna(variant) and variant.strip() != "":
  30.             # 使用参数化查询避免 SQL 注入和特殊字符问题
  31.             insert_query = """
  32.             INSERT INTO verb_forms (base_form, variant)
  33.             VALUES (?, ?);
  34.             """
  35.             cursor.execute(insert_query, (base_form, variant.strip()))
  36. # 5. 提交更改并关闭连接
  37. conn.commit()
  38. conn.close()
  39. print(f"数据已成功导入 SQLite 数据库: {sqlite_db}")
复制代码
代码使用前,要把lemmas_data.xlsx文件打开,在首行插入一行,为每一列增加标题。第一列为BaseForm,第二列为Variant1,第二列为Variant2,依次类推。然后再改名为en_lemmas.xlsx后,再运行上述代码。


en_lemmas.xlsx文件内容

3. 使用Tkinter,编写检索界面

采取DeepSeek编写一个UI界面的检索软件,可视化呈现检索效果。编写前先在非可视化界面下测试软件,于时我们得到一个简单的检索代码:
  1. import sqlite3
  2. def get_base_form(word_to_find: str) -> str:
  3.     try:
  4.         # 连接数据库(自动处理相对路径)
  5.         with sqlite3.connect("verb_forms.db")  as conn:
  6.             cursor = conn.cursor()
  7.             # 参数化查询防止 SQL 注入
  8.             cursor.execute(
  9.                 "SELECT base_form FROM verb_forms WHERE variant = ?",
  10.                 (word_to_find,)
  11.             )
  12.             result = cursor.fetchone()
  13.             return result[0] if result else ""  # 关键修复:去掉括号
  14.     except sqlite3.Error as e:
  15.         print(f"数据库错误:{e}")
  16.         return ""
  17. # 测试代码
  18. if __name__ == "__main__":
  19.     test_word = "thought"
  20.     base_form = get_base_form(test_word)
  21.     if base_form:
  22.         print(f"单词 '{test_word}' 的基本形式是:{base_form}")
  23.     else:
  24.         print(f"未找到 '{test_word}' 的基本形式")
复制代码
然后,根据这个检索代码,进一步扩展,添加UI界面,最终得到以下代码:
  1. import sqlite3
  2. import tkinter as tk
  3. from tkinter import ttk
  4. from tkinter import messagebox
  5. def get_base_form(word_to_find: str) -> str:
  6.     try:
  7.         # 连接数据库(自动处理相对路径)
  8.         with sqlite3.connect("verb_forms.db")  as conn:
  9.             cursor = conn.cursor()
  10.             # 参数化查询防止 SQL 注入
  11.             cursor.execute(
  12.                 "SELECT base_form FROM verb_forms WHERE variant = ?",
  13.                 (word_to_find,)
  14.             )
  15.             result = cursor.fetchone()
  16.             return result[0] if result else ""
  17.     except sqlite3.Error as e:
  18.         messagebox.showerror("  数据库错误", f"数据库错误:{e}")
  19.         return ""
  20. def get_variants(word_to_find: str) -> list:
  21.     try:
  22.         with sqlite3.connect("verb_forms.db")  as conn:
  23.             cursor = conn.cursor()
  24.             # 先验证输入的是否为有效原形
  25.             cursor.execute("SELECT  base_form FROM verb_forms WHERE base_form = ?", (word_to_find,))
  26.             if not cursor.fetchone():
  27.                 return []  # 不是有效原形则直接返回空
  28.             # 查询变形
  29.             cursor.execute("SELECT  variant FROM verb_forms WHERE base_form = ?", (word_to_find,))
  30.             return [row[0] for row in cursor.fetchall()]
  31.     except sqlite3.Error as e:
  32.         messagebox.showerror("  数据库错误", f"数据库错误:{e}")
  33.         return []
  34. def query():
  35.     word = entry.get()
  36.     if choice.get()  == 1:
  37.         base_form = get_base_form(word)
  38.         if base_form:
  39.             result_text.delete(1.0,  tk.END)
  40.             result_text.insert(tk.END,  f"单词【{word}】的基本形式是:{base_form}")
  41.         else:
  42.             result_text.delete(1.0,  tk.END)
  43.             result_text.insert(tk.END,  f"未找到【{word}】的基本形式")
  44.     elif choice.get()  == 2:
  45.         variants = get_variants(word)
  46.         result_text.delete(1.0,  tk.END)
  47.         if variants:
  48.             # 显示变形列表
  49.             result_text.insert(tk.END,  f"原形【{word}】的变形:\n" + ", ".join(variants))
  50.         else:
  51.             # 分情况提示
  52.             try:
  53.                 with sqlite3.connect("verb_forms.db")  as conn:
  54.                     cursor = conn.cursor()
  55.                     cursor.execute("SELECT  base_form FROM verb_forms WHERE variant = ?", (word,))
  56.                     if cursor.fetchone():
  57.                         result_text.insert(tk.END,  f"注意:您输入的是变形单词,请切换至「原形」模式查询")
  58.                     else:
  59.                         result_text.insert(tk.END,  f"数据库未收录【{word}】的相关变形")
  60.             except sqlite3.Error as e:
  61.                 messagebox.showerror("  数据库错误", f"数据库错误:{e}")
  62. def copy_text():
  63.     result_text.clipboard_clear()
  64.     result_text.clipboard_append(result_text.selection_get())
  65. def cut_text():
  66.     copy_text()
  67.     result_text.delete(tk.SEL_FIRST,  tk.SEL_LAST)
  68. def paste_text():
  69.     result_text.insert(tk.INSERT,  result_text.clipboard_get())
  70.    
  71. def entry_copy():
  72.     try:
  73.         # 获取 Entry 选中内容并复制
  74.         entry.clipboard_clear()
  75.         entry.clipboard_append(entry.selection_get())
  76.     except tk.TclError:
  77.         pass  # 无选中内容时不操作
  78. def entry_cut():
  79.     entry_copy()  # 先复制
  80.     try:
  81.         entry.delete(tk.SEL_FIRST,  tk.SEL_LAST)  # 再删除选中内容
  82.     except tk.TclError:
  83.         pass
  84. def entry_paste():
  85.     entry.insert(tk.INSERT,  entry.clipboard_get())   # 插入剪贴板内容
  86. # 创建主窗口
  87. root = tk.Tk()
  88. root.title("  单词查询")
  89. # 设置所有标准控件的默认字体
  90. root.option_add("*Font",  ("Times New Roman", 14))  # 影响 Entry、Button 等非 ttk 控件
  91. # 设置 ttk 控件的主题字体
  92. style = ttk.Style()
  93. style.configure(".",  font=("Times New Roman", 14))  # 通配符 . 表示所有 ttk 控件
  94. # 创建输入框、单选按钮和查询按钮
  95. frame_top = ttk.Frame(root)
  96. frame_top.pack(pady=10)
  97. entry = ttk.Entry(frame_top, width=20)
  98. entry.pack(side=tk.LEFT,  padx=5)
  99. entry.bind("<Return>",  lambda event: query())  # 按回车触发查询
  100. entry.focus_set()
  101. # 创建 Entry 的右键菜单
  102. entry_menu = tk.Menu(entry, tearoff=0)
  103. entry_menu.add_command(label="  剪切", command=entry_cut)
  104. entry_menu.add_command(label="  复制", command=entry_copy)
  105. entry_menu.add_command(label="  粘贴", command=entry_paste)
  106. def show_entry_menu(event):
  107.     entry_menu.post(event.x_root,  event.y_root)  # 显示菜单
  108. entry.bind("<Button-3>",  show_entry_menu)  # 绑定右键事件
  109. choice = tk.IntVar()
  110. choice.set(2)
  111. radio1 = ttk.Radiobutton(frame_top, text="原形", variable=choice, value=1)
  112. radio1.pack(side=tk.LEFT,  padx=5)
  113. radio2 = ttk.Radiobutton(frame_top, text="变形", variable=choice, value=2)
  114. radio2.pack(side=tk.LEFT,  padx=5)
  115. query_button = ttk.Button(frame_top, text="查询", command=query)
  116. query_button.pack(side=tk.LEFT,  padx=5)
  117. # 创建结果显示文本框
  118. result_text = tk.Text(root, height=10, width=60)
  119. result_text.pack(pady=10)
  120. # 创建右键菜单
  121. menu = tk.Menu(result_text, tearoff=0)
  122. menu.add_command(label="  复制", command=copy_text)
  123. menu.add_command(label="  剪切", command=cut_text)
  124. menu.add_command(label="  粘贴", command=paste_text)
  125. def show_menu(event):
  126.     menu.post(event.x_root,  event.y_root)
  127.    
  128. result_text.bind("<Button-3>",  show_menu)
  129. # 运行主循环
  130. root.mainloop()
复制代码
在编写上述代码中,主要办理了以下几个问题:
1)本相和变形选错时的主动调节;2)查询按钮绑定回车键,回车就可以实现检索;3)在Entry和Text的控件里都添加了右键菜单,可以非常方便地举行复制和粘贴操作。
三、学后总结

1. 通过Python把xlsx文件转化为sql文件,并编写可视化界面来检索这个数据库,快速得到想要的内容。
2. Python不愧是瑞士军刀,在读取数据类型方面是别的工具无法逾越的。这次我们充实发挥Python的胶水作用,sql文件检索速度快的特点,实现了一个小型语料库的快速检索。
3. 如果我们的语料库有几十万句对,生成一个sql后再用python检索,岂不实现了数据库检索的功能?这个问题得当我们后期继续举行探究。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

来自云龙湖轮廓分明的月亮

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表