def deleteRows(self, listSelect): """Слот удаляет выделенные записи. В качестве параметра получает список выделенных строк таблицы.""" setDelete = set() # Множество удаляемых записей print(f"Количество удаляемых записей = {len(listSelect)}") for i in listSelect: print(f"Выбранный ряд:{i.row()}") print(self.content[i.row()]) setDelete.add(str(self.content[i.row()][0])) #print(setDelete) if setDelete: deleteSQL = "DELETE FROM {} WHERE {} in ({})".format( self.getNameMainTable()[0], self.getFieldPrimaryKey(), ','.join(setDelete)) #print(deleteSQL) connect = getConnection() try: cursor = connect.cursor() try: cursor.execute(deleteSQL) except IntegrityError as e: print(e.args) connect.commit() finally: connect.close() self.resetData()
def fillContent(self, query): connection = getConnection() cursor = connection.cursor() cursor.execute(query) row = cursor.fetchone() while row is not None: self.content[row['id']] = row['value'] row = cursor.fetchone() connection.close()
def setSlaveTable(self, name_table): """ Установка названия подчиненной таблицы. Кроме того определяется названия поля, являющегося первичным ключом подчиненной таблицы""" indexSQL = 'SHOW INDEX FROM {} WHERE Key_name="PRIMARY"'.format( name_table) connect = getConnection() cursor = connect.cursor() cursor.execute(indexSQL) row = cursor.fetchone() self.slave_index = row['Column_name']
def paint(self, painter, option, index): painter.save() if (index.data()) and (not (index.data() == 'None')): SqlSelect = self._SqlSelectSlaveRecord.format(index.data()) #print(SqlSelect) connect = getConnection() cursor = connect.cursor() cursor.execute(SqlSelect) row = cursor.fetchone() connect.close() painter.drawText(option.rect, Qt.AlignCenter, str(self._function_view(row))) painter.restore()
def paint(self, painter, option, index): painter.save() if (index.data()) and (not (index.data() == 'None')) and (self._primary_key): connect = getConnection() cursor = connect.cursor() selectSQL = self._query + " WHERE {} = {}".format( '.'.join(self._primary_key), index.data()) #print(f"selectSQL={selectSQL}") cursor.execute(selectSQL) row = cursor.fetchone() connect.close() painter.drawText(option.rect, Qt.AlignCenter, str(self._function_view(row))) painter.restore()
def __init__(self, parent, name_table, function_view): """ В конструктор передаются имя подчиенной таблицы и функция над связанной записью в подчиненной таблице""" self._function_view = function_view self._name_slave_table = name_table indexSQL = 'SHOW INDEX FROM {} WHERE Key_name="PRIMARY"'.format( name_table) connect = getConnection() cursor = connect.cursor() cursor.execute(indexSQL) row = cursor.fetchone() slave_index = row['Column_name'] connect.close() self._SqlSelectSlaveRecord = "SELECT * FROM {} WHERE {} = {{}}".format( self._name_slave_table, slave_index) super().__init__(parent)
def createTable(self): connect = getConnection() self.query = "SELECT id_number, name_net, number FROM numbers" tableQuery = QTableWidget() try: cursor=connect.cursor() numberRows = cursor.execute(self.query) tableQuery.setRowCount(numberRows) tableQuery.setColumnCount(3) content = cursor.fetchall() for i in range(len(content)): for j in range(len(content[i])): #print(content[i][j]) tableQuery.setItem(i,j,QTableWidgetItem(str(list(content[i].values())[j]))) tableQuery.setHorizontalHeaderLabels(("№", "Сеть", "Номер")) finally: connect.close() return tableQuery
def setQuery(self, query): """Заголовки таблицы будут содержать имена полей запроса или их псевдонимы """ self.query = query self.tableQuery.clear() connect = getConnection() try: cursor=connect.cursor() numberRows = cursor.execute(self.query) descQuery = cursor.description # Здесь сохраняем описание полей запроса numberCols = len(descQuery) self.tableQuery.setRowCount(numberRows) self.tableQuery.setColumnCount(numberCols) content = cursor.fetchall() for i in range(len(content)): for j in range(len(content[i])): self.tableQuery.setItem(i,j,QTableWidgetItem(str(list(content[i].values())[j]))) self.tableQuery.setHorizontalHeaderLabels([field[0] for field in descQuery]) finally: connect.close()
def fill_content(self): self.content.clear() self.content[0] = '-----' con = getConnection() strSQL = "SELECT * FROM {}".format(self.tb_name) cursor = con.cursor() result = 0 try: cursor.execute(strSQL) row = cursor.fetchone() while row is not None: result += 1 self.content[row[list(row.keys())[0]]] = row[self.fd_name] row = cursor.fetchone() except: QMessageBox.critical( None, "Сообщение об ошибке", "Ошибка при выполнении запроса\n{}".format(strSQL)) con.close() #print(self.content) return result
def setQuery(self, strSQL): """ Метод принимает запрос к базе данных. Поле `content` заполняется результатами выполнения запроса. Поле `namesColumn` заполняется названиями полей запроса. Запрос записывается в поле `query`""" super().beginResetModel() self.query = strSQL connect = getConnection() try: cursor = connect.cursor() cursor.execute(self.query) finally: connect.close() #print(self.query) # Заполнение списка названий колонок таблицы. # Определяется по значению параметра `as` из SQL-запроса self.namesColumn.clear() for i in range(len(cursor.description)): self.namesColumn.append(cursor.description[i][0]) self.fillSavedFields(self.getNameMainTable()) # Заполнения поля content экземпляра класса. self.content.clear() row = cursor.fetchone() while row is not None: list_value = list(row.values()) result_value = [ ] # Список значений одной записи результатов запроса for result in list_value: if isinstance( result, date ): # Если тип данных datetime, то преобразовать их в строку result_value.append(str(result)) else: result_value.append(result) self.content.append(result_value) #self.content.append(list(row.values())) #print(self.content) row = cursor.fetchone() super().endResetModel()
def createFilterWidgets(self, layout): """Создание виджетов панели фильтрации. Виджеты создаются на основе содержимого fieldFilters""" if not self.fieldFilters: return #listLabels = [] self.listWidgets = [] for itemFilter in self.fieldFilters: print(itemFilter) layout.addWidget(QLabel(itemFilter[1])) if itemFilter[2] == "QComboBox": comboBox = QComboBox() comboBox.setObjectName("comboBox_"+itemFilter[0]) comboBox.addItem('') self.listWidgets.append(comboBox) layout.addWidget(comboBox) connect = getConnection() try: cursor=connect.cursor() cursor.execute(itemFilter[4]) result_row = cursor.fetchone() #print("result_row = ", result_row) while result_row is not None: comboBox.addItem(list(result_row.values())[0]) result_row = cursor.fetchone() finally: connect.close() comboBox.currentIndexChanged.connect(self.setFilter)#lambda:self.setFilter(comboBox.currentText())) elif itemFilter[2] == 'QLineEdit': lineEdit = QLineEdit() lineEdit.setObjectName("lineEdit_"+itemFilter[0]) layout.addWidget(lineEdit) lineEdit.editingFinished.connect(self.setFilter)#lambda:self.setFilter(lineEdit.text())) self.listWidgets.append(lineEdit) elif itemFilter[2] == 'value': self.listWidgets.append(str(itemFilter[4])) return
if __name__ == '__main__': parser = createParser() namespace = parser.parse_args(sys.argv[1:]) print("Выбрана команда {}".format(namespace.command)) print(namespace) if namespace.table == 't': if namespace.command == 'create': adminConnect = mysqlconnector.getAdminConnection() init_servtables(adminConnect) if namespace.command == 'delete': delete_servtables() if namespace.command == 'create' and namespace.table == 'numbers': if namespace.bd == 'mysql': connect = mysqlconnector.getConnection() elif namespace.bd == 'sqlite3': connect = mysqlconnector.getConnectionLite() init_table_numbers(namespace.begin, namespace.end, namespace.net, connect) if namespace.command == 'create' and namespace.table == 'phones': if namespace.bd == 'mysql': connect = mysqlconnector.getConnection() elif namespace.bd == 'sqlite3': connect = mysqlconnector.getConnectionLite() dict_parametrs = { } # Словарь в котором содержатся данные полученные из ключей командной строки if namespace.pid: dict_parametrs['product_number'] = namespace.pid if namespace.iid: dict_parametrs['inv_number'] = namespace.iid
def saveData(self): """Метод сохраняет содержимое модели в таблицу базы данных. для этого используется SQL-оператор, определяемый в переменной updateSQL """ if not self.savedFields: print("Нечего сохранять") return #print("modifiedIndexes={}".format(self.modifiedIndexes)) updateSQL = "UPDATE {} SET {} WHERE {}" insertSQL = "INSERT {} SET {}" connect = getConnection() try: print(f"Сохраняемые строки:{self.modifiedIndexes}") for record in self.modifiedIndexes: list_for_str = [] name_main_table = self.getNameMainTable() for i in self.savedFields: #(self.fillSavedFields(name_main_table)[1:]): value = self.content[record][i] #[0]] if (i == 0) and (not value): continue if (value == None) or (value == 'None'): #print(f"from saveData - {i}; value = {value}") # Если подчиенная запись не выбрана, то соответствующее поле заполняем значением NULL value = 'NULL' elif isinstance(value, tuple): # Если сохраняемые данные представляют собой tuple, значит это данные из подчиненной таблицы # тогда сохраняем только первичный ключ записи подчиненной таблицы value = value[0] else: value = "'{}'".format(value) list_for_str.append("{} = {}".format( self.savedFields[i], value)) #list_for_str.append("{} = {}".format(i[1], value)) if self.content[record][0]: SQL = updateSQL.format( name_main_table[0], ", ".join(list_for_str), "{}={}".format(self.getFieldPrimaryKey(), self.content[record][0])) else: SQL = insertSQL.format(name_main_table[0], ", ".join(list_for_str)) print(SQL) cursor = connect.cursor() ignoreExec = False successExec = False # Переменная содержит результат выполнения SQL-запроса (успешно, неуспешно) while (not successExec) and (not ignoreExec): try: cursor.execute(SQL) except IntegrityError as e: print(e.args) resDialog = QMessageBox.critical( None, "Ошибка", f"Ошибка\n{e.args}", QMessageBox.Retry | QMessageBox.Ignore) print(f"resDialog = {resDialog}") if resDialog == QMessageBox.Ignore: ignoreExec = True else: successExec = True connect.commit() finally: connect.close() self.modifiedIndexes.clear()