1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 端口映射+物理机 虚拟机互访+Pyqt5 Gui图形化界面+Mysql数据库

端口映射+物理机 虚拟机互访+Pyqt5 Gui图形化界面+Mysql数据库

时间:2023-03-04 03:56:03

相关推荐

端口映射+物理机 虚拟机互访+Pyqt5 Gui图形化界面+Mysql数据库

目录

一、背景

1.1、要求

1.2、说明

1.2.1、环境

二、步骤详解

2.1、在linux下安装mysql数据库,并能通过localhost/phpmyadmin登录,用户名密码均设为root

2.2、新建一个数据库命名为xxx,在数据库xxx新建table数据表t1,在表t1中新建字段n1,n2,n3,分别在字段中插入不同的数值(数字,字符,日期等类型),可自行设计一个数据库,比如你的班级学生的姓名,年龄,学号,性别等

2.3、授权远程登录,将linux下的mysql数据库的3306端口映射至windows下3307口,实现局域网中远程访问虚拟机中mysql数据库

2.4、备份数据库后,删除数据库,再恢复数据库

2.5、windows开启mysql数据库,windows linux实现互访

2.6、利用python/java/php或其它语言,控制mysql数据库的操作。(登录,删除或增加数据)

三、运行结果

3.1、登录页面

3.2、主页面

四、完整源码

一、背景

1.1、要求

1) 在linux下安装mysql数据库,并能通过localhost/phpmyadmin登录,用户名密码均设为root2) 新建一个数据库命名为xxx,在数据库xxx新建table数据表t1,在表t1中新建字段n1,n2,n3,分别在字段中插入不同的数值(数字,字符,日期等类型),可自行设计一个数据库,比如你的班级学生的姓名,年龄,学号,性别等3) 授权远程登录,将linux下的mysql数据库的3306端口映射至windows下3307口,实现局域网中远程访问虚拟机中mysql数据库4) 备份数据库后,删除数据库,再恢复数据库5) 选作项:windows开启mysql数据库,windows linux实现互访。6) 选作项:利用python/java/php或其它语言,控制mysql数据库的操作。(登录,删除或增加数据)

1.2、说明

1.2.1、环境

物理机:windows 10虚拟机:ubuntu 网络连接:个人热点数据库:mysql 8.0界面:pyqt5

二、步骤

以下内容均需联网:

2.1、在linux下安装mysql数据库,并能通过localhost/phpmyadmin登录,用户名密码均设为root

1)安装:sudo apt-get install mysql-server(只下载,不设定密码)

2)查看密码(使用默认的root用户即可,使用不用修改用户名,修改系统给的初始密码即可):sudo cat /etc/mysql/f-->查看系统初始账号和密码

3)本地访问:sudo mysql -u root -p (登录数据库,指定root用户,使用密码登录,这时需要输入当前操作系统用户的密码,然后要输入登录数据库的密码,使用之前查看.cnf的文件内容即可)

注意点:8.0版本的mysql数据库的字段改了,使用update修改密码会报语法错误

要先进入到mysql数据库:use mysql;

修改密码sql语句:alteruser 用户名 identifiedby '密码';

刷新:flush privileges;

说明:若下载mysql数据库时出现报错,找不到依赖源,可以使用命令行执行更新软件源:

root@xiawoei-virtual-machine:/home# apt-get update

最后的办法:把ubuntu的操作系统删了,重新安装然后在下载(这个过程大概需要半个小时左右),在次下载就不会报错了;

2.2、新建一个数据库命名为xxx,在数据库xxx新建table数据表t1,在表t1中新建字段n1,n2,n3,分别在字段中插入不同的数值(数字,字符,日期等类型),可自行设计一个数据库,比如你的班级学生的姓名,年龄,学号,性别等

1)增

新建库:create database 数据库名称;

create database wlw ;

新建库:create database 数据库名称;

create database wlw ;

插入数据:insert into 表名(变量1,变量2,变量n) values(值1,值2,值n);

insert into t1(n1,n2,n3) values(1,’1’,);

插入数据类型命令:alter table 表名 add 字段 数据类型

alter table t1add n1char;

2)删

删库:drop database 库名;

删表:drop table 表名;

删除表中数据命令: 如:删除表中编号为1的记录 delete from 表名 where id=1;

删除一个字段命令: alter table 表名 drop 字段名;

清空表内数据命令: delete from 表名;(数据全空)

3)改

修改表名: alter table 表名 rename to 新表名;

修改字段: alter table 表名 change 原字段名 新字段名 数据类型;

修改数据类型命令: alter table 表名 modify 字段名 新数据类型;

4)查

查表全部数据:select * from 表名;

查看相关类型数据命令: select 字段,字段 from 表名;

查看表结构:desc 表名;

2.3、授权远程登录,将linux下的mysql数据库的3306端口映射至windows下3307口,实现局域网中远程访问虚拟机中mysql数据库

1)虚拟机开启访问权限

配置虚拟机访问权限:sudo vim /etc/mysql/mysql.conf.d/f 文件

找到这两行,改成这样:

bind-address = *

mysqlx-bind-address = *

按下Esc,:wq(保存退出)

查看是否配置成功:sudo netstat -an|gerep 3306

防火墙允许端口访问:sudo ufw allow 3306(管理员权限)

防火墙关闭:

配置数据库访问权限:先访问数据库-->sudo mysql -uroot -proot

查看mysql数据库的user表中的user,host字段

%代表全部都可以访问;

更新访问权限命令:grant all privileges on *.* to root@"%" identified by "root" with grant option;

刷新:flush privileges;

2)物理机开启端口监听与转发

配置数据库访问权限:

1、登录mysql:mysql -u用户名 -p密码

2、切换数据库:use mysql;

3、查看权限:select user,host from user;

4、更新权限:grant all privileges on *.* to root@"%" identified by "root" with grant option;

配置端口监听:

#端口转发

netsh interface portproxy add v4tov4 listenaddress=本地IP地址 listenport=物理机端口 connectaddress=虚拟机IP地址 connectport=虚拟机端口号

#查看配置

netsh interface portproxy show v4tov4

#删除

netsh interface portproxy delete v4tov4 listenaddress=本地IP地址 listenport=物理机端口

配置成功如下:

3)关物理机和虚拟机防火墙

关linux防火墙:

命令行执行:sudo ufw enable(需要切换到root用户才行,sudo -i 然后输入当前用户的密码可以暂时进入到root用户,假如不记得root密码又不会改)

关windows防火墙:

把出现的三个防火墙全关了;

验证端口映射的远程连接:

windows命令行连接:mysql -P端口号 -h本地地址 -u用户名 -p密码

2.4、备份数据库后,删除数据库,再恢复数据库

命令行下执行:

备份:mysqldump -u root -p 库名>保存的路径

删除:drop database 库名;

还原:mysql-u root -p 库名 < 保存的路径

2.5、windows开启mysql数据库,windows linux实现互访

1)windows创建数据库,linux创建数据库

2)linux开启3306端口,并允许访问3306端口

3)linux数据库开启访问权限

4)windows数据库开启访问权限

5)连接命令

命令行:mysql -h连接的IP -u数据库用户 -p用户密码

示例:windows要连接虚拟机的数据库,虚拟机IP为192.168.43.44,虚拟机数据库用户为root,密码为root,物理机IP为192.168.43.197(物理机与虚拟机要在同一个网段)

命令为:msyql -h192.168.43.44 -uroot -proot

2.6、利用python/java/php或其它语言,控制mysql数据库的操作。(登录,删除或增加数据)

完整代码放在最后。

三、运行结果

3.1、登录页面

3.2、主页面

四、完整源码

import pymysqlimport timefrom PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.QtWidgets import QMessageBoxfrom PyQt5.QtGui import QPixmap,QIconimport sysfrom PyQt5 import QtCore, QtGui, QtWidgetsimport sysfrom PyQt5.QtWidgets import QApplication, QMainWindowclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(800, 600)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setStyleSheet("background-image: url(./3.jpg);")self.centralwidget.setObjectName("centralwidget")self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)self.tableWidget.setGeometry(QtCore.QRect(0, 0, 341, 351))self.tableWidget.setObjectName("tableWidget")self.tableWidget.setColumnCount(2)self.tableWidget.setRowCount(7)item = QtWidgets.QTableWidgetItem()self.tableWidget.setVerticalHeaderItem(0, item)item = QtWidgets.QTableWidgetItem()self.tableWidget.setVerticalHeaderItem(1, item)item = QtWidgets.QTableWidgetItem()self.tableWidget.setVerticalHeaderItem(2, item)item = QtWidgets.QTableWidgetItem()self.tableWidget.setVerticalHeaderItem(3, item)item = QtWidgets.QTableWidgetItem()self.tableWidget.setVerticalHeaderItem(4, item)item = QtWidgets.QTableWidgetItem()self.tableWidget.setVerticalHeaderItem(5, item)item = QtWidgets.QTableWidgetItem()self.tableWidget.setVerticalHeaderItem(6, item)item = QtWidgets.QTableWidgetItem()self.tableWidget.setHorizontalHeaderItem(0, item)item = QtWidgets.QTableWidgetItem()self.tableWidget.setHorizontalHeaderItem(1, item)item = QtWidgets.QTableWidgetItem()self.tableWidget.setItem(0, 0, item)item = QtWidgets.QTableWidgetItem()self.tableWidget.setItem(0, 1, item)item = QtWidgets.QTableWidgetItem()self.tableWidget.setItem(1, 0, item)item = QtWidgets.QTableWidgetItem()self.tableWidget.setItem(1, 1, item)item = QtWidgets.QTableWidgetItem()self.tableWidget.setItem(2, 0, item)item = QtWidgets.QTableWidgetItem()self.tableWidget.setItem(2, 1, item)item = QtWidgets.QTableWidgetItem()self.tableWidget.setItem(3, 0, item)self.pushButton = QtWidgets.QPushButton(self.centralwidget)self.pushButton.setGeometry(QtCore.QRect(460, 290, 101, 51))self.pushButton.setObjectName("pushButton")self.tableWidget_2 = QtWidgets.QTableWidget(self.centralwidget)self.tableWidget_2.setGeometry(QtCore.QRect(10, 360, 331, 121))self.tableWidget_2.setObjectName("tableWidget_2")self.tableWidget_2.setColumnCount(2)self.tableWidget_2.setRowCount(1)item = QtWidgets.QTableWidgetItem()self.tableWidget_2.setVerticalHeaderItem(0, item)item = QtWidgets.QTableWidgetItem()self.tableWidget_2.setHorizontalHeaderItem(0, item)item = QtWidgets.QTableWidgetItem()self.tableWidget_2.setHorizontalHeaderItem(1, item)item = QtWidgets.QTableWidgetItem()self.tableWidget_2.setItem(0, 0, item)item = QtWidgets.QTableWidgetItem()self.tableWidget_2.setItem(0, 1, item)self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_2.setGeometry(QtCore.QRect(460, 360, 101, 61))self.pushButton_2.setObjectName("pushButton_2")self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_3.setGeometry(QtCore.QRect(460, 220, 101, 51))self.pushButton_3.setObjectName("pushButton_3")self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_4.setGeometry(QtCore.QRect(460, 440, 101, 61))self.pushButton_4.setObjectName("pushButton_4")self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_5.setGeometry(QtCore.QRect(460, 120, 91, 61))self.pushButton_5.setObjectName("pushButton_5")MainWindow.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))self.menubar.setObjectName("menubar")MainWindow.setMenuBar(self.menubar)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "主界面"))item = self.tableWidget.verticalHeaderItem(0)item.setText(_translate("MainWindow", "1"))item = self.tableWidget.verticalHeaderItem(1)item.setText(_translate("MainWindow", "2"))item = self.tableWidget.verticalHeaderItem(2)item.setText(_translate("MainWindow", "3"))item = self.tableWidget.verticalHeaderItem(3)item.setText(_translate("MainWindow", "4"))item = self.tableWidget.verticalHeaderItem(4)item.setText(_translate("MainWindow", "5"))item = self.tableWidget.verticalHeaderItem(5)item.setText(_translate("MainWindow", "6"))item = self.tableWidget.verticalHeaderItem(6)item.setText(_translate("MainWindow", "7"))item = self.tableWidget.horizontalHeaderItem(0)item.setText(_translate("MainWindow", "id"))item = self.tableWidget.horizontalHeaderItem(1)item.setText(_translate("MainWindow", "name"))__sortingEnabled = self.tableWidget.isSortingEnabled()self.tableWidget.setSortingEnabled(False)self.tableWidget.setSortingEnabled(__sortingEnabled)self.pushButton.setText(_translate("MainWindow", "添加数据"))item = self.tableWidget_2.verticalHeaderItem(0)item.setText(_translate("MainWindow", "1"))item = self.tableWidget_2.horizontalHeaderItem(0)item.setText(_translate("MainWindow", "id"))item = self.tableWidget_2.horizontalHeaderItem(1)item.setText(_translate("MainWindow", "name"))__sortingEnabled = self.tableWidget_2.isSortingEnabled()self.tableWidget_2.setSortingEnabled(False)self.tableWidget_2.setSortingEnabled(__sortingEnabled)self.pushButton_2.setText(_translate("MainWindow", "显示数据"))self.pushButton_3.setText(_translate("MainWindow", "删除数据"))self.pushButton_4.setText(_translate("MainWindow", " 修改数据"))self.pushButton_5.setText(_translate("MainWindow", "清空页面"))self.pushButton.clicked.connect(self.add) # 添加self.pushButton_2.clicked.connect(self.show) # 显示self.pushButton_3.clicked.connect(self.delete) # 删除self.pushButton_4.clicked.connect(self.modify) # 修改self.pushButton_5.clicked.connect(self.clear) # 清空# 添加函数def add(self):conn = pymysql.connect(host='127.0.0.1',user='root',password='root',port=3309,db='wlw',cursorclass=pymysql.cursors.DictCursor)cur = conn.cursor()print("进入成功1")id = self.tableWidget_2.item(0, 0).text()# 将输入用的表的第0行第0列的所输入在上面的数据赋值给id变量(计算机默认从0开始)name = self.tableWidget_2.item(0, 1).text() # 将第0行第1列所输入的数据赋值给namesql = "INSERT INTO t1 (id,name) VALUES ('{}','{}')".format(id, name)# insert into添加的数据即为赋值后id和name的值cur.execute(sql) # 执行SQL语句mit() # 即mit,上传有效数据self.clear() # 执行自定义的清空函数# self.show() # 执行自定义的显示当前数据库数据的函数# show显示函数def show(self):conn = pymysql.connect(host='127.0.0.1',user='root',password='root',port=3309,db='wlw',cursorclass=pymysql.cursors.DictCursor)cur = conn.cursor()print("进入成功2")sql = "select * from t1"cur.execute(sql)data = cur.fetchall() # 获取到的数据以元组的形式赋值给dataprint(data) # 查看数据是什么类型list_data = [] # 存id和name值all_id = [0, 0, 0, 0] # 接收idall_name = [0, 0, 0, 0] # 接收name# 接收到的数据长度(返回的数据是键值对)是多少就执行多少次,提取多少次for x in range(0, len(data)):all_id[x] = data[x].get('id') # data[x]获取每一个键值对,获取后提取每一个键值对的id值all_name[x] = data[x].get('name') # 同上逻辑list_data.append(all_id[x]) # 把数据添加到一个元组,分别操作数据time.sleep(0.3)# 延时有没有无所谓list_data.append(all_name[x])print(list_data) # 输出数据,查看是否符合num_id = 0num_name = 1for i in range(len(data)): # 遍历# for j in range(len(data[i])):for j in range(2):# 设置idif j == 0:one_item = QtWidgets.QTableWidgetItem(str(list_data[num_id]))num_id += 2self.tableWidget.setItem(i, j, one_item)# 设置nameelse:two_item = QtWidgets.QTableWidgetItem(str(list_data[num_name]))num_name += 2self.tableWidget.setItem(i, j, two_item)# item = QtWidgets.QTableWidgetItem(str(data[i][j]))# self.tableWidget.insertRow(int(self.tableWidget.rowCount()))# self.tableWidget.setItem(i, j, item)# for的嵌套循环,依次在表的每个格中输出数据def delete(self):conn = pymysql.connect(host='127.0.0.1',user='root',password='root',port=3309,db='wlw',cursorclass=pymysql.cursors.DictCursor)cur = conn.cursor()print("进入成功3")id = self.tableWidget_2.item(0, 0).text() # 只输入需删除行的id值即可sql = "delete from t1 where id=" + id # 删除work1表中指定id的列cur.execute(sql)mit()self.clear()# self.show() # 自动更新,清空后全显def modify(self):conn = pymysql.connect(host='127.0.0.1',user='root',password='root',port=3309,db='wlw',cursorclass=pymysql.cursors.DictCursor)print("进入成功4")cur = conn.cursor()id = self.tableWidget_2.item(0, 0).text()name = self.tableWidget_2.item(0, 1).text()sql = "update t1 set name=" + name + " where id=" + id # 修改指定id的那一行的name列的值cur.execute(sql)mit()self.clear()# self.show()def clear(self):self.tableWidget.clear() # 清空第一个表格的数据self.tableWidget_2.clear() # 清空第二个表格的数据class Ui_MainWindow2(object):def setupUi(self, MainWindow2):MainWindow2.setObjectName("登录界面")MainWindow2.resize(708, 761)MainWindow2.setStyleSheet("")self.centralwidget = QtWidgets.QWidget(MainWindow2)self.centralwidget.setStyleSheet("background-image: url(./3.jpg);")self.centralwidget.setObjectName("centralwidget")self.pushButton = QtWidgets.QPushButton(self.centralwidget)self.pushButton.setGeometry(QtCore.QRect(540, 540, 131, 51))self.pushButton.setStyleSheet("font: 9pt \"造字工房悦黑体验版细体\";\n""image: url(:/ico/login.ico);\n""background-color: CornflowerBlack;\n""color: CornflowerBlack;")self.pushButton.setObjectName("pushButton")self.pushButton.setIcon(QIcon(QPixmap("login.ico")))self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_2.setGeometry(QtCore.QRect(540, 610, 131, 51))self.pushButton_2.setStyleSheet("font: 9pt \"造字工房悦黑体验版细体\";\n""image: url(:/ico/exit.ico);\n""color: CornflowerBlack\n""background-color: CornflowerBlack;")self.pushButton_2.setObjectName("pushButton_2")self.pushButton_2.setIcon(QIcon(QPixmap("exit.ico")))self.label = QtWidgets.QLabel(self.centralwidget)self.label.setGeometry(QtCore.QRect(450, 389, 51, 31))self.label.setStyleSheet("font: 9pt \"造字工房悦黑体验版细体\";\n""color: CornflowerBlack;")self.label.setObjectName("label")self.label_2 = QtWidgets.QLabel(self.centralwidget)self.label_2.setGeometry(QtCore.QRect(460, 440, 41, 21))self.label_2.setStyleSheet("font: 9pt \"造字工房悦黑体验版细体\";\n""color: CornflowerBlack;")self.label_2.setObjectName("label_2")self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit.setGeometry(QtCore.QRect(510, 390, 181, 31))self.lineEdit.setStyleSheet("color: CornflowerBlack")self.lineEdit.setObjectName("lineEdit")self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_2.setGeometry(QtCore.QRect(510, 430, 181, 31))self.lineEdit_2.setStyleSheet("color: CornflowerBlack")self.lineEdit_2.setObjectName("lineEdit_2")self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password)self.lineEdit_2.setValidator(QtGui.QIntValidator(10000000, 99999999))""""""self.radioButton = QtWidgets.QRadioButton(self.centralwidget)self.radioButton.setGeometry(QtCore.QRect(480, 480, 81, 19))self.radioButton.setStyleSheet("color: CornflowerBlack\n""font: 9pt \"造字工房悦黑体验版细体\";")self.radioButton.setObjectName("radioButton")self.radioButton.setChecked(True)MainWindow2.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(MainWindow2)self.menubar.setGeometry(QtCore.QRect(0, 0, 708, 26))self.menubar.setObjectName("menubar")MainWindow2.setMenuBar(self.menubar)self.statusbar = QtWidgets.QStatusBar(MainWindow2)self.statusbar.setObjectName("statusbar")MainWindow2.setStatusBar(self.statusbar)self.retranslateUi(MainWindow2)self.pushButton.clicked.connect(self.login)self.pushButton_2.clicked.connect(MainWindow2.close)self.radioButton.toggled.connect(self.select)QtCore.QMetaObject.connectSlotsByName(MainWindow2)QtCore.QMetaObject.connectSlotsByName(MainWindow2)def one_two_ui(self):name = self.lineEdit.text()passwd = self.lineEdit_2.text()if str(name) == '123456' and str(passwd) == '000000':MainWindow.show()else:QMessageBox.information(MainWindow2, "错误", "用户名或者密码不正确")print(name, passwd)def login(self):name = self.lineEdit.text()passwd = self.lineEdit_2.text()if str(name) == '123456' and str(passwd) == '000000':MainWindow.show()MainWindow2.hide()else:QMessageBox.information(MainWindow2, "错误", "用户名或者密码不正确")print(name, passwd)def select(self):if self.radioButton.isChecked():QMessageBox.information(MainWindow2,"提示","您选择的是 管理员 登录",QMessageBox.Ok)def retranslateUi(self, MainWindow2):_translate = QtCore.QCoreApplication.translateMainWindow2.setWindowTitle(_translate("MainWindow", "登录界面"))self.pushButton.setText(_translate("MainWindow", "登录"))self.pushButton_2.setText(_translate("MainWindow", "退出"))self.label.setText(_translate("MainWindow", "用户名"))self.label_2.setText(_translate("MainWindow", "密码"))self.radioButton.setText(_translate("MainWindow", "管理员"))if __name__ == '__main__':app2 = QtWidgets.QApplication(sys.argv)MainWindow2 = QtWidgets.QMainWindow()ui2 = Ui_MainWindow2()ui2.setupUi(MainWindow2)MainWindow2.show()MainWindow = QMainWindow()ui = Ui_MainWindow()ui.setupUi(MainWindow)sys.exit(app2.exec_())

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。