奇怪的数据库设计

开发项目:校运会管理系统
开发环境:pycharm,mysql workbench,desinger
数据库:mysql8.0
开发py库:pyqt5,pymysql,pandas,time,os,os.path,openpyxl,sys
库的安装命令:pip install 库名

一.pyqt5与desinger

1.1建立一个新界面

ui文件转换为py文件:pyuic5 -o login.py login.ui
构建一个空白页面

1.2控件

可用控件

(1)显示控件。

  Lable:文本标签,显示文本,可以用来标记控件。

  Text Browser:显示文本控件。用于后台命令执行结果显示。

(2)输入控件,提供与用户输入交互

  Line Edit:单行文本框,输入单行字符串。控件对象常用函数为Text() 返回文本框内容,用于获取输入。setText() 用于设置文本框显示。

  Text Edit:多行文本框,输入多行字符串。控件 对象常用函数同Line Edit控件。

Combo Box:下拉框列表。用于输入指定枚举值。

(3)控件按钮,供用户选择与执行

    Push Button:命令按钮。常见的确认、取消、关闭等按钮就是这个控件。clicked信号一定要记住。clicked信号就是指鼠标左键按下然后释放时会发送信号,从而触发相应操作。

    Radio Button:单选框按钮。

    Check Box:多选框按钮。

在这里插入图片描述
pytqt5库:QApplication, QMainWindow, QMessageBox, QInputDialog, QFileDialog

1.3较为特殊的table Widget(即展示表格图形)

在这里插入图片描述
在pycahrm中使用这个按键,需要pyqt5的QHeaderView, QTableWidgetItem库

前情设置:
一.关于table widget的选中
1.禁止修改操作操作,让表格对用户是只读的,可以添加如下代码。
self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)

2.表格默认选中的是单个单元格。通过下面代码可以设置成选中整行。添加代码如下
self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)

3.其他
QAbstractItemView.SelectColumns 选中1列
QAbstractItemView.SelectRows 选中1行
QAbstractItemView.SelectItems 选中1个单元格

二.设置表格头的伸缩模式,也就是让表格铺满整个QTableWidget控件
self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

三.行、列标题的显示与隐藏。
对于列标题的显示或隐藏设置,可以通过添加如下代码实现。默认是显示的。
self.tableWidget.horizontalHeader().setVisible(False)

.设置表格标题字体加粗。添加代码如下:
font = self.tableWidget.horizontalHeader().font()
font.setBold(True)
self.tableWidget.horizontalHeader().setFont(font)

QTableWidget常用方法:
setROwCount(int row) 设置QTableWidget表格控件的行数

setColumnCount(int col) 设置QTableWidget表格控件的列数

setHorizontalHeaderLabels() 设置QTableWidget表格控件的水平标签

setVerticalHeaderLabels() 设置QTableWidget表格控件的垂直标签

setItem(int ,int ,QTableWidgetItem) 在QTableWidget表格控件的每个选项的单元控件内添加控件

horizontalHeader() 获得QTableWidget表格控件的表格头,以便执行隐藏

rowCount() 获得QTableWidget表格控件的行数

columnCount() 获得QTableWidget表格控件的列数

setEditTriggers(EditTriggers triggers) 设置表格是否可以编辑,设置表格的枚举值

setSelectionBehavior 设置表格的选择行为

setTextAlignment() 设置单元格内文本的对齐方式

setSpan(int row,int column,int rowSpanCount,int columnSpanCount) 合并单元格,要改变单元格的第row行,column列,要合并rowSpancount行数和columnSpanCount列数。其中row表示要改变的行数, column表示要改变的列数,rowSpanCount表示需要合并的行数,columnSpanCount表示需要合并的列数。

setShowGrid() 在默认情况下表格的显示是有网格的,可以设置True或False用于是否显示,默认True

setColumnWidth(int column,int width) 设置单元格行的宽度

setRowHeight(int row,int height) 设置单元格列的高度

奇淫技巧:
1.获取table widget某一行文本

row_count = self.tableWidget1.currentRow()#当前选中行
id = self.tableWidget1.item(row_count, 1).text()#第一列
name = self.tableWidget1.item(row_count, 2).text()#第二列

2.给table widget添加新值

x = list(r)
row = self.tableWidget1.rowCount()#获取当前行数
self.tableWidget1.insertRow(row)#添加新行
for j in range(len(x)):
    de = QTableWidgetItem(str(x[j]))#转换格式
    self.tableWidget1.setItem(row(行), j(列), de(数据))#载入表格

3.删除table widget的数据

row_count = self.tableWidget1.currentRow()#获取选中行
self.tableWidget1.removeRow(row_count)#删除选中行

1.4其他奇淫技巧

1.Combox Box
如何在代码用文本控制选项

comboBox = QtWidgets.QComboBox(Form)
comboBox.setGeometry(QtCore.QRect(480, 30, 81, 21))#设置按键位置
comboBox.setObjectName("comboBox")
o_path = os.getcwd()+"\\"+"years"+"\\"+"年份.txt"#文本路径
op = open(self.o_path, 'r', encoding="utf-8")
nu = -1
for i in self.op.readlines():
    comboBox.addItem("")
    nu = self.nu + 1
op.close()
o_path = os.getcwd()+"\\"+"years"+"\\"+"年份.txt"
op = open(self.o_path, 'r', encoding="utf-8")
year = []
for i in op.readlines():
    year.append(i)
for z in range(nu + 1):
    comboBox.setItemText(z, _translate("Form", self.year[-1 - z]))#设置可选项
op.close()

结果如下
在这里插入图片描述
2.本地文件选择与excle文件的读取(pandas库)
在这里插入图片描述

在这里插入图片描述

//打开文件
   try:
        Book = self.lineEdit.text()#获取图1的输入框的文本
        if Book != "":
            self.team = pd.read_excel(Book)#使用pandas打开excle文件
        else:
            Book, ok = QFileDialog.getOpenFileName(self, "一个文件", "C:/", "All Files(*);;Text Files(*.txt)")#可以选择所有类型的文件
            if ok and Book:
                self.team = pd.read_excel(Book)
        self.lineEdit.setText(Book)
    except ValueError:
        QMessageBox.about(self, "", "目前只能使用excle文件")
    except FileNotFoundError:
        QMessageBox.about(self, "", "找不到此路径")
//读取excle文件
 for i in range(len(self.team.index.values) - 1):
	 x=list(self.team.loc[i].values)#将excle的第i行作为数组返回

写入excle文件(openpyxl库)

self.work=Workbook()#打开一个文本对象
self.ws = self.work.active#激活文本对象,并赋值给ws,ws作为数组获取
self.ws.append(["学院编号","运动员" ,"项目编号", "成绩","排名"])
for i in self.resultq:
    self.a=list(i)
    self.ws.append(self.a)#添加一行数据
self.er=os.getcwd()+"\\"+self.x+".xlsx"#保存路径
self.work.save(filename=self.er)#保存
#设置单元格的值,设置row=1,column=1的值等于6(测试可知openpyxl的行和列编号从1开始计算),设置B1等于7
#self.ws.cell(row=1, column=1).value = 6
#self.ws.cell("B1").value = 7

二.pymysql与mysql

可用方法:
连接对象并非cursor对象
commit() 提交
rollback() 回滚

cursor用来执行命令的方法:
callproc(self, procname, args) 用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
execute(self, query, args) 执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
executemany(self, query, args) 执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
nextset(self) 移动到下一个结果集

cursor用来接收返回值的方法:

fetchall(self) 接收全部的返回结果行.
fetchmany(self, size=None) 接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.
fetchone(self) 返回一条结果行.
rowcount 这是一个只读属性,并返回执行execute() 方法后影响的行数。
scroll(self, value, mode=‘relative’) 移动指针到某一行; 如果mode=‘relative’,则表示从当前所在行移动value条,如果 mode=‘absolute’,则表示从结果集的第一行移动value条.

import pymysql

config = {
    'host': '127.0.0.1',#服务器ip,可用局域网ip
    'port': 3306,#端口
    'user': 'root',
    'passwd': 'root',
    'charset':'utf8mb4',#此处的utf8无横杠“-”
    }
conn = pymysql.connect(**config)#链接数据库
conn.autocommit(1)
cursor = conn.cursor()#设置一个cursor可操作对象

try:
    # 创建数据库
    DB_NAME = 'test'
    cursor.execute('DROP DATABASE IF EXISTS %s' %DB_NAME)
    cursor.execute('CREATE DATABASE IF NOT EXISTS %s' %DB_NAME)
    conn.select_db(DB_NAME)

    #创建表
    TABLE_NAME = 'user'
    cursor.execute('CREATE TABLE %s(id int primary key,name varchar(30))' %TABLE_NAME)

    # 批量插入纪录
    values = []
    for i in range(20):
        values.append((i,'kk'+str(i)))
    cursor.executemany('INSERT INTO user values(%s,%s)',values)

    # 查询数据条目
    count = cursor.execute('SELECT * FROM %s' %TABLE_NAME)
    print 'total records:', cursor.rowcount

    # 获取表名信息
    desc = cursor.description
    print "%s %3s" % (desc[0][0], desc[1][0])

    cursor.scroll(10,mode='absolute')
    results = cursor.fetchall()
    for result in results:
        print result

except:
    import traceback
    traceback.print_exc()
    # 发生错误时会滚
    conn.rollback()
finally:
    # 关闭游标连接
    cursor.close()
    # 关闭数据库连接
    conn.close()

mysql

mysql workbench
添加数据到表
在这里插入图片描述
添加的excle数据需要另存为csv文件,再通过记事本打开另存为,即可令数据变为utf-8编码
在这里插入图片描述
在这里插入图片描述
数据处理完成

关于角色问题:(此处的操作需在mysql命令行上运行)
由于mysql8.0的角色需要激活才可以将其权限交于其他用户使用
要确定当前会话中哪些角色处于活动状态,请使用该 CURRENT_ROLE()功能。
使用SELECT CURRENT_ROLE();语句查询激活情况
正常情况下显示为:

激活role的方式:
1、使用set default role 命令 (非永久激活)

SET DEFAULT ROLE ALL TO 用户;
退出,重新登录
SELECT CURRENT_ROLE();

2、 (永久激活)
要在用户连接到服务器时自动激活所有显式授权和强制角色,请启用activate_all_roles_on_login 系统变量。

SET global activate_all_roles_on_login=ON;

默认情况下,禁用自动角色激活。

参考文章:
1.Python连接MySQL数据库 - conanwang - 博客园.
2. pyqt中的QTableWidget 用法总结(获取行数、列数、指针、内容等)_春风若是你的博客-CSDN博客.
3.PyQt5.QtWidgets.QTableWidgetItem||QtableWidget结构与用法_漫步量化-CSDN博客.
4.pyqt - 标签 - 锅边糊 - 博客园.
查看MySQL数据库地址、端口、服务器属性命令 - 东耳听风 - 博客园.
5. mysql 角色(role)管理功能实现、创建role,role权限赋值、激活(基于mysql8.0)_finerain-CSDN博客_mysql role.
6. pyqt5程序打包成exe文件的步骤和遇到的坑,以及如何更改exe的图标_j_starry的博客-CSDN博客_pyqt打包成exe.
7.Python操作Excel之xlsx文件_python_脚本之家.
8.PyQt5 技巧篇-参数控制窗体右上角只显示关闭按钮实例演示_小蓝枣的博客-CSDN博客.
9.[ PyQt入门教程 ] PyQt5中数据表格控件QTableWidget使用方法 - 锅边糊 - 博客园.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值