在日常练习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('name\t age\tfirst_name\tlast_name\tdept_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我们可以批量插入数据表,在查询的时候,如果可以通过界面进行查询操作,虽然不能补全,但是至少可以屏蔽掉每次运行脚本