以下是一段python代码和一段mysql代码(mysql代码没有问题),当我在对mysql数据库中的表的元组执行删除操作时,会弹窗提示删除行时发生错误(1064, "You have an error in your SQL syntax;check the manual that corresponds to yourMySQL server version for the right syntax touse near "删除,1' at line 1"),并且无法完成对数据库的修改。不知道怎么进行修改
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5 import Qt
import pymysql
class DeleteWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
screen_x = 960
screen_y = 500
self.resize(screen_x, screen_y)
self.setWindowTitle('删除窗口')
center_point = QDesktopWidget().availableGeometry().center()
self.move(center_point.x() - int(screen_x / 2), center_point.y() - int(screen_y / 2))
self.setWindowIcon(QIcon('image.png'))
layout = QVBoxLayout()
label = QLabel('删除系统')
label.setFont(QFont('微软雅黑', 24))
label.setAlignment(Qt.Qt.AlignCenter)
TableStudent = QPushButton('删除学生表')
TableStudent.setFixedSize(500, 30)
TableTeacher = QPushButton('删除教师表')
TableTeacher.setFixedSize(500, 30)
TableDirector = QPushButton('删除教研主任表')
TableDirector.setFixedSize(500, 30)
TableCourse = QPushButton('删除课程表')
TableCourse.setFixedSize(500, 30)
TableExperiment = QPushButton('删除实验表')
TableExperiment.setFixedSize(500, 30)
TableEcompletion = QPushButton('删除实验完成情况表')
TableEcompletion.setFixedSize(500, 30)
TableScourse = QPushButton('删除学生选课表')
TableScourse.setFixedSize(500, 30)
TableTcourse = QPushButton('删除教师授课表')
TableTcourse.setFixedSize(500, 30)
TableStudent.clicked.connect(lambda: self.showTable('student'))
TableTeacher.clicked.connect(lambda: self.showTable('teacher'))
TableDirector.clicked.connect(lambda: self.showTable('director'))
TableCourse.clicked.connect(lambda: self.showTable('course'))
TableExperiment.clicked.connect(lambda: self.showTable('experiment'))
TableEcompletion.clicked.connect(lambda: self.showTable('e_completion'))
TableScourse.clicked.connect(lambda: self.showTable('sc'))
TableTcourse.clicked.connect(lambda: self.showTable('t_course'))
layout.addWidget(label)
layout.addStretch(1)
layout.addWidget(TableStudent)
layout.addSpacing(20)
layout.addWidget(TableTeacher)
layout.addSpacing(20)
layout.addWidget(TableDirector)
layout.addSpacing(20)
layout.addWidget(TableCourse)
layout.addSpacing(20)
layout.addWidget(TableExperiment)
layout.addSpacing(20)
layout.addWidget(TableEcompletion)
layout.addSpacing(20)
layout.addWidget(TableScourse)
layout.addSpacing(20)
layout.addWidget(TableTcourse)
layout.addStretch(1)
layout.setAlignment(Qt.Qt.AlignCenter)
self.setLayout(layout)
def showTable(self, TargetTable):
conn = pymysql.connect(
host='localhost',
user='root',
password='123456',
database='experiment_report_system',
port=3306
)
cursor = conn.cursor()
select_sql = f"SELECT * FROM {TargetTable};"
cursor.execute(select_sql)
column_names = [i[0] for i in cursor.description]
rows = cursor.fetchall()
cursor.close()
conn.close()
table_window = QDialog(self)
table_window.setWindowTitle(f'{TargetTable} 删除结果')
table_window.setFixedSize(800, 600)
table_model = QStandardItemModel()
table_model.setHorizontalHeaderLabels(['删除行'] + column_names)
for i, row in enumerate(rows):
items = []
for j, cell in enumerate(row):
item = QStandardItem(str(cell))
items.append(item)
delete_item = QStandardItem('删除')
delete_item.setData(i) # 设置数据为行号
delete_item.setTextAlignment(Qt.Qt.AlignCenter)
items.insert(0, delete_item)
table_model.appendRow(items)
table_view = QTableView()
table_view.setModel(table_model)
# 添加槽函数,点击删除按钮删除对应行数据
table_view.clicked.connect(lambda index: self.deleteRow(index, TargetTable))
layout = QVBoxLayout()
layout.addWidget(table_view)
table_window.setLayout(layout)
table_window.exec_()
def deleteRow(self, index, table_name):
# 获取行号
row = index.data()
# 检查点击的单元格是否为“删除”单元格
if index.column() == 0 and row is not None:
# 弹出确认删除的对话框
reply = QMessageBox.question(self, '确认删除', '确认删除该行数据吗?', QMessageBox.Yes | QMessageBox.No,
QMessageBox.No)
if reply == QMessageBox.Yes:
conn = pymysql.connect(
host='localhost',
user='root',
password='123456',
database='experiment_report_system',
port=3306
)
try:
cursor = conn.cursor()
select_sql = f"SHOW KEYS FROM `{table_name}` WHERE Key_name = 'PRIMARY'"
cursor.execute(select_sql)
primary_key = cursor.fetchone()[4]
select_sql = f"SELECT `{primary_key}` FROM `{table_name}` LIMIT %s, 1"
cursor.execute(select_sql, (row,))
primary_key_value = cursor.fetchone()[0]
delete_query = f"DELETE FROM `{table_name}` WHERE `{primary_key}` = '{primary_key_value}'"
cursor.execute(delete_query)
conn.commit() # 提交对数据库的修改
QMessageBox.information(self, '删除成功', '行删除成功。')
except Exception as e:
QMessageBox.warning(self, '删除错误', f'删除行时发生错误:\n{str(e)}')
finally:
cursor.close()
conn.close()
create database experiment_report_system;
create table student(
sno char(10) primary key,
sname char(10),
sage int ,
ssex enum('男','女')not null,
sclass char(20)not null);
create table teacher(
tno char(10) primary key,
tname char(10),
tage int ,
tsex enum('男','女')not null);
CREATE TABLE director (
dno CHAR(10) PRIMARY KEY,
dname CHAR(10),
password CHAR(10),
permission ENUM('t', 's', 'c', 'ts', 'tc', 'sc', 'tsc') NOT NULL
);
create table course(
cno char(10) primary key,
cname char(20),
ctime int,
ccredit double );
create table experiment(
eno char(10) primary key,
ename char(20),
eendtime char(10),
ecredit int,
estandard char(20),
cno char(10),
foreign key(cno) references course(cno));
create table e_completion(
eno char(10),
sno char(10),
content char(50),
s_score int,
primary key(eno,sno) ,
foreign key(eno) references experiment(eno),
foreign key(sno) references student(sno)););
CREATE TABLE sc (
cno CHAR(10),
sno CHAR(10),
PRIMARY KEY(cno, sno)
);
create table t_course (
cno char(10),
m_tno char (10),
s_tno char(10),
class char(20),
primary key(cno,m_tno,s_tno),
foreign key(m_tno) references teacher(tno),
foreign key(cno) references course(cno),
foreign key(s_tno) references teacher(tno));
-- 向student表中插入数据
INSERT INTO student(sno, sname, sage, ssex, sclass) VALUES
('S001', '张三', 20, '男', '计科01班'),
('S002', '李四', 21, '男', '计科02班'),
('S003', '王五', 19, '女', '计科03班'),
('S004', '赵六', 22, '女', '计科01班'),
('S005', '刘七', 20, '男', '计科02班');
-- 向teacher表中插入数据
INSERT INTO teacher(tno, tname, tage, tsex) VALUES
('T001', '张老师', 35, '男'),
('T002', '李老师', 40, '女'),
('T003', '王老师', 30, '男');
-- 向director表中插入数据
INSERT INTO director(dno, dname, password, permission) VALUES
('D001', '张主任', '123456', 'tsc'),
('D002', '李主任', '654321', 'ts'),
('D003', '王主任', 'abcdef', 'sc');
-- 向course表中插入数据
INSERT INTO course(cno, cname, ctime, ccredit) VALUES
('C001', 'Java程序设计', 64, 4.0),
('C002', '操作系统原理', 56, 3.5),
('C003', '计算机网络', 56, 3.5),
('C004', '数据结构与算法', 64, 4.0),
('C005', '数据库系统原理', 56, 3.5);
-- 向experiment表中插入数据
INSERT INTO experiment(eno, ename, eendtime, ecredit, estandard, cno) VALUES
('E001', 'Java程序设计实验', '2023-06-10', 2, '看心情打分', 'C001'),
('E002', '操作系统原理实验', '2023-06-20', 1, '看天气打分', 'C002'),
('E003', '计算机网络实验', '2023-06-15', 2, '用randint函数打分', 'C003'),
('E004', '数据结构与算法实验', '2023-06-25', 2, '闭着眼睛打分', 'C004'),
('E005', '数据库系统原理实验', '2023-06-30', 1, '让学生自己打分', 'C005');
-- 向e_completion表中插入数据
INSERT INTO e_completion(eno, sno, content, s_score) VALUES
('E001', 'S001', '完成了实验任务', 90),
('E001', 'S002', '未完成实验任务', 0),
('E001', 'S003', '完成了实验任务', 85),
('E002', 'S001', '完成了实验任务', 95),
('E002', 'S004', '完成了实验任务', 88),
('E003', 'S002', '完成了实验任务', 92),
('E003', 'S004', '未完成实验任务', 0),
('E004', 'S003', '完成了实验任务', 80),
('E004', 'S005', '完成了实验任务', 75),
('E005', 'S001', '完成了实验任务', 98),
('E005', 'S003', '完成了实验任务', 95);
-- 向sc表中插入数据
INSERT INTO sc(cno, sno) VALUES
('C001', 'S001'),
('C001', 'S002'),
('C002', 'S001'),
('C002', 'S004'),
('C003', 'S002'),
('C004', 'S003'),
('C004', 'S005'),
('C005', 'S001'),
('C005', 'S003');
-- 向t_course表中插入数据
INSERT INTO t_course(cno, m_tno, s_tno, class) VALUES
('C001', 'T001', 'T002', '计科01班'),
('C002', 'T002', 'T003', '计科02班'),
('C003', 'T001', 'T003', '计科03班'),
('C004', 'T002', 'T001', '计科01班'),
('C005', 'T003', 'T001', '计科02班');
line137 row = index.data() → row = index.row()
Sql打印出来看看是不是有语法错误
调整代码如下:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5 import Qt
import pymysql
class DeleteWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
screen_x = 960
screen_y = 500
self.resize(screen_x, screen_y)
self.setWindowTitle('删除窗口')
center_point = QDesktopWidget().availableGeometry().center()
self.move(center_point.x() - int(screen_x / 2), center_point.y() - int(screen_y / 2))
self.setWindowIcon(QIcon('image.png'))
layout = QVBoxLayout()
label = QLabel('删除系统')
label.setFont(QFont('微软雅黑', 24))
label.setAlignment(Qt.Qt.AlignCenter)
TableStudent = QPushButton('删除学生表')
TableStudent.setFixedSize(500, 30)
TableTeacher = QPushButton('删除教师表')
TableTeacher.setFixedSize(500, 30)
TableDirector = QPushButton('删除教研主任表')
TableDirector.setFixedSize(500, 30)
TableCourse = QPushButton('删除课程表')
TableCourse.setFixedSize(500, 30)
TableExperiment = QPushButton('删除实验表')
TableExperiment.setFixedSize(500, 30)
TableEcompletion = QPushButton('删除实验完成情况表')
TableEcompletion.setFixedSize(500, 30)
TableScourse = QPushButton('删除学生选课表')
TableScourse.setFixedSize(500, 30)
TableTcourse = QPushButton('删除教师授课表')
TableTcourse.setFixedSize(500, 30)
TableStudent.clicked.connect(lambda: self.showTable('student'))
TableTeacher.clicked.connect(lambda: self.showTable('teacher'))
TableDirector.clicked.connect(lambda: self.showTable('director'))
TableCourse.clicked.connect(lambda: self.showTable('course'))
TableExperiment.clicked.connect(lambda: self.showTable('experiment'))
TableEcompletion.clicked.connect(lambda: self.showTable('e_completion'))
TableScourse.clicked.connect(lambda: self.showTable('sc'))
TableTcourse.clicked.connect(lambda: self.showTable('t_course'))
layout.addWidget(label)
layout.addStretch(1)
layout.addWidget(TableStudent)
layout.addSpacing(20)
layout.addWidget(TableTeacher)
layout.addSpacing(20)
layout.addWidget(TableDirector)
layout.addSpacing(20)
layout.addWidget(TableCourse)
layout.addSpacing(20)
layout.addWidget(TableExperiment)
layout.addSpacing(20)
layout.addWidget(TableEcompletion)
layout.addSpacing(20)
layout.addWidget(TableScourse)
layout.addSpacing(20)
layout.addWidget(TableTcourse)
layout.addStretch(1)
layout.setAlignment(Qt.Qt.AlignCenter)
self.setLayout(layout)
def showTable(self, TargetTable):
conn = pymysql.connect(
host='10.0.118.35',
user='root',
password='Gg@202209',
database='experiment_report_system',
port=3306
)
cursor = conn.cursor()
select_sql = f"SELECT * FROM {TargetTable};"
cursor.execute(select_sql)
column_names = [i[0] for i in cursor.description]
rows = cursor.fetchall()
cursor.close()
conn.close()
table_window = QDialog(self)
table_window.setWindowTitle(f'{TargetTable} 删除结果')
table_window.setFixedSize(800, 600)
table_model = QStandardItemModel()
table_model.setHorizontalHeaderLabels(['删除行'] + column_names)
for i, row in enumerate(rows):
items = []
for j, cell in enumerate(row):
item = QStandardItem(str(cell))
items.append(item)
delete_item = QStandardItem('删除')
delete_item.setData(i) # 设置数据为行号
delete_item.setTextAlignment(Qt.Qt.AlignCenter)
items.insert(0, delete_item)
table_model.appendRow(items)
table_view = QTableView()
table_view.setModel(table_model)
# 添加槽函数,点击删除按钮删除对应行数据
table_view.clicked.connect(lambda index: self.deleteRow(index, TargetTable))
layout = QVBoxLayout()
layout.addWidget(table_view)
table_window.setLayout(layout)
table_window.exec_()
def deleteRow(self, index, table_name):
# 获取行号
# row = index.data()
row = index.row() # 调整
# 检查点击的单元格是否为“删除”单元格
if index.column() == 0 and row is not None:
# 弹出确认删除的对话框
reply = QMessageBox.question(self, '确认删除', '确认删除该行数据吗?', QMessageBox.Yes | QMessageBox.No,
QMessageBox.No)
if reply == QMessageBox.Yes:
conn = pymysql.connect(
host='10.0.118.35',
user='root',
password='Gg@202209',
database='experiment_report_system',
port=3306
)
try:
cursor = conn.cursor()
select_sql = f"SHOW KEYS FROM `{table_name}` WHERE Key_name = 'PRIMARY'"
cursor.execute(select_sql)
primary_key = cursor.fetchone()[4]
select_sql = f"SELECT `{primary_key}` FROM `{table_name}` LIMIT %s, 1"
cursor.execute(select_sql, (row,))
primary_key_value = cursor.fetchone()[0]
# delete_query = f"DELETE FROM `{table_name}` WHERE `{primary_key}` = '{primary_key_value}'"
delete_query = f"DELETE FROM `{table_name}` WHERE `{primary_key}` = \"{primary_key_value}\""
cursor.execute(delete_query)
conn.commit() # 提交对数据库的修改
QMessageBox.information(self, '删除成功', '行删除成功。')
except Exception as e:
QMessageBox.warning(self, '删除错误', f'删除行时发生错误:\n{str(e)}')
finally:
cursor.close()
conn.close()
if __name__ == '__main__':
app = QApplication(sys.argv)
delete_window = DeleteWindow()
delete_window.show()
sys.exit(app.exec_())
删除student表数据时会有一个新的错误提示: