使用Python编写Web查询SQLite3数据库
要使用Python实现web查询sqlite3数据库,首先需要安装Flask和sqlite3库。然后,创建一个Flask应用,并定义一个路由来处理查询请求。在这个路由中,连接到sqlite3数据库,执行查询语句,并将结果返回给客户端。为了安全起见,建议使用参数化查询来防止SQL注入攻击。最后,运行Flask应用,并在浏览器中访问相应的URL来查看查询结果。
教程说明
0 代码为CHAPGPT生成
1 用flask实现web功能,Tkinter控制服务启停
2 数据库路径固定为C:/Users/Administrator/database.sqlite3
3 网页的第一个区域,用表格显示数据库renyuan数据表中所有信息,不单独编写flask的 index.html 模板文件。
4 网页的第二个区域实现搜索查询的功能,添加一个包含所有列名的下拉搜索框,可以指定选择某列数据进行查询。
5 运行后点击'切换运行/停止'开始运行,再次点击,关闭退出
6 默认为本机5000端口http://127.0.0.1:5000/
创建数据库
importsqlite3#连接到数据库(如果数据库不存在,则会创建一个新的数据库)conn=sqlite3.connect(r'C:\Users\Administrator\database.sqlite3')#创建游标对象cursor=conn.cursor()#创建renyuan表cursor.execute('''CREATETABLErenyuan(idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXT,ageINTEGER,genderTEXT,wealthREAL,sourceTEXT,industryTEXT,countryTEXT,rankINTEGER)''')#插入数据data=[('马云',57,'男',450,'阿里巴巴','电子商务','中国',1),('马化腾',50,'男',440,'腾讯','互联网','中国',2),('许家印',63,'男',430,'恒大集团','房地产','中国',3),('杨惠妍',40,'女',410,'中国恒大','房地产','中国',4),('张一鸣',39,'男',400,'字节跳动','互联网','中国',5),('王健林',67,'男',390,'万达集团','房地产','中国',6),('王卫',59,'男',380,'中国联通','电信','中国',7),('雷军',53,'男',370,'小米','电子产品','中国',8),('刘强东',48,'男',360,'京东','电子商务','中国',9),('丁磊',49,'男',350,'网易','互联网','中国',10),('宗庆后',75,'男',340,'娃哈哈','饮料','中国',11),('许荣茂',64,'男',330,'恒力集团','化工','中国',12),('刘永好',71,'男',320,'碧桂园','房地产','中国',13),('孙正义',64,'男',310,'软银','投资','中国',14),('孙宏斌',59,'男',300,'乐视网','互联网','中国',15),('潘石屹',59,'男',290,'SOHO中国','房地产','中国',16),('许家标',62,'男',280,'恒大集团','房地产','中国',17),('姚振华',59,'男',270,'中国国电集团','能源','中国',18),('李彦宏',53,'男',260,'百度','互联网','中国',19),('王石',73,'男',250,'万科企业','房地产','中国',20),]cursor.executemany('INSERTINTOrenyuan(name,age,gender,wealth,source,industry,country,rank)VALUES(?,?,?,?,?,?,?,?)',data)#提交事务conn.commit()#关闭游标和数据库连接cursor.close()conn.close()
查询数据库
importsqlite3fromflaskimportFlask,render_template_string,request,jsonifyimportthreadingimporttkinterastkimporttimeimportosimportsignal#数据库路径DB_PATH="C:/Users/Administrator/database.sqlite3"#创建Flask应用app=Flask(__name__)#全局变量,用于判断Flask进程的运行状态running=False#创建Tkinter窗口window=tk.Tk()window.title("数据库查询工具")window.geometry("320x320")#文字状态指示控件status_label=tk.Label(window,text="已停止",font=("Arial",12))status_label.pack(pady=20)#切换运行/停止按钮点击事件deftoggle_flask():globalrunningifrunning:#停止Flask进程os.kill(os.getpid(),signal.SIGINT)running=Falsestatus_label.config(text="已停止")else:#启动Flask进程threading.Thread(target=start_flask).start()#切换运行/停止按钮toggle_button=tk.Button(window,text="切换运行/停止",command=toggle_flask)toggle_button.pack(pady=10)#退出程序按钮点击事件defexit_program():#关闭Flask进程os.kill(os.getpid(),signal.SIGINT)time.sleep(1)#关闭Tkinter窗口window.destroy()#退出程序按钮exit_button=tk.Button(window,text="退出程序",command=exit_program)exit_button.pack(pady=10)#启动Flask进程的函数defstart_flask():globalrunningrunning=Truestatus_label.config(text="正在运行")app.run()#Flask路由:根路径@app.route('/')defindex():table_data=get_all_data()columns=get_table_columns()returnrender_template_string('''<h1>数据库查询工具</h1><h2>renyuan数据表</h2><tableborder="1"><thead><tr>{%forcolumnincolumns%}<th>{{column}}</th>{%endfor%}</tr></thead><tbody>{%forrowintable_data%}<tr>{%forvalueinrow.values()%}<td>{{value}}</td>{%endfor%}</tr>{%endfor%}</tbody></table><h2>精确查询</h2><selectid="column"><optionvalue="">选择列名</option>{%forcolumnincolumns%}<optionvalue="{{column}}">{{column}}</option>{%endfor%}</select><inputtype="text"id="search"placeholder="输入查询信息"><buttononclick="search()">查询</button><tableid="search-results"border="1"><thead><tr>{%forcolumnincolumns%}<th>{{column}}</th>{%endfor%}</tr></thead><tbody></tbody></table><scriptsrc="https://code.jquery.com/jquery-3.6.0.min.js"></script><script>functionsearch(){varcolumn=$("#column").val();varsearch=$("#search").val();$.post("/search",{column:column,search:search},function(data){vartbody=$("#search-resultstbody");tbody.empty();$.each(data,function(index,row){vartr=$("<tr></tr>");{%forcolumnincolumns%}tr.append("<td>"+row["{{column}}"]+"</td>");{%endfor%}tbody.append(tr);});});}</script>''',table_data=table_data,columns=columns)#Flask路由:精确查询@app.route('/search',methods=['POST'])defsearch():column=request.form['column']search=request.form['search']data=search_data(column,search)returnjsonify(data)#查询数据库中的所有数据defget_all_data():conn=sqlite3.connect(DB_PATH)cursor=conn.cursor()cursor.execute("SELECT*FROMrenyuan")rows=cursor.fetchall()columns=[column[0]forcolumnincursor.description]data=[dict(zip(columns,row))forrowinrows]conn.close()returndata#获取数据库表的列名defget_table_columns():conn=sqlite3.connect(DB_PATH)cursor=conn.cursor()cursor.execute("PRAGMAtable_info(renyuan)")columns=[column[1]forcolumnincursor.fetchall()]conn.close()returncolumns#根据列名和查询信息进行精确查询defsearch_data(column,search):conn=sqlite3.connect(DB_PATH)cursor=conn.cursor()cursor.execute(f"SELECT*FROMrenyuanWHERE{column}=?",(search,))rows=cursor.fetchall()columns=[column[0]forcolumnincursor.description]data=[dict(zip(columns,row))forrowinrows]conn.close()returndata#运行Tkinter窗口主循环window.mainloop()