我是靠谱客的博主 靓丽草丛,最近开发中收集的这篇文章主要介绍利用python操纵数据库--数据写入与tkinter实现界面查询,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在日常练习sql的时候,又找不到好的线上数据库,这个时候不如自己下载一个mysql.但是数据批量写入呢,就可能是一个问题.这时候,利用python脚本批量写入即可.同时每次运行脚本也是一个麻烦的事,可以实现窗口输入,写到数据库中,这将在后面的文章中介绍,这里只介绍python批量写入,并且从中读取的脚本.下面从安装开始介绍:

一、MySQL的安装

去官网寻找安装包,我使用的MAC,但是最新版本安装之后会提示无法打开,因此一定要找到系统对应的版本下载链接,安装好之后点击,会有一个提示给root设置密码,设置的时候一定记得要把密码记下来. 安装之后,exort一下路径,具体命令如下:

vim ~/.bash_profile ##打开source路径,然后在文本中追加

在文本中加入

export PATH=$PATH:/usr/local/mysql-8.0.11-macos10.13-x86_64/bin #mysql的安装路径

保存(:wq)之后,source一下,使终端生效

source ~/.bash_profile

启动数据库

mysql -u root -p

输入密码,看看初始化的时候有的数据库

show databases;

自己创建一个数据库,并进入这个数据库中

CREATE DATABASE IF NOT EXISTS STUDENT;
USE STUDENT;

在数据库中创建一张表(后续将使用这张表进行MySQL的学习与处理)

CREATE TABLE IF NOT EXISTS STUDENT_BASE_INFO(
	ID INT,
	FIRST_NAME VARCHAR(255),
	LAST_NAME VARCHAR(255),
	AGE INT,
	DEPT_ID INT
);

至此,我们完成了一个样例数据表的创建,如果忘了字段什么的,可以用如下命令进行查看

show columns from student_base_info;

然后可以手动插入一条记录

INSERT INTO  studnet_base_info values (2,jack,ma,59,202);

再执行查询操作

SELECT * FROM studnet_base_info WHERE first_name = 'jack'

查询结果如下:
在这里插入图片描述
至此,我们完成了数据表的建立以及数据的插入.但是这种效率很低,也需要很注意格式,为了提升数据插入效率,接下来我将介绍利用python插入数据

二、用Python写入数据

在python中,可以利用pymysql库可以连接数据库并进行数据操作.

2.1 定义一个连接

def conect_mysql(host,user,password,port,db):
   db = pymysql.connect(host =host,user = user,password=password,port= port,db = db)
   cur = db.cursor()
   return cur,db

2.2 写入数据

输入一个数据,并且利用数组进行操作

if __name__ == '__main__':
    print_hi('PyCharm')

    cur,db = conect_mysql('localhost','root','password',3306,'student')

    sql = 'INSERT INTO student_base_info values(%s,%s,%s,%s,%s)'
    ids = [7,8]
    first_names = ['meimei','lei']
    last_names = ['Han','Li']
    ages = [20,21]
    dept_ids = [203,204]

    print("====== 开始执行 ========")
    # cur.execute(sql)
    for i in range(0,len(ids)):
        cur.execute(sql,(ids[i],first_names[i],last_names[i],ages[i],dept_ids[i]))
    db.commit()
    print("====== 完成执行 ========")

利用脚本,我们可以用循环插入数据,避免一个个操作(因为之前已经用脚本插入了ID 2-6的数据,因此在写作本文的时候,新增7-8的批量操作)
在这里插入图片描述
处理完之后,我们就可以在数据库中查询到上述的数据,表示数据已经写入.需要注意的是,这里存在一个问题,当我们忘了之前操作,重新执行一下,就会产生重复数据, 这里是没有加入ID校验的

2.3 读取数据

接下来,我们可以从终端进入mysql,执行sql查询操作即可

SELECT * FROM student_base_info;

结果和上面的相似,也可以试试聚合查询

select dept_id, count(*)  from student_base_info group by dept_id;

得到的数据如下
在这里插入图片描述
当然我们也可以用不惯python脚本进行查询并且格式化输出,即使用下面的这个脚本

if __name__ == '__main__':
    print_hi('PyCharm')

    cur,db = conect_mysql('localhost','root','password',3306,'student')


    sql = 'select * from student_base_info'
    print("====== 开始执行 ========")
    cur.execute(sql)
    results = cur.fetchall();
    # print(results)
    print('namet agetfirst_nametlast_nametdept_id')
    for result in results:
        id = result[0]
        first_name = result[1]
        last_name = result[2]
        age = result[3]
        dept_it = result[4]
        print('t{0}t{1}t {2}t{3}t{4}'.format(id,first_name,last_name,age,dept_it))
    # db.commit()
    print("====== 完成执行 ========")

最终输出结果为:
在这里插入图片描述

三、基于tkinter实现的可视化

前面主要是调用python的pymysql进行操作,实现简单的写入和查询,这里面存在很多问题,比如重复ID写入等,文章主要是做一些简单的功能,并不打算实现数据库的事务等,以及类似于商城等系统设计。这部分主要是使用tkinter实现一个查询界面,调用pymysql进行数据查询.tkinter参照的书主要是Manning出版社的Python and Tkinter Programming,封面长这个样子的(希望Manning能给我打钱~)。在进行介绍前友情提醒Mac系统是10.14.6的朋友,千万不要用这个!!!,系统bug会引起反复重启,别问我怎么知道的,具体可以参照issue37833和tkinter mainloop() function logs me out of my mac
在这里插入图片描述

首先,使用python的tkinter制作框架,即定义一个框架

def frame(self,side):
	w = Frame(self)
	w.pack(side=side,expand = YES, fill = BOTH)
    return w

在这之后,需要定义按钮,比如你需要点击

def button(self,side,text,fg = None,command = None):
	w = Button(self,text= text,fg = fg,command = command)
    w.pack(side = side,expand = YES,fill = BOTH)

然后按照上述书籍定义不同的功能组件即可,最后是写入对应的查询操作

from tkinter import *
import tkinter.messagebox as messagebox
from get_query import excute_query,export_results
import os
import pandas as pd


class drawGraph(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.pack(expand=YES,fill=BOTH)
        self.master.geometry("500x600")
        self.master.title("SQL查询器")
        self.master.iconname("查询界面")

        def frame(self,side):
            w = Frame(self)
            w.pack(side=side,expand = YES, fill = BOTH)
            return w

        def button(self,side,text,fg = None,command = None):
            w = Button(self,text= text,fg = fg,command = command)
            w.pack(side = side,expand = YES,fill = BOTH)
            return w

        def text_frame(label):
            input1 = Label(root,text =label).pack()
            input_text = StringVar()
            name = Entry(root,width = 40,textvariable = input_text,pdx = 20,pdy = 10).pack()
            input_text.set(" ")
            return input_text,name

        display = StringVar()
        newEntry = Entry(self,relief = RAISED,textvariable = display,width = 1)
        newEntry.pack(side = TOP,expand = YES, fill = BOTH)


        def get_query():
            query_context = newEntry.get()
            rows,cols = excute_query(query_context)
            text = Text(self,height = 26,width = 150)
            text.insert(END,export_results(rows,cols))
            text.pack()
 
 #           if query_context:
 #              Message(self,text = export_results(rows,cols),relief= SUNKEN).pack()
 #           else:
 #               Message(self,text = "请输入查询语句或检查SQL语法!" ).pack()
            return export_results(rows,cols)


        opsF =frame(self,TOP)
        for char in ["查询","清空"]:
            if char == "查询":
                btn = button(opsF,LEFT,char,command= get_query)
            if char =="清空":
                btn = button(opsF,LEFT,char,fg = "blue",command=lambda w=display: w.set(""))
    
        #rows
#        Label(self,text = "输入下载地址:").pack(side = LEFT,padx=5,pady = 10)
#        e=StringVar()
#        SecondEntry = Entry(self,relief = RAISED,textvariable = e,width = 1)
#        SecondEntry.pack(side = TOP,expand = YES, fill = BOTH)

        opf = frame(self,TOP)
        displayNew =  StringVar()
        temp_entry = Entry(opf,relief = RAISED,textvariable = displayNew, width = 1)
        temp_entry.pack(side =LEFT,expand = YES, fill = BOTH)
        
        displayName =  StringVar()
        temp_Name = Entry(opf,relief = RAISED,textvariable =displayName, width = 1)
        temp_Name.pack(side = LEFT,expand = YES, fill = BOTH)
        
        def export_result_query():
            pathName = temp_entry.get()
            name = temp_Name.get()
            query_context = newEntry.get()
            rows,cols = excute_query(query_context)
            df_data =export_results(rows,cols)
            df_data.to_excel("{0}{1}.xlsx".format(pathName,name))
        #    Message(self,text = '{0}{1}'.format(pathName,name),relief= SUNKEN).pack()

        button(self,BOTTOM,"退出查询器",fg= 'red',command=exit)

        opsB =frame(self,BOTTOM)
        for char in ["输出结果","清空路径","清空名称"]:
            if char == "输出结果":
                btn = button(opsB,LEFT,char,command = export_result_query)
            if char == "清空路径":
                btn = button(opsB,LEFT,char,fg= 'red',command=lambda w=displayNew: w.set(""))
            if char == "清空名称":
                btn = button(opsB,LEFT,char,fg= 'red',command=lambda w=displayNew: w.set(""))
        

在上面定义完了查询界面组件以及对应的查询按钮功能,下面就需要定义对应的数据库连接和对应的操作了(export函数放在exucte里面最好不过了)

import pymysql
import pandas as pd
from CON_CONSTS import ip_port,host,user,passwd,db

def excute_query(context):
    try:
        con = pymysql.connect(host = host,port = ip_port,
            user = user,
		    passwd = passwd,
		    db = db, 
		    charset = 'utf8')
        cur = con.cursor()
        cur.execute(context)
    except:
        print ("连接错误!")
    finally:
        if con:
            con.close()
    cols = []
    for col in cur.description:
        cols.append(col[0])
    rows = cur.fetchall()
    #print(rows)
    return rows,cols

def export_results(rows,desc):
    new_row = []
    new_row.append(desc)
    for row in rows:
        new_row.append(list(row))
    return pd.DataFrame(new_row[1:],columns=new_row[0])

在CONST.py文件里面保存对应的连接数据即可

'''
ip_port: 端口
host:    主机
user:    用户名
passwd:  密码
db:      连接数据库
'''

最后我们在start.py中定义启动

from excute_func import drawGraph

if __name__ == "__main__":
    drawGraph().mainloop()

至此,完成了最基本的配置,因为我的系统升级到了10.14.6,因此也就不能一边操作一边截图,保存最基本的验证了, 因此只能把系统版本之前的代码贴出来.

结语

本文主要是讲述使用python对数据库进行操作的简单描述,利用python我们可以批量插入数据表,在查询的时候,如果可以通过界面进行查询操作,虽然不能补全,但是至少可以屏蔽掉每次运行脚本

最后

以上就是靓丽草丛为你收集整理的利用python操纵数据库--数据写入与tkinter实现界面查询的全部内容,希望文章能够帮你解决利用python操纵数据库--数据写入与tkinter实现界面查询所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部